tangning 4 giorni fa
parent
commit
4f9bbc6d16

+ 1 - 1
.env.development

@@ -6,7 +6,7 @@ VITE_PUBLIC_PATH = ./
 
 # Cross-domain proxy, you can configure multiple
 # Please note that no line breaks
-VITE_PROXY = [["/qjkankan","https://test.4dkankan.com/qjkankan"],["/takelook","https://v4-test.4dkankan.com/takelook"],["/upload","https://v4-uat.4dkankan.com/service/manage/common/upload/files"],["/service","https://testeur.4dkankan.com/service"],["/ucenter","https://testeur.4dkankan.com/ucenter"]]
+VITE_PROXY = [["/qjkankan","https://test.4dkankan.com/qjkankan"],["/takelook","https://v4-test.4dkankan.com/takelook"],["/upload","https://v4-uat.4dkankan.com/service/manage/common/upload/files"],["/service","https://v4-uat.4dkankan.com/service"],["/ucenter","https://v4-uat.4dkankan.com/ucenter"]]
 # VITE_PROXY=[["/api","https://vvbin.cn/test"]]
 
 # Delete console

+ 12 - 9
src/App.vue

@@ -29,19 +29,22 @@
   .ant-input-textarea-clear-icon {
     margin: 8px 2px 0 0 !important;
   }
-  .ant-table-row-cell-break-word:empty:after {
-    content: '-';
-  }
-  .ant-table-cell:empty:after {
-    content: '-';
-  }
-  .ant-table-cell span:empty:after {
-    content: '-';
-  }
+  // .ant-table-row-cell-break-word:empty:after {
+  //   content: '-';
+  // }
+  // .ant-table-cell:empty:after {
+  //   content: '-';
+  // }
+  // .ant-table-cell span:empty:after {
+  //   content: '-';
+  // }
 
   .ant-table-row-indent {
     &:after {
       content: '' !important;
     }
   }
+  .ant-badge span:empty:after {
+    content: '' !important;
+  }
 </style>

+ 0 - 1
src/api/account/index.ts

@@ -188,7 +188,6 @@ export const cameraAllType = (params: PageParams) =>
       ignoreCancelToken: true,
     },
   });
-
 //wifi前缀字典
 export const wifiPrefixAll = (params: PageParams) =>
   defHttp.get<userList>({

+ 56 - 0
src/api/operate/index.ts

@@ -37,9 +37,12 @@ enum Api {
   sceneMove = '/service/manage/scene/move',
   sceneRestStore = '/service/manage/scene/restStore',
   sceneDelete = '/service/manage/scene/delete',
+  setFeedbackOption = '/service/manage/scene/setFeedbackOption',
   qjsceneDelete = '/service/manage/overall/delete',
   sceneDownload = '/service/manage/scene/downScene',
   sceneCopy = '/service/manage/scene/copy',
+  reDelScene = '/service/manage/scene/reDelScene',
+  getDelScene = '/service/manage/scene/getDelScene',
   checkDownLoad = '/service/manage/scene/checkDownLoad',
   downOfflinePage = '/service/manage/overall/downOfflinePage/',
   downloadProcess = '/service/manage/scene/downloadProcess',
@@ -67,6 +70,7 @@ enum Api {
   scoreAug = '/service/manage/feedback/scoreAug',
   feedbackList = '/service/manage/feedback/list',
   feedbackOptionList = '/service/manage/feedbackOption/list',
+  feedbackOptionTypeList = '/service/manage/feedbackOption/getTypeList',
   getAllByTypeId = '/service/manage/feedback/h5/getAllByTypeId/',
   feedbackOptiondelete = '/service/manage/feedbackOption/delete',
   feedbackOptionAdd = '/service/manage/feedbackOption/add',
@@ -76,6 +80,7 @@ enum Api {
   getInfo = '/service/manage/mqQueueConfig/getInfo',
   updateModelingLevel = '/service/manage/mqQueueConfig/updateModelingLevel',
   downTemplate = '/service/manage/feedback/export',
+  getSceneBuildLog = '/service/manage/scene/getSceneBuildLog/',
 }
 
 /**
@@ -422,6 +427,16 @@ export const sceneDelete = (params: sceneControlParams) =>
       ignoreCancelToken: true,
     },
   });
+export const setFeedbackOption = (params) =>
+  defHttp.post<Result>({
+    url: Api.setFeedbackOption,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
 
 export const qjsceneDelete = (params: overallDelete) =>
   defHttp.post<Result>({
@@ -474,6 +489,27 @@ export const downloadProcess = (params: sceneControlParams) =>
       ignoreCancelToken: true,
     },
   });
+export const getDelScene = (params) =>
+  defHttp.post<sceneDownloadResult>({
+    url: Api.getDelScene,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const reDelScene = (params: sceneControlParams) =>
+  defHttp.post<Result>({
+    url: Api.reDelScene,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
 export const sceneCopy = (params: sceneControlParams) =>
   defHttp.post<Result>({
     url: Api.sceneCopy,
@@ -613,6 +649,16 @@ export const getAllByTypeId = (typeId) =>
       ignoreCancelToken: true,
     },
   });
+export const feedbackOptionTypeList = (params) =>
+  defHttp.get<Result>({
+    url: Api.feedbackOptionTypeList,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
 export const feedbackOptionList = (params) =>
   defHttp.post<Result>({
     url: Api.feedbackOptionList,
@@ -687,3 +733,13 @@ export function companyUploadExcel(
     params,
   );
 }
+
+export const getSceneBuildLog = (num) =>
+  defHttp.get<Result>({
+    url: Api.getSceneBuildLog + num,
+    params: {},
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });

+ 10 - 0
src/views/account/details/data.ts

@@ -494,6 +494,16 @@ export const equitySearchForm: Partial<FormProps> = {
             value: '总经办',
             key: '总经办',
           },
+          {
+            label: '考古',
+            value: '考古',
+            key: '考古',
+          },
+          {
+            label: '不可移动文物保护事业部',
+            value: '不可移动文物保护事业部',
+            key: '不可移动文物保护事业部',
+          },
         ],
       },
     },

+ 10 - 0
src/views/account/overview/data.tsx

@@ -310,6 +310,16 @@ export const Addschemas: FormSchema[] = [
           value: '总经办',
           key: '总经办',
         },
+        {
+          label: '考古',
+          value: '考古',
+          key: '考古',
+        },
+        {
+          label: '不可移动文物保护事业部',
+          value: '不可移动文物保护事业部',
+          key: '不可移动文物保护事业部',
+        },
       ],
     },
   },

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

@@ -156,6 +156,11 @@
           width: 120,
         },
         {
+          title: '应用行业',
+          dataIndex: 'feedbackOptionName',
+          width: 120,
+        },
+        {
           title: '激活时间',
           dataIndex: 'activatedTime',
           width: 180,

+ 23 - 0
src/views/device/putModal.vue

@@ -23,6 +23,7 @@
   import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
   import { useMessage } from '/@/hooks/web/useMessage';
   import { cameraAllType } from '/@/api/account';
+  import { feedbackOptionList } from '/@/api/operate';
   import { cameraIn, updateCameraType } from '/@/api/device';
   import { companyUploadExcel, downTemplate } from '/@/api/customer';
   import { useI18n } from '/@/hooks/web/useI18n';
@@ -136,6 +137,28 @@
             options: [],
           },
         },
+
+        {
+          field: 'feedbackOptionId',
+          component: 'ApiSelect',
+          label: '设备类型',
+          required: true,
+          colProps: {
+            xl: 18,
+            xxl: 18,
+          },
+          componentProps: {
+            api: feedbackOptionList,
+            numberToString: false,
+            labelField: 'nameCn',
+            resultField: 'list',
+            valueField: 'id',
+            listHeight: 140,
+            immediate: true,
+            params: { typeId: 1, pageSize: 9999, pageNum: 1 },
+            onChange: (val) => {},
+          },
+        },
       ];
       const [
         registerForm,

+ 17 - 7
src/views/empower/camera.vue

@@ -129,13 +129,13 @@
           dataIndex: 'machineCode',
           width: 120,
         },
-        // {
-        //   title: '设备名称',
-        //   ellipsis: true,
-        //   slots: { customRender: 'copy' },
-        //   dataIndex: 'machineName',
-        //   width: 120,
-        // },
+        {
+          title: '算法授权码',
+          ellipsis: true,
+          slots: { customRender: 'copy' },
+          dataIndex: 'modelAuthCode',
+          width: 120,
+        },
         {
           title: '相机授权Key',
           ellipsis: true,
@@ -297,6 +297,16 @@
                   value: '总经办',
                   key: '总经办',
                 },
+                {
+                  label: '考古',
+                  value: '考古',
+                  key: '考古',
+                },
+                {
+                  label: '不可移动文物保护事业部',
+                  value: '不可移动文物保护事业部',
+                  key: '不可移动文物保护事业部',
+                },
               ],
             },
           },

+ 20 - 0
src/views/empower/data.ts

@@ -109,6 +109,16 @@ export const newAddschemas: FormSchema[] = [
           value: '总经办',
           key: '总经办',
         },
+        {
+          label: '考古',
+          value: '考古',
+          key: '考古',
+        },
+        {
+          label: '不可移动文物保护事业部',
+          value: '不可移动文物保护事业部',
+          key: '不可移动文物保护事业部',
+        },
       ],
     },
   },
@@ -395,6 +405,16 @@ export const newApiAddschemas: FormSchema[] = [
           value: '总经办',
           key: '总经办',
         },
+        {
+          label: '考古',
+          value: '考古',
+          key: '考古',
+        },
+        {
+          label: '不可移动文物保护事业部',
+          value: '不可移动文物保护事业部',
+          key: '不可移动文物保护事业部',
+        },
       ],
     },
   },

+ 26 - 0
src/views/operate/components/case/addModal.vue

@@ -26,6 +26,7 @@
   import { caseaddOrUpdateApi } from '/@/api/operate';
   import { useI18n } from '/@/hooks/web/useI18n';
   import { Tinymce } from '/@/components/Tinymce/index';
+  import { feedbackOptionList } from '/@/api/operate';
   const { t } = useI18n();
   export default defineComponent({
     components: { BasicModal, BasicForm },
@@ -121,6 +122,11 @@
                 value: 'property',
                 key: 'property',
               },
+              {
+                label: '其他',
+                value: 'other',
+                key: 'other',
+              },
             ],
           },
           colProps: {
@@ -225,6 +231,26 @@
           },
         },
         {
+          field: 'feedbackOptionIds',
+          component: 'ApiSelect',
+          label: '场景分类',
+          componentProps: {
+            placeholder: '请选择场景分类',
+            mode: 'multiple',
+            api: feedbackOptionList,
+            numberToString: false,
+            labelField: 'nameCn',
+            resultField: 'list',
+            valueField: 'id',
+            listHeight: 140,
+            immediate: true,
+            params: { typeId: 1, pageSize: 9999, pageNum: 1 },
+          },
+          colProps: {
+            span: 22,
+          },
+        },
+        {
           field: 'sort',
           component: 'InputNumber',
           label: '排序',

+ 133 - 0
src/views/operate/components/config/addConfigModal.vue

@@ -0,0 +1,133 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    :title="fileFlow.title"
+    @visible-change="handleVisibleChange"
+    @cancel="resetFields"
+    height="600px"
+    @ok="handleSubmit"
+  >
+    <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, nextTick, onMounted, reactive, h } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { uploadApi } from '/@/api/product/index';
+  import { feedbackOptionDel, feedbackOptionAdd } from '/@/api/operate'
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { Tinymce } from '/@/components/Tinymce/index';
+  import { intercomMessageHandle } from '/@/api/operate'
+
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+      typeId: { type: Number },
+    },
+    emits: ['update', 'register'],
+    setup(props, { emit }) {
+      const modelRef = ref({});
+      const fileFlow = reactive({
+        title: '配置',
+        param: {},
+      })
+      const { createMessage } = useMessage();
+      const schemas: FormSchema[] = [
+        {
+          field: 'id',
+          component: 'Input',
+          show:false,
+          label: 'id',
+          required: false,
+        },
+        {
+          field: 'aiOption',
+          component: 'CheckboxGroup',
+          label: 'AI 识别配置:',
+          componentProps: {
+            options: [
+              { label: '通用识别', value: 0 },
+              { label: '文物病害', value: 1 },
+            ],
+          },
+          colProps: {
+            span: 24,
+          },
+        }
+      ];
+      const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
+        labelWidth: 120,
+        schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+      onMounted(() => {});
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        fileFlow.title = '配置';
+        fileFlow.param = data || {};
+        data && onDataReceive(data);
+      });
+      async function onDataReceive(data) {
+        console.log('data',data);
+        modelRef.value = data
+        resetFields();
+        setFieldsValue(data);
+      }
+      function NewTypeChange(val){
+        console.log('NewTypeChange',val)
+        updateSchema([
+          { field: 'content', ifShow:val == 2,},
+          { field: 'newsUrl', ifShow:val != 2,},
+        ])
+      } 
+      const handleSubmit = async () => {
+        const params = await validate();
+        const apiData = {
+          ...fileFlow.param,
+          ...params as any,
+          typeId: props.typeId,
+        }
+        let api = params.id ? feedbackOptionDel : feedbackOptionAdd
+        try {
+          await api(apiData);
+          closeModal();
+          resetFields();
+          createMessage.success(t('common.optSuccess'));
+          emit('update');
+        } catch (error) {
+          console.log('not passing', error);
+        }
+      };
+      function handleVisibleChange(v) {
+        v && props.userData && nextTick(() => onDataReceive(props.userData));
+      }
+      return {
+        register,
+        schemas,
+        registerForm,
+        model: modelRef,
+        fileFlow,
+        NewTypeChange,
+        handleVisibleChange,
+        handleSubmit,
+        addListFunc,
+        resetFields,
+        t,
+      };
+    },
+  });
+</script>

+ 25 - 2
src/views/operate/components/config/addModal.vue

@@ -39,6 +39,7 @@
       const modelRef = ref({});
       const fileFlow = reactive({
         title: '修改配置',
+        params: {},
       })
       const { createMessage } = useMessage();
       const schemas: FormSchema[] = [
@@ -73,6 +74,17 @@
             span: 22,
           },
         },
+        {
+          field: 'modelApi',
+          component: 'Input',
+          label: 'API地址',
+          componentProps: {
+            maxlength: 200,
+          },
+          colProps: {
+            span: 22,
+          },
+        },
       ];
       const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
         labelWidth: 120,
@@ -91,19 +103,30 @@
       async function onDataReceive(data) {
         console.log('data',data);
         modelRef.value = data
+        fileFlow.params = data || {};
         resetFields();
+        NewTypeChange(data.typeId)
         setFieldsValue(data);
       }
       function NewTypeChange(val){
         console.log('NewTypeChange',val)
+        let nameCnObj = {
+          4: '分类(中文)',
+          5: '模型名称',
+        }
+        let nameEnObj = {
+          4: '分类(英文)',
+        }
         updateSchema([
-          { field: 'content', ifShow:val == 2,},
-          { field: 'newsUrl', ifShow:val != 2,},
+          { field: 'modelApi', ifShow:val == 4, ifShow:val == 5,},
+          { field: 'nameEn', required:val<4,  label: nameEnObj[val] || '选项(英文)', ifShow:val != 5,},
+          { field: 'nameCn', required:val<4, label: nameCnObj[val] || '选项(中文)',},
         ])
       } 
       const handleSubmit = async () => {
         const params = await validate();
         const apiData = {
+          ...fileFlow.params,
           ...params as any,
           typeId: props.typeId,
         }

+ 54 - 10
src/views/operate/configuration.vue

@@ -2,9 +2,10 @@
   <PageWrapper contentBackground>
     <template #footer>
       <a-tabs v-model:activeKey="state" @change="changeTable">
-        <a-tab-pane :key="1" tab="所在行业" />
-        <a-tab-pane :key="2" tab="硬件产品" />
+        <a-tab-pane v-for="item in list" :key="item.id" :tab="item.name" />
+        <!-- <a-tab-pane :key="2" tab="硬件产品" />
         <a-tab-pane :key="3" tab="软件产品" />
+        <a-tab-pane :key="4" tab="场景分类" /> -->
       </a-tabs>
       <a-button style="position: absolute; right: 20px; top: 30px;" @click="router.go(-1)"> 返回 </a-button>
     </template>
@@ -16,11 +17,22 @@
             新增
           </a-button>
         </template>
+        <template #copy="{ text }">
+          <a @click="handleCopy(text)">
+            {{ text }}
+          </a>
+        </template>
         <template #action="{ record }">
           <TableAction
             stopButtonPropagation
             :actions="[
               {
+                label: '配置',
+                //icon: 'icon-park-outline:door-handle',
+                ifShow: getCheckPerm('configuration-config') && state == 4,
+                onClick: handleConfig.bind(null, record),
+              },
+              {
                 label: '编辑',
                 //icon: 'icon-park-outline:door-handle',
                 ifShow: getCheckPerm('configuration-edit'),
@@ -37,20 +49,23 @@
         </template>
       </BasicTable>
     </div>
-    <addconfigModal :typeId="state" @register="register" @update="reload" />
+    <addConfigModal :typeId="state" @register="registerConfig" @update="reload" />
+    <addModal :typeId="state" @register="register" @update="reload" />
   </PageWrapper>
 </template>
 <script lang="ts">
-  import { defineComponent, ref, h } from 'vue';
+  import { defineComponent, ref, h, onMounted } from 'vue';
   import { BasicTable, useTable, TableAction, FormProps } from '/@/components/Table';
   import { PageWrapper } from '/@/components/Page';
   import { Divider, Card, Empty, Descriptions, Steps, Tabs } from 'ant-design-vue';
-  import { getAllByTypeId, feedbackOptionList, feedbackOptiondelete } from '/@/api/operate';
+  import { getAllByTypeId, feedbackOptionTypeList, feedbackOptionList, feedbackOptiondelete } from '/@/api/operate';
   import { useI18n } from '/@/hooks/web/useI18n';
-  import addconfigModal from './components/config/addModal.vue';
+  import addConfigModal from './components/config/addConfigModal.vue';
+  import addModal from './components/config/addModal.vue';
   import { useModal } from '/@/components/Modal';
-  import { configurationSchema, refundTimeTableData } from './data';
+  import { configurationSchema, refundTimeTableData, configurationSchema1, configurationSchema2 } from './data';
   import { useMessage } from '/@/hooks/web/useMessage';
+  import { copyTextToClipboard } from '/@/hooks/web/useCopyToClipboard';
   import { useRouter } from 'vue-router';
   import { usePermissionStore } from '/@/store/modules/permission';
   export default defineComponent({
@@ -58,7 +73,8 @@
       BasicTable,
       PageWrapper,
       TableAction,
-      addconfigModal,
+      addConfigModal,
+      addModal,
       [Divider.name]: Divider,
       [Card.name]: Card,
       Empty,
@@ -73,10 +89,18 @@
       const { t } = useI18n();
       const router = useRouter();
       const [register, { openModal }] = useModal();
+      const [registerConfig, { openModal: openConfigModal }] = useModal();
       const permissionStore = usePermissionStore();
       const { getCheckPerm } = permissionStore;
       const { createMessage, createConfirm } = useMessage();
       const state = ref<number>(1); //未处理,0已处理(默认1)
+      const list = ref([{
+        name: '所在行业',
+        id: 1,
+      }]);
+      feedbackOptionTypeList({}).then((res) => {
+        list.value = res;
+      });
       const searchForm: Partial<FormProps> = {
         labelWidth: 100,
         autoSubmitOnEnter: true,
@@ -107,7 +131,7 @@
           },
         ],
       };
-      const [registerTimeTable, { reload }] = useTable({
+      const [registerTimeTable, { reload, setColumns }] = useTable({
         api: feedbackOptionList,
         // title: '',
         rowKey: 'id',
@@ -130,7 +154,7 @@
         // pagination: { pageSize: 20 },
         // scroll: { y: 300 },
         actionColumn: {
-          width: 100,
+          width: 130,
           title: '操作',
           // ifShow:state.value == 1,
           dataIndex: 'action',
@@ -139,6 +163,11 @@
       });
       function changeTable(val: string) {
         state.value = val;
+        let columnsObj  =  {
+          4: configurationSchema1,
+          5: configurationSchema2,
+        }
+        setColumns(columnsObj[val] || configurationSchema);
         reload();
       }
       async function handleWithdraw(record: Recordable) {
@@ -147,6 +176,13 @@
       function handleEidt(record) {
         openModal(true, record);
       }
+      function handleConfig(record) {
+        openConfigModal(true, record);
+      }
+      function handleCopy(str: string) {
+        copyTextToClipboard(str);
+        createMessage.success('复制成功');
+      }
       async function handleDelete(record: Recordable) {
         createConfirm({
           iconType: 'warning',
@@ -159,6 +195,10 @@
           },
         });
       }
+      onMounted(async () => {
+        let res = await feedbackOptionTypeList({});
+        console.log('feedbackOptionTypeList', res);
+      });
       return {
         registerTimeTable,
         handleWithdraw,
@@ -166,11 +206,15 @@
         state,
         reload,
         register,
+        registerConfig,
         openModal,
         getCheckPerm,
         handleEidt,
+        handleConfig,
         handleDelete,
+        handleCopy,
         router,
+        list,
       };
     },
   });

+ 53 - 0
src/views/operate/data.tsx

@@ -28,6 +28,7 @@ export const refundTimeTableSchema: BasicColumn[] = [
     customRender: ({ record }) => {
       return (
         <Badge
+          class="mr-2xxx"
           status={record.state == 1 ? 'warning' : 'success'}
           text={record.state == 1 ? '待处理' : '已处理'}
         />
@@ -52,6 +53,58 @@ export const configurationSchema: BasicColumn[] = [
     dataIndex: 'nameEn',
   },
 ];
+export const configurationSchema1: BasicColumn[] = [
+  {
+    title: '分类(中文)',
+    width: 320,
+    ellipsis: true,
+    dataIndex: 'nameCn',
+  },
+  {
+    title: '分类(英文)',
+    ellipsis: true,
+    width: 320,
+    dataIndex: 'nameEn',
+  },
+  {
+    title: '创建人',
+    width: 150,
+    ellipsis: true,
+    dataIndex: 'sysNickName',
+  },
+  {
+    title: '创建时间',
+    width: 150,
+    ellipsis: true,
+    dataIndex: 'createTime',
+  },
+];
+export const configurationSchema2: BasicColumn[] = [
+  {
+    title: '模型名称',
+    width: 320,
+    ellipsis: true,
+    dataIndex: 'nameCn',
+  },
+  {
+    title: 'API地址',
+    ellipsis: true,
+    slots: { customRender: 'copy' },
+    width: 320,
+    dataIndex: 'modelApi',
+  },
+  {
+    title: '创建人',
+    width: 150,
+    ellipsis: true,
+    dataIndex: 'sysNickName',
+  },
+  {
+    title: '创建时间',
+    width: 150,
+    dataIndex: 'createTime',
+  },
+];
 export const agentSchema: BasicColumn[] = [
   {
     title: '公司名称',

+ 236 - 0
src/views/operate/scencRecover.vue

@@ -0,0 +1,236 @@
+<template>
+  <div>
+    <BasicTable @register="registerTable" @editEnd="editEnd">
+      <template #toolbar>
+        <a-button type="primary" v-if="getCheckPerm('scencRecover-recover')" @click="hendleAddNew">
+          批量恢复</a-button
+        >
+      </template>
+      <template #action="{ record }">
+        <TableAction
+          stopButtonPropagation
+          :actions="[
+            {
+              label: '恢复',
+              ifShow: getCheckPerm('scencRecover-recover'),
+              onClick: hendleAddNew.bind(null, record),
+            },
+          ]"
+        />
+      </template>
+    </BasicTable>
+    <addRecruitModal @register="register" @update="reload" />
+  </div>
+</template>
+<script lang="ts">
+  import { defineComponent, h } from 'vue';
+  import {
+    BasicTable,
+    useTable,
+    TableAction,
+    BasicColumn,
+    TableImg,
+    FormProps,
+  } from '/@/components/Table';
+  import { PageWrapper } from '/@/components/Page';
+  import { Time } from '/@/components/Time';
+  import { getDelScene, reDelScene } from '/@/api/operate';
+  import { useModal } from '/@/components/Modal';
+  import { Descriptions } from 'ant-design-vue';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { Switch } from 'ant-design-vue';
+  import addRecruitModal from './components/recruit/addModal.vue';
+  import { usePermissionStore } from '/@/store/modules/permission';
+  export default defineComponent({
+    components: {
+      BasicTable,
+      TableAction,
+      PageWrapper,
+      TableImg,
+      addRecruitModal,
+      [Descriptions.name]: Descriptions,
+      [Descriptions.Item.name]: Descriptions.Item,
+    },
+    setup() {
+      const { t } = useI18n();
+      const { createMessage, createConfirm } = useMessage();
+      const permissionStore = usePermissionStore();
+      const { getCheckPerm } = permissionStore;
+      const [register, { openModal }] = useModal();
+      const columns: BasicColumn[] = [
+        {
+          title: '场景标题',
+          dataIndex: 'sceneName',
+          ellipsis: true,
+          width: 250,
+        },
+        {
+          title: '场景码',
+          dataIndex: 'num',
+          ellipsis: true,
+          width: 180,
+        },
+        {
+          title: 'SN码',
+          dataIndex: 'snCode',
+          width: 180,
+        },
+        {
+          title: '绑定账号',
+          dataIndex: 'userName',
+          width: 100,
+        },
+        {
+          title: '点位数量',
+          dataIndex: 'shootCount',
+          width: 80,
+        },
+        {
+          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: 'createTime',
+          sorter: true,
+          width: 180,
+          customRender: ({ record }) => {
+            return (
+              record.createTime &&
+              h(Time, {
+                value: record.createTime,
+                mode: 'datetime',
+              })
+            );
+          },
+        },
+        {
+          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: 'statusString',
+          width: 120,
+        },
+      ];
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 100,
+        autoSubmitOnEnter: true,
+        schemas: [
+          {
+            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,
+            },
+          },
+        ],
+      };
+      const [registerTable, { reload, getSelectRowKeys, clearSelectedRowKeys }] = useTable({
+        api: getDelScene,
+        title: '场景列表',
+        columns: columns,
+        useSearchForm: true,
+        rowSelection: { type: 'checkbox' },
+        formConfig: searchForm,
+        showTableSetting: true,
+        showIndexColumn: false,
+        rowKey: 'num',
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },
+        actionColumn: {
+          width: 100,
+          title: '操作',
+          dataIndex: 'action',
+          slots: { customRender: 'action' },
+        },
+        canResize: true,
+      });
+      function hendleAddNew(record) {
+        createConfirm({
+          iconType: 'warning',
+          title: '温馨提示',
+          content: '确定要恢复已删除场景吗?',
+          onOk: async () => {
+            let ids = [];
+            if (record && record.num) {
+              ids.push(record.num);
+            } else {
+              ids = getSelectRowKeys();
+            }
+            if (ids.length == 0) {
+              return createMessage.error('请选择恢复的场景');
+            }
+            await reDelScene({ numList: ids });
+            reload();
+            createMessage.success(t('common.optSuccess'));
+          },
+        });
+      }
+      return {
+        registerTable,
+        hendleAddNew,
+        reload,
+        register,
+        openModal,
+        getCheckPerm,
+      };
+    },
+  });
+</script>

+ 20 - 0
src/views/order/data.ts

@@ -148,6 +148,16 @@ export const localCameraForm: Partial<FormProps> = {
             value: '总经办',
             key: '总经办',
           },
+          {
+            label: '考古',
+            value: '考古',
+            key: '考古',
+          },
+          {
+            label: '不可移动文物保护事业部',
+            value: '不可移动文物保护事业部',
+            key: '不可移动文物保护事业部',
+          },
         ],
       },
     },
@@ -307,6 +317,16 @@ export const equitySearchForm: Partial<FormProps> = {
             value: '总经办',
             key: '总经办',
           },
+          {
+            label: '考古',
+            value: '考古',
+            key: '考古',
+          },
+          {
+            label: '不可移动文物保护事业部',
+            value: '不可移动文物保护事业部',
+            key: '不可移动文物保护事业部',
+          },
         ],
       },
     },

+ 26 - 0
src/views/productOperation/cameraScene.vue

@@ -65,6 +65,11 @@
             stopButtonPropagation
             :actions="[
               {
+                label: '设置',
+                ifShow: getTypeCheckPerm('scenes-settings'),
+                onClick: handleSettings.bind(null, record),
+              },
+              {
                 label: '迁移',
                 disabled: !(record.status == 1 || record.status == -2),
                 ifShow:
@@ -150,6 +155,10 @@
       @update="reload"
       @register="registerPriority"
     />
+    <settingsMoadl
+      @update="reload"
+      @register="registerSettings"
+    />
   </PageWrapper>
 </template>
 <script lang="ts">
@@ -166,6 +175,7 @@
   import { PageWrapper } from '/@/components/Page';
   import DownLoadModal from './modal/DownLoadModal.vue';
   import MoveModal from './modal/MoveModal.vue';
+  import settingsMoadl from './modal/settingsMoadl.vue';
   import priorityMoadl from './modal/priorityMoadl.vue';
   import { Time } from '/@/components/Time';
   import { Icon } from '/@/components/Icon';
@@ -184,6 +194,7 @@
     downloadProcess,
     sceneCopy,
     rebuildScene,
+    getSceneBuildLog,
   } from '/@/api/operate';
   import { message } from 'ant-design-vue';
   import { usePermissionStore } from '/@/store/modules/permission';
@@ -195,6 +206,7 @@
       DownLoadModal,
       MoveModal,
       BasicTable,
+      settingsMoadl,
       TableAction,
       priorityMoadl,
       PageWrapper,
@@ -234,6 +246,7 @@
         };
         console.log('取消下载', downloadOption.value);
       }
+      const [registerSettings, { openModal: openSettingsModal }] = useModal();
       const [registerPriority, { openModal: openPriorityModal }] = useModal();
       const [registerDownModal, { openModal: openDownModal, closeModal }] = useModal();
       const [registerMoveModal, { openModal: openMoveModal }] = useModal();
@@ -352,6 +365,12 @@
           },
         });
       }
+      function hanleDowm(num) {
+        getSceneBuildLog(num).then((res) => {
+           window.open(res);
+        })
+      }
+
       async function handleMove(record: Recordable) {
         openMoveModal(true, {
           num: record.num,
@@ -429,6 +448,10 @@
           }, 500);
         });
       }
+      function handleSettings(record: Recordable) {
+        console.log('handleSettings', record);
+        openSettingsModal(true, record)
+      }
       function getTypeCheckPerm(val) {
         let myType = tableType.value;
         return getCheckPerm(val) || getCheckPerm(`${val}-${myType}`);
@@ -461,6 +484,9 @@
         rowSelection,
         clearSelectedRowKeys,
         getCheckPerm,
+        hanleDowm,
+        handleSettings,
+        registerSettings,
         userName: props.userName,
       };
     },

+ 138 - 0
src/views/productOperation/modal/settingsMoadl.vue

@@ -0,0 +1,138 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    title="设置"
+    @visible-change="handleVisibleChange"
+    @cancel="resetFields"
+    @ok="handleSubmit"
+    :min-height="210"
+  >
+    <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, 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 { sceneMove } from '/@/api/operate';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { feedbackOptionList, setFeedbackOption } from '/@/api/operate';
+
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['update', 'register'],
+    setup(props, { emit }) {
+      console.log('props', props);
+      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: 'feedbackOptionId',
+          component: 'ApiSelect',
+          label: '场景分类',
+          required: true,
+          colProps: {
+            xl: 18,
+            xxl: 18,
+          },
+          componentProps: {
+            api: feedbackOptionList,
+            numberToString: false,
+            labelField: 'nameCn',
+            resultField: 'list',
+            valueField: 'id',
+            listHeight: 140,
+            immediate: true,
+            params: { typeId: 1, pageSize: 9999, pageNum: 1 },
+            onChange: (val) => {},
+          },
+        },
+      ];
+      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);
+      });
+
+      function onDataReceive(data) {
+        modelRef.value = data;
+        resetFields();
+        updateSchema({
+          field: 'type',
+          label: data.lable || '场景标题',
+          ifShow: !(data && data.numList && data.numList.length > 0),
+        });
+        setFieldsValue(data);
+      }
+      const handleSubmit = async () => {
+        try {
+          const params = await validate();
+          const res = await setFeedbackOption(params);
+          console.log('res', res);
+          closeModal();
+          resetFields();
+          let successNum = res && res.successNum || 0;
+          if( successNum == 0 ){
+            createMessage.error('场景迁移失败');
+          } else {
+            createMessage.success(
+            modelRef.value.num ? '场景迁移成功。' : `已迁移${successNum}个场景`,
+          );
+          }
+          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>