tangning 6 miesięcy temu
rodzic
commit
125c7e1eb6
37 zmienionych plików z 2898 dodań i 402 usunięć
  1. 42 0
      src/api/authorizeModeling/index.ts
  2. 31 11
      src/api/order/index.ts
  3. 11 0
      src/api/rtk/index.ts
  4. 8 1
      src/components/Form/src/components/FormItem.vue
  5. 1 1
      src/components/Upload/src/UploadModal.vue
  6. 0 1
      src/components/Upload/src/UploadPreviewModal.vue
  7. 8 3
      src/views/account/details/data.ts
  8. 1 1
      src/views/account/overview/AddDownModal.vue
  9. 2 2
      src/views/account/overview/AddModal.vue
  10. 22 0
      src/views/customer/modal/InfoModal.vue
  11. 30 30
      src/views/device/detailsMoadl.vue
  12. 115 65
      src/views/device/index.vue
  13. 123 23
      src/views/device/putModal.vue
  14. 253 0
      src/views/empower/apilist.vue
  15. 2 2
      src/views/empower/camera.vue
  16. 209 0
      src/views/empower/data.ts
  17. 180 0
      src/views/empower/differenceList.vue
  18. 1 1
      src/views/empower/install.vue
  19. 218 0
      src/views/empower/modal/api/AddApiModal.vue
  20. 43 3
      src/views/empower/AddCameraModal.vue
  21. 0 0
      src/views/empower/modal/camera/detailModel.vue
  22. 0 0
      src/views/empower/modal/camera/logListModal.vue
  23. 0 0
      src/views/empower/modal/camera/uploadModal.vue
  24. 189 0
      src/views/empower/modal/difference/AddModal.vue
  25. 149 0
      src/views/empower/modal/difference/logListModal.vue
  26. 2 1
      src/views/empower/AddInstallModal.vue
  27. 66 74
      src/views/invoice/EditModal.vue
  28. 92 106
      src/views/invoice/InvoiceModal.vue
  29. 53 57
      src/views/invoice/index.vue
  30. 561 0
      src/views/order/data.ts
  31. 124 0
      src/views/order/differenceList.vue
  32. 135 0
      src/views/order/localCameraList.vue
  33. 7 5
      src/views/productOperation/data.ts
  34. 154 0
      src/views/productOperation/modal/cutpriorityMoadl.vue
  35. 33 8
      src/views/productOperation/modal/priorityMoadl.vue
  36. 13 1
      src/views/productOperation/viewKankan.vue
  37. 20 6
      src/views/system/menu/index.vue

+ 42 - 0
src/api/authorizeModeling/index.ts

@@ -15,6 +15,10 @@ enum Api {
   authorizeCameradetail = '/service/manage/authorizeCamera/detail/',
   authorizeCameraupdateSnCode = '/service/manage/authorizeCamera/updateSnCode/',
   authorizeCamerasnUpdateLog = '/service/manage/authorizeCamera/snUpdateLog/',
+  authorizeOpenApilist = '/service/manage/authorizeOpenApi/list',
+  authorizeOpenApiadd = '/service/manage/authorizeOpenApi/add',
+  authorizeOpenApiupdate = '/service/manage/authorizeOpenApi/updateStatus',
+  authorizeOpenApidelete = '/service/manage/authorizeOpenApi/delete',
 }
 
 /**
@@ -163,3 +167,41 @@ export const authorizeCamerasnUpdateLog = (id) =>
       ignoreCancelToken: true,
     },
   });
+export const authorizeOpenApilist = (params) =>
+  defHttp.post({
+    url: Api.authorizeOpenApilist,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const authorizeOpenApiadd = (params) =>
+  defHttp.post({
+    url: Api.authorizeOpenApiadd,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const authorizeOpenApiupdate = (params) =>
+  defHttp.post({
+    url: Api.authorizeOpenApiupdate,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const authorizeOpenApidelete = (params) =>
+  defHttp.post({
+    url: Api.authorizeOpenApidelete,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });

+ 31 - 11
src/api/order/index.ts

@@ -21,6 +21,8 @@ enum Api {
   exportInvoice = '/service/manage/invoice/export',
   invoiceRegister = '/service/manage/invoice/invoiceRegister',
   getInvoiceRegisterDetail = '/service/manage/invoice/getInvoiceRegisterDetail',
+  authorizeRtkList = '/service/manage/authorizeRtk/authLog',
+  authorizeCameraList = '/service/manage/authorizeCamera/orderList',
 }
 
 /**
@@ -61,13 +63,13 @@ export const CameraExport = (params: PageParams) =>
   defHttp.downloadFile<FileStream>({
     url: Api.cameraExport,
     params: params,
-    fileName:'相机订单.xlsx',
+    fileName: '相机订单.xlsx',
     // data: params,
     headers: {
       // @ts-ignore
       ignoreCancelToken: true,
     },
-    responseType: 'blob'
+    responseType: 'blob',
   });
 
 /**
@@ -79,12 +81,12 @@ export const IncrementExport = (params: PageParams) =>
     url: Api.incrementExport,
     params: params,
     // data: params,
-    fileName:'权益订单.xlsx',
+    fileName: '权益订单.xlsx',
     headers: {
       // @ts-ignore
       ignoreCancelToken: true,
     },
-    responseType: 'blob'
+    responseType: 'blob',
   });
 
 export const IncrementList = (params: PageParams) =>
@@ -102,13 +104,13 @@ export const DownExport = (params: PageParams) =>
   defHttp.downloadFile<FileStream>({
     url: Api.downExport,
     params: params,
-    fileName:'下载订单.xlsx',
+    fileName: '下载订单.xlsx',
     // data: params,
     headers: {
       // @ts-ignore
       ignoreCancelToken: true,
     },
-    responseType: 'blob'
+    responseType: 'blob',
   });
 
 export const DownList = (params: PageParams) =>
@@ -134,14 +136,14 @@ export const InvoiceList = (params: PageParams) =>
 export const InvoiceExport = (params: PageParams) =>
   defHttp.downloadFile<FileStream>({
     url: Api.exportInvoice,
-    method:'POST',
+    method: 'POST',
     params,
-    fileName:'发票记录.xlsx',
+    fileName: '发票记录.xlsx',
     headers: {
       // @ts-ignore
       ignoreCancelToken: true,
     },
-    responseType: 'blob'
+    responseType: 'blob',
   });
 
 export const InvoiceDetail = (params: PageParams) =>
@@ -153,7 +155,7 @@ export const InvoiceDetail = (params: PageParams) =>
       ignoreCancelToken: true,
     },
   });
-  //上传文件
+//上传文件
 export function InvoiceRegister(
   params: UploadFileParams,
   onUploadProgress: (progressEvent: ProgressEvent) => void,
@@ -165,4 +167,22 @@ export function InvoiceRegister(
     },
     params,
   );
- }
+}
+export const authorizeRtkList = (params: PageParams) =>
+  defHttp.post<InvoiceListResul>({
+    url: Api.authorizeRtkList,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const authorizeCameraList = (params: PageParams) =>
+  defHttp.post<InvoiceListResul>({
+    url: Api.authorizeCameraList,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });

+ 11 - 0
src/api/rtk/index.ts

@@ -15,6 +15,7 @@ enum Api {
   rtkAccountsaveOrEdit = '/service/manage/rtkAccount/saveOrEdit',
   rtkAccountdel = '/service/manage/rtkAccount/del',
   rtkUseLogList = '/service/manage/rtkUseLog/list',
+  authorizeCameraList = '/service/manage/authorizeCamera/orderList',
 }
 /**
  * @description: Get sample list value
@@ -165,3 +166,13 @@ export const rtkUseLogList = (params: PageParams) =>
       ignoreCancelToken: true,
     },
   });
+export const authorizeCameraList = (params: PageParams) =>
+  defHttp.post<Result>({
+    url: Api.authorizeCameraList,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });

+ 8 - 1
src/components/Form/src/components/FormItem.vue

@@ -306,7 +306,14 @@
       }
 
       function renderItem() {
-        const { itemProps, slot, render, field, suffix, component } = props.schema;
+        const {
+          itemProps = { autoLink: false },
+          slot,
+          render,
+          field,
+          suffix,
+          component,
+        } = props.schema;
         const { labelCol, wrapperCol } = unref(itemLabelWidthProp);
         const { colon } = props.formProps;
 

+ 1 - 1
src/components/Upload/src/UploadModal.vue

@@ -254,7 +254,7 @@
           item.status = UploadResultStatus.SUCCESS;
 
           if (afterFetch && isFunction(afterFetch)) {
-            item.responseData = (await afterFetch(item)) || item;
+            item.responseData = (await afterFetch({...item, file: item.file})) || item;
           }
 
           return {

+ 0 - 1
src/components/Upload/src/UploadPreviewModal.vue

@@ -39,7 +39,6 @@
           fileListRef.value = value
             .filter((item) => !!item)
             .map((item) => {
-            console.log('uploadApiitem',item)
               return {
                 url: fileFlow?item.url:item,
                 type: fileFlow?'':item.split('.').pop() || '',

+ 8 - 3
src/views/account/details/data.ts

@@ -213,7 +213,7 @@ export const equityColumns: BasicColumn[] = [
     },
   },
   {
-    title: '终端客户名称',
+    title: '终端客户',
     dataIndex: 'endCustomer',
     width: 100,
   },
@@ -262,6 +262,9 @@ export const equityColumns: BasicColumn[] = [
     title: '付款状态',
     dataIndex: 'payStatus',
     // slots: { customRender: 'orderStatus' },
+    customRender: ({ record }) => {
+      return record.payStatus ? record.payStatus : '-';
+    },
     width: 80,
   },
   {
@@ -625,7 +628,7 @@ export const dowmColumns: BasicColumn[] = [
     width: 100,
   },
   {
-    title: '终端客户名称',
+    title: '终端客户',
     dataIndex: 'endCustomer',
     width: 100,
   },
@@ -676,8 +679,10 @@ export const dowmColumns: BasicColumn[] = [
   {
     title: '付款状态',
     dataIndex: 'payStatus',
-    // slots: { customRender: 'orderStatus' },
     width: 80,
+    customRender: ({ record }) => {
+      return record.payStatus ? record.payStatus : '-';
+    },
   },
   {
     title: '充值方式',

+ 1 - 1
src/views/account/overview/AddDownModal.vue

@@ -144,10 +144,10 @@
           { field: 'companyName', ifShow: value != '3' },
           { field: 'businessDept', ifShow: value != '3' },
           { field: 'businessName', ifShow: value != '3' },
-          { field: 'customerPayTime', ifShow: value != '3' },
           { field: 'customerName', ifShow: value != '3' },
           { field: 'customerType', ifShow: value != '3' },
           { field: 'endCustomer', ifShow: value != '3' },
+          { field: 'customerPayTime', required: value == '4' },
         ]);
       };
       async function handleConfirm() {

+ 2 - 2
src/views/account/overview/AddModal.vue

@@ -359,11 +359,11 @@
           { field: 'companyName', ifShow: value != '3' },
           { field: 'businessDept', ifShow: value != '3' },
           { field: 'businessName', ifShow: value != '3' },
-          { field: 'customerPayTime', ifShow: value != '3' },
           { field: 'customerName', ifShow: value != '3' },
           { field: 'customerType', ifShow: value != '3' },
           { field: 'endCustomer', ifShow: value != '3' },
-        ]);
+          { field: 'customerPayTime', required: value == '4' },
+          ]);
       };
       const handleSubmit = async () => {
         const submitUrl = AddUserIncrementApi;

+ 22 - 0
src/views/customer/modal/InfoModal.vue

@@ -128,6 +128,28 @@
           },
         },
         {
+          field: 'canUpWebsite',
+          component: 'RadioGroup',
+          label: '上传至四维看看',
+          defaultValue: 1,
+          required: true,
+          componentProps: {
+            options: [
+              {
+                label: '是',
+                value: 1,
+              },
+              {
+                label: '否',
+                value: 0,
+              },
+            ],
+          },
+          colProps: {
+            span: 22,
+          },
+        },
+        {
           field: 'topLogo',
           component: 'Divider',
           label: 'Logo信息',

+ 30 - 30
src/views/device/detailsMoadl.vue

@@ -6,7 +6,7 @@
     @visible-change="handleVisibleChange"
     @cancel="resetFields"
     @ok="handleSubmit"
-    :min-height="370"
+    :min-height="350"
   >
     <div class="pt-2px pr-3px">
       <BasicForm @register="registerForm" :model="model">
@@ -149,35 +149,35 @@
             },
           },
         },
-        {
-          field: 'orderSn',
-          component: 'AutoComplete',
-          label: '订单号',
-          colProps: {
-            span: 18,
-          },
-          componentProps: {
-            options: optionsOrderSn.value,
-            filterOption: onFilterOption,
-            onSearch: async (searchText: string) => {
-              const { list } = await CameraList({ orderSn: searchText });
-              optionsOrderSn.value = !searchText
-                ? []
-                : list.map((ele) => {
-                    return { value: ele.orderSn };
-                  });
-              updateSchema({
-                field: 'orderSn',
-                componentProps: {
-                  options: optionsOrderSn.value,
-                },
-              });
-            },
-            onChange: (data) => {
-              console.log('data', data);
-            },
-          },
-        },
+        // {
+        //   field: 'orderSn',
+        //   component: 'AutoComplete',
+        //   label: '订单号',
+        //   colProps: {
+        //     span: 18,
+        //   },
+        //   componentProps: {
+        //     options: optionsOrderSn.value,
+        //     filterOption: onFilterOption,
+        //     onSearch: async (searchText: string) => {
+        //       const { list } = await CameraList({ orderSn: searchText });
+        //       optionsOrderSn.value = !searchText
+        //         ? []
+        //         : list.map((ele) => {
+        //             return { value: ele.orderSn };
+        //           });
+        //       updateSchema({
+        //         field: 'orderSn',
+        //         componentProps: {
+        //           options: optionsOrderSn.value,
+        //         },
+        //       });
+        //     },
+        //     onChange: (data) => {
+        //       console.log('data', data);
+        //     },
+        //   },
+        // },
         {
           field: 'buyDate',
           component: 'DatePicker',

+ 115 - 65
src/views/device/index.vue

@@ -4,8 +4,12 @@
       <BasicTable @register="registerTable">
         <template #toolbar>
           <a-button type="primary" @click="put" v-if="getCheckPerm('device-in')"> 入库</a-button>
-          <a-button type="primary" @click="batchPut" v-if="getCheckPerm('device-all-in')"> 批量入库</a-button>
-          <a-button type="primary" @click="batchOutflow" v-if="getCheckPerm('device-all-out')">批量出库</a-button>
+          <a-button type="primary" @click="batchPut" v-if="getCheckPerm('device-all-in')">
+            批量入库</a-button
+          >
+          <a-button type="primary" @click="batchOutflow" v-if="getCheckPerm('device-all-out')"
+            >批量出库</a-button
+          >
         </template>
         <template #action="{ record }">
           <TableAction
@@ -67,7 +71,7 @@
   import { useMessage } from '/@/hooks/web/useMessage';
   import priorityMoadl from '../productOperation/modal/priorityMoadl.vue';
   import { cameraList } from '/@/api/customer';
-  import { cameraDelete } from '/@/api/device'
+  import { cameraDelete } from '/@/api/device';
   import batchOutflowModal from './OutflowModal.vue';
   import detailModal from './detailsMoadl.vue';
   import batchPutModal from './batchPutModal.vue';
@@ -77,7 +81,7 @@
   import { useRouter } from 'vue-router';
   import { UnbindCameraApi, cameraAllType } from '/@/api/account';
   import { usePermissionStore } from '/@/store/modules/permission';
-import { lte } from 'lodash';
+  import { lte } from 'lodash';
   export default defineComponent({
     components: {
       BasicTable,
@@ -107,10 +111,8 @@ import { lte } from 'lodash';
       const router = useRouter();
       let companyId: Number = 0;
       try {
-      companyId = Number(router.currentRoute.value.params.id) - 0;
-      } catch (error) {
-        
-      }
+        companyId = Number(router.currentRoute.value.params.id) - 0;
+      } catch (error) {}
       onMounted(() => {
         // console.log(router.currentRoute.value.params.id);
       });
@@ -143,7 +145,16 @@ import { lte } from 'lodash';
           //   return typeObj[record.type]
           // }
         },
-
+        {
+          title: '设备颜色',
+          dataIndex: 'colour',
+          width: 120,
+        },
+        {
+          title: '设备版本',
+          dataIndex: 'version',
+          width: 120,
+        },
         {
           title: '激活时间',
           dataIndex: 'activatedTime',
@@ -154,15 +165,15 @@ import { lte } from 'lodash';
           dataIndex: 'outType',
           width: 80,
           customRender: ({ record }) => {
-            let typeObj ={
-              '0':t('routes.product.outType.0'),
-              '4':t('routes.product.outType.4'),
-              '1':t('routes.product.outType.1'),
-              '2':t('routes.product.outType.2'),
-              '3':t('routes.product.outType.3'),
-            }
-            return typeObj[record.outType] || '未出库'
-          }
+            let typeObj = {
+              '0': t('routes.product.outType.0'),
+              '4': t('routes.product.outType.4'),
+              '1': t('routes.product.outType.1'),
+              '2': t('routes.product.outType.2'),
+              '3': t('routes.product.outType.3'),
+            };
+            return typeObj[record.outType] || '未出库';
+          },
         },
         {
           title: '经销商名称',
@@ -190,7 +201,7 @@ import { lte } from 'lodash';
           dataIndex: 'userName',
           width: 180,
           customRender({ record }) {
-            return record.userName?record.userName:'未绑定'
+            return record.userName ? record.userName : '未绑定';
           },
         },
 
@@ -207,7 +218,7 @@ import { lte } from 'lodash';
       const searchForm: Partial<FormProps> = {
         labelWidth: 100,
         // showAdvancedButton: true,
-        autoAdvancedLine:1,
+        autoAdvancedLine: 1,
         actionColOptions: {
           span: 24,
         },
@@ -221,7 +232,8 @@ import { lte } from 'lodash';
               xl: 6,
               xxl: 6,
             },
-          },{
+          },
+          {
             field: 'type',
             component: 'ApiSelect',
             label: '设备类型',
@@ -235,29 +247,6 @@ import { lte } from 'lodash';
               labelField: 'name',
               valueField: 'cameraType',
               immediate: true,
-              // options: [
-              //   {
-              //     label: t('routes.product.type.0'),
-              //     value: 0,
-              //     key: '0',
-              //   },{
-              //     label: t('routes.product.type.1'),
-              //     value: 1,
-              //     key: '1',
-              //   },{
-              //     label: t('routes.product.type.2'),
-              //     value: 9,
-              //     key: '9',
-              //   },{
-              //     label: t('routes.product.type.3'),
-              //     value: 10,
-              //     key: '10',
-              //   },{
-              //     label: t('routes.product.type.11'),
-              //     value: 11,
-              //     key: '11',
-              //   },
-              // ],
             },
           },
           {
@@ -266,7 +255,7 @@ import { lte } from 'lodash';
             component: 'RangePicker',
             componentProps: {
               format: 'YYYY-MM-DD',
-              valueFormat:'YYYY-MM-DD',
+              valueFormat: 'YYYY-MM-DD',
             },
             colProps: {
               xl: 7,
@@ -287,15 +276,18 @@ import { lte } from 'lodash';
                   label: t('routes.product.outType.0'),
                   value: 0,
                   key: '0',
-                },{
+                },
+                {
                   label: t('routes.product.outType.1'),
                   value: 1,
                   key: '1',
-                },{
+                },
+                {
                   label: t('routes.product.outType.2'),
                   value: 2,
                   key: '2',
-                },{
+                },
+                {
                   label: t('routes.product.outType.3'),
                   value: 3,
                   key: '3',
@@ -345,11 +337,12 @@ import { lte } from 'lodash';
                   label: '未绑定',
                   value: 0,
                   key: '0',
-                },{
+                },
+                {
                   label: '已绑定',
                   value: 1,
                   key: '1',
-                }
+                },
               ],
             },
           },
@@ -362,6 +355,63 @@ import { lte } from 'lodash';
               xxl: 6,
             },
           },
+          {
+            field: 'colour',
+            component: 'Select',
+            label: '设备颜色',
+            required: true,
+            defaultValue: '黑色',
+            colProps: {
+              span: 7,
+            },
+            componentProps: {
+              options: [
+                {
+                  label: '黑色',
+                  value: '黑色',
+                  key: '1',
+                },
+                {
+                  label: '红色',
+                  value: '红色',
+                  key: '2',
+                },
+                {
+                  label: '蓝色',
+                  value: '蓝色',
+                  key: '3',
+                },
+                {
+                  label: '金色',
+                  value: '金色',
+                  key: '4',
+                },
+              ],
+            },
+          },
+          {
+            field: 'version',
+            component: 'Select',
+            required: true,
+            label: '设备版本',
+            colProps: {
+              span: 6,
+            },
+            componentProps: {
+              options: [
+                {
+                  label: '标准版',
+                  value: '标准版',
+                  key: '1',
+                },
+                {
+                  label: 'RTK版',
+                  value: 'RTK版',
+                  key: '2',
+                },
+              ],
+            },
+          },
         ],
       };
       const [registerTable, { reload }] = useTable({
@@ -374,14 +424,14 @@ import { lte } from 'lodash';
         useSearchForm: true,
         formConfig: searchForm,
         showTableSetting: true,
-        showIndexColumn:false,
+        showIndexColumn: false,
         rowKey: 'id',
-        beforeFetch:(T)=>{
-          if(T.ctivated){
-            T.activatedStartTime = T.ctivated[0]
-            T.activatedEndTime = T.ctivated[1]
+        beforeFetch: (T) => {
+          if (T.ctivated) {
+            T.activatedStartTime = T.ctivated[0];
+            T.activatedEndTime = T.ctivated[1];
           }
-          return T
+          return T;
         },
         fetchSetting: {
           pageField: 'pageNum',
@@ -397,26 +447,26 @@ import { lte } from 'lodash';
           title: () => h('span', '温馨提示'),
           content: '解绑后用户将看不到该相机拍摄的场景。<br/>确定解绑吗?',
           onOk: async () => {
-            await UnbindCameraApi({cameraId:record.id})
+            await UnbindCameraApi({ cameraId: record.id });
             createMessage.success(t('common.optSuccess'));
-            reload()
+            reload();
           },
         });
       }
-      async function handleDelete(record: Recordable){
+      async function handleDelete(record: Recordable) {
         createConfirm({
           iconType: 'warning',
           title: () => h('span', '温馨提示'),
           content: '删除设备后需要重新入库<br/>确定删除吗?',
           onOk: async () => {
-            await cameraDelete({id:record.id})
+            await cameraDelete({ id: record.id });
             createMessage.success(t('common.optSuccess'));
-            reload()
+            reload();
           },
         });
       }
       function handlePriority(record) {
-        openPriorityModal(true, {cameraId:record.id});
+        openPriorityModal(true, { cameraId: record.id });
       }
       function deviceLink() {
         openLinkModal(true);
@@ -434,15 +484,15 @@ import { lte } from 'lodash';
         });
       }
       function put() {
-        openModalEnter(true)
+        openModalEnter(true);
       }
       function batchPut() {
         console.log('批量入库');
-        openModalPut(true, {})
+        openModalPut(true, {});
       }
       function batchOutflow() {
         console.log('批量出库');
-        openLinkModal(true, {})
+        openLinkModal(true, {});
       }
       return {
         registerTable,

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

@@ -6,7 +6,7 @@
     @visible-change="handleVisibleChange"
     @cancel="resetFields"
     @ok="handleSubmit"
-    :min-height="0"
+    :min-height="280"
   >
     <div class="pt-2px pr-3px">
       <BasicForm @register="registerForm" :model="model">
@@ -22,7 +22,8 @@
   import { BasicModal, useModalInner } from '/@/components/Modal';
   import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
   import { useMessage } from '/@/hooks/web/useMessage';
-  import { cameraIn } from '/@/api/device'
+  import { cameraAllType } from '/@/api/account';
+  import { cameraIn } from '/@/api/device';
   import { companyUploadExcel, downTemplate } from '/@/api/customer';
   import { useI18n } from '/@/hooks/web/useI18n';
   const { t } = useI18n();
@@ -31,7 +32,7 @@
     props: {
       userData: { type: Object },
     },
-    emits: ['reload',],
+    emits: ['reload'],
     setup(_, { emit }) {
       const modelRef = ref({});
       const fileFlow = reactive({
@@ -40,43 +41,132 @@
       const { createMessage } = useMessage();
       const schemas: FormSchema[] = [
         {
-          field: 'wifiName',
+          field: 'snCode',
           component: 'Input',
-          label: 'wifi名称',
+          required: true,
           colProps: {
             span: 18,
           },
-          helpMessage: 'wifi名称需包含前缀,如“4DKKPRO_”、“4DKKMI_”、“4DSS_”、“4DKK_”、“4DSG_”、“YUNPRO_”。',
-          itemProps: {
-            validateTrigger: 'blur',
+          label: 'SN码',
+        },
+        {
+          field: 'cameraType',
+          component: 'ApiSelect',
+          label: '设备类型',
+          required: true,
+          colProps: {
+            xl: 18,
+            xxl: 18,
+          },
+          componentProps: {
+            api: cameraAllType,
+            numberToString: true,
+            labelField: 'name',
+            valueField: 'cameraType',
+            immediate: true,
+            onChange: (val) => {
+              const wifiObj = {
+                1: '4DKKPRO_',
+                9: '4DKKMI_',
+                10: '4DSS_',
+                11: '4DSG_',
+              };
+              setFieldsValue({ color: null, wifiNamePrefix: wifiObj[val], version: '标准版' });
+              let option = [
+                {
+                  label: '标准版',
+                  value: '标准版',
+                  key: '1',
+                },
+              ]
+              if(val == 9 || val == 10){
+                option.push({
+                  label: 'RTK版',
+                  value: 'RTK版',
+                  key: '2',
+                });
+              }
+              // ifShow: val == 9 || val == 10
+              updateSchema([
+                { field: 'color', componentProps: { options: getColor(val) } },
+                { field: 'version', componentProps: { options: option } },
+              ]);
+            },
           },
+        },
+        {
+          field: 'wifiNamePrefix',
+          component: 'Input',
+          label: 'wifi前缀',
+          required: true,
+          colProps: {
+            span: 18,
+          },
+          helpMessage: 'wifi名称需包含前缀,如“4DKKPRO_”、“4DKKMI_”、“4DSS_”、“4DKK_”、“4DSG_”。',
           rules: [
             {
               required: true,
               // @ts-ignore
               validator: async (rule, value) => {
-                var reg = /\s+/g;
+                // var reg = /\S+@\S+\.\S+/;
                 if (!value) {
                   return Promise.reject('请输入wifi名称');
                 }
-                var list:string[] = ['4DKKPRO_','4DKKMI_','4DSS_','4DKK_','4DSG_','YUNPRO_'];
-                const some = list.some(item=>{
-                  return value.indexOf(item) != -1
-                })
-                if(!some){
-                  return Promise.reject('wifi名称需包含前缀,如“4DKKPRO_”、“4DKKMI_”、“4DSS_”、“4DKK_”、“4DSG_”、“YUNPRO_”。');
-                }
-                if (reg.test(value)) {
-                  return Promise.reject('格式错误,请重新输入');
+                var list: string[] = ['4DKKPRO_', '4DKKMI_', '4DSS_', '4DSG_', '4DKK_'];
+                const some = list.some((item) => {
+                  return value.indexOf(item) != -1;
+                });
+                console.log('validator', some);
+                if (!some) {
+                  return Promise.reject(
+                    'wifi名称需包含前缀,如“4DKKPRO_”、“4DKKMI_”、“4DSS_”、“4DKK_”、“4DSG_”。',
+                  );
                 }
                 return Promise.resolve();
               },
               trigger: 'change',
             },
           ],
-        }
+        },
+        {
+          field: 'colour',
+          component: 'Select',
+          label: '设备颜色',
+          required: true,
+          defaultValue: '黑色',
+          colProps: {
+            span: 18,
+          },
+          componentProps: {
+            options: getColor(),
+          },
+        },
+        {
+          field: 'version',
+          component: 'Select',
+          defaultValue: '标准版',
+          required: true,
+          label: '设备版本',
+          colProps: {
+            span: 18,
+          },
+          componentProps: {
+            options: [
+              {
+                label: '标准版',
+                value: '标准版',
+                key: '1',
+              },
+              {
+                label: 'RTK版',
+                value: 'RTK版',
+                key: '2',
+              },
+            ],
+          },
+        },
       ];
-      const [registerForm, { validate, resetFields, setFieldsValue }] = useForm({
+      const [registerForm, { validate, resetFields, getFieldsValue, setFieldsValue, updateSchema }] = useForm({
         labelWidth: 120,
         schemas,
         showActionButtonGroup: false,
@@ -98,10 +188,20 @@
           type: data.sceneName,
         });
       }
-      function handleVisibleChange() {
-
+      function handleVisibleChange() {}
+      function getColor(type) {
+        let list = ['黑色', '红色'];
+        if (type == 10) {
+          list.push('蓝色');
+        }
+        if (type == 11) {
+          list.push(...['蓝色', '金色']);
+        }
+        console.log('not passing', list);
+        return list.map((res) => {
+          return { label: res, value: res };
+        });
       }
-
       const handleSubmit = async () => {
         try {
           const params = await validate();

+ 253 - 0
src/views/empower/apilist.vue

@@ -0,0 +1,253 @@
+<template>
+  <div>
+    <BasicTable @register="registerTable">
+      <template #toolbar>
+        <a-button type="primary" @click="handleEdit" v-if="getCheckPerm('empowerCamera-add')"
+          >新增</a-button
+        >
+      </template>
+      <template #copy="{ text }">
+        <a @click="handleCopy(text)">
+          {{ text }}
+        </a>
+      </template>
+      <template #action="{ record }">
+        <TableAction
+          :actions="[
+            {
+              label: '删除',
+              color: 'error',
+              ifShow: getCheckPerm('empowerCamera-delete'),
+              onClick: handleDelete.bind(null, record),
+            },
+          ]"
+        />
+      </template>
+    </BasicTable>
+    <AddModal @register="register" @update="reload" />
+  </div>
+</template>
+<script lang="ts">
+  import { defineComponent, h } from 'vue';
+  import { BasicTable, useTable, TableAction, BasicColumn, FormProps } from '/@/components/Table';
+  import { authorizeOpenApilist, authorizeOpenApidelete, authorizeOpenApiupdate } from '/@/api/authorizeModeling';
+  import { useModal } from '/@/components/Modal';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import AddModal from './modal/api/AddApiModal.vue';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { usePermissionStore } from '/@/store/modules/permission';
+  import { copyTextToClipboard } from '/@/hooks/web/useCopyToClipboard';
+  import { incrementUseTypeList } from '/@/api/account';
+  import { Switch } from 'ant-design-vue';
+  export default defineComponent({
+    components: {
+      BasicTable,
+      AddModal,
+      TableAction,
+    },
+    setup() {
+      const { t } = useI18n();
+      const { createMessage, createConfirm } = useMessage();
+      const permissionStore = usePermissionStore();
+      const { getCheckPerm } = permissionStore;
+      const [register, { openModal }] = useModal();
+      const columns: BasicColumn[] = [
+        {
+          title: 'API KEY',
+          ellipsis: true,
+          slots: { customRender: 'copy' },
+          dataIndex: 'apiKey',
+          width: 200,
+        },
+        {
+          title: '生效时间',
+          ellipsis: true,
+          dataIndex: 'remark',
+          width: 120,
+        },
+        {
+          title: '四维看看账户',
+          ellipsis: true,
+          dataIndex: 'userName',
+          width: 120,
+        },
+        {
+          title: '合同所属公司',
+          dataIndex: 'companyName',
+          ellipsis: true,
+          width: 230,
+        },
+        {
+          title: '业务部门',
+          dataIndex: 'businessDept',
+          ellipsis: true,
+          width: 120,
+        },
+        {
+          title: '业务员',
+          dataIndex: 'businessName',
+          ellipsis: true,
+          width: 120,
+        },
+        {
+          title: '客户名称',
+          dataIndex: 'customerName',
+          ellipsis: true,
+          width: 100,
+        },
+        {
+          title: '客户类别',
+          dataIndex: 'customerType',
+          ellipsis: true,
+          width: 80,
+          customRender: ({ record }) => {
+            return record.customerType == 1 ? '经销' : '直销';
+          },
+        },
+        {
+          title: '终端客户',
+          ellipsis: true,
+          dataIndex: 'endCustomer',
+          width: 120,
+        },
+        {
+          title: '使用类型',
+          ellipsis: true,
+          dataIndex: 'useTypeStr',
+          width: 120,
+        },
+        {
+          title: '项目号',
+          ellipsis: true,
+          dataIndex: 'projectNum',
+          width: 120,
+        },
+        {
+          title: '备注',
+          ellipsis: true,
+          dataIndex: 'remark',
+          width: 120,
+        },
+        {
+          title: '操作人',
+          ellipsis: true,
+          dataIndex: 'sysUserName',
+          width: 120,
+        },
+        {
+          title: '操作时间',
+          ellipsis: true,
+          dataIndex: 'updateTime',
+          width: 160,
+        },
+        {
+          title: '状态',
+          dataIndex: 'status',
+          width: 80,
+          customRender: ({ record }) => {
+            if (!Reflect.has(record, 'pendingStatus')) {
+              record.pendingStatus = false;
+            }
+            return h(Switch, {
+              checked: record.status == '1',
+              checkedChildren: '启用',
+              unCheckedChildren: '禁用',
+              loading: false,
+              onChange: async (checked: boolean) => {
+                record.pendingStatus = true;
+                const newStatus = checked ? '1' : '0';
+                await authorizeOpenApiupdate({ ...record, status: newStatus });
+                if (checked) {
+                  Reflect.set(record, 'status', newStatus);
+                } else {
+                  Reflect.set(record, 'status', newStatus);
+                }
+                // reload();
+                createMessage.success(t('common.optSuccess'));
+              },
+            });
+          },
+        },
+      ];
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 100,
+        autoSubmitOnEnter: true,
+        schemas: [
+          {
+            field: 'apiKey',
+            label: 'API KEY',
+            component: 'Input',
+            colProps: {
+              xl: 8,
+              xxl: 8,
+            },
+          },
+          {
+            field: 'userName',
+            label: '四维看看账户',
+            component: 'Input',
+            colProps: {
+              xl: 8,
+              xxl: 8,
+            },
+          },
+        ],
+      };
+      const [registerTable, { reload }] = useTable({
+        api: authorizeOpenApilist,
+        title: '深时本地版相机授权',
+        columns: columns,
+        useSearchForm: true,
+        formConfig: searchForm,
+        showTableSetting: true,
+        showIndexColumn: false,
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },
+        actionColumn: {
+          width: 150,
+          title: '操作',
+          dataIndex: 'action',
+          slots: { customRender: 'action' },
+        },
+        rowKey: 'id',
+        canResize: true,
+      });
+      async function handleDelete(record) {
+        createConfirm({
+          iconType: 'warning',
+          title: () => h('span', '温馨提示'),
+          content: () => h('span', '确定要删除授权吗?'),
+          onOk: async () => {
+            await authorizeOpenApidelete({ id: record.id });
+            reload();
+            createMessage.success(t('common.optSuccess'));
+          },
+        });
+      }
+      function handleEdit(record = {}) {
+        openModal(true, record);
+      }
+      function handleDetail(record = {}) {
+        opendetailModel(true, record);
+      }
+      function handleCopy(str: string) {
+        copyTextToClipboard(str);
+        createMessage.success('复制成功');
+      }
+      return {
+        registerTable,
+        handleCopy,
+        handleDelete,
+        reload,
+        register,
+        getCheckPerm,
+        handleEdit,
+        handleDetail,
+      };
+    },
+  });
+</script>

+ 2 - 2
src/views/empower/camera.vue

@@ -44,8 +44,8 @@
   import { authorizeCameraList, authorizeCameradelete } from '/@/api/authorizeModeling';
   import { useModal } from '/@/components/Modal';
   import { useI18n } from '/@/hooks/web/useI18n';
-  import AddModal from './AddCameraModal.vue';
-  import DetailModal from './detailModel.vue';
+  import AddModal from './modal/camera/AddCameraModal.vue';
+  import DetailModal from './modal/camera/detailModel.vue';
   import { useMessage } from '/@/hooks/web/useMessage';
   import { usePermissionStore } from '/@/store/modules/permission';
   import { copyTextToClipboard } from '/@/hooks/web/useCopyToClipboard';

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

@@ -186,3 +186,212 @@ export const Addschemas: FormSchema[] = [
     colProps: { span: 20 },
   },
 ];
+
+export const rtkdeviceColumns: any[] = [
+  {
+    title: '设备类型',
+    dataIndex: 'cameraType',
+    ellipsis: true,
+    width: 120,
+    customRender: ({ record }) => {
+      const obj = {
+        0: '四维看看',
+        1: '四维看见',
+        2: '四维深时',
+        3: '四维深光',
+      };
+      return obj[record.cameraType] || '-';
+    },
+  },
+  {
+    title: '相机SN',
+    ellipsis: true,
+    dataIndex: 'cameraSn',
+    width: 100,
+    customRender: ({ record }) => {
+      return record.cameraSn || '-';
+    },
+  },
+  {
+    title: '板卡类型',
+    dataIndex: 'rtkType',
+    ellipsis: true,
+    width: 120,
+    customRender: ({ record }) => {
+      const obj = {
+        0: '千寻板卡千寻账号',
+        1: '千寻板卡移动账号',
+        2: '北云板卡移动账号',
+      };
+      return obj[record.rtkType] || '-';
+    },
+  },
+  {
+    title: '板卡SN号',
+    ellipsis: true,
+    dataIndex: 'rtkSnCode',
+    width: 265,
+  },
+  {
+    title: '深光rtk插件SN号',
+    ellipsis: true,
+    dataIndex: 'sgRtkSn',
+    customRender: ({ record }) => {
+      return record.sgRtkSn || '-';
+    },
+    width: 160,
+  },
+  {
+    title: '账号类型',
+    ellipsis: true,
+    dataIndex: 'accountType',
+    width: 80,
+    customRender: ({ record }) => {
+      const obj = {
+        0: '账号池',
+        1: '专用账号',
+      };
+      return obj[record.accountType] || '-';
+    },
+  },
+];
+
+export const rtkuserColumns: any[] = [
+  {
+    title: '用户名称',
+    ellipsis: true,
+    dataIndex: 'userName',
+    width: 120,
+  },
+  {
+    title: '运营商',
+    ellipsis: true,
+    dataIndex: 'operator',
+    width: 120,
+  },
+  {
+    title: 'IP地址',
+    ellipsis: true,
+    dataIndex: 'ipAddr',
+    width: 120,
+  },
+  {
+    title: '挂载点',
+    ellipsis: true,
+    dataIndex: 'mountPoint',
+    width: 120,
+  },
+  {
+    title: '端口',
+    ellipsis: true,
+    dataIndex: 'port',
+    width: 50,
+  },
+  {
+    title: '到期时间',
+    ellipsis: true,
+    dataIndex: 'failureTime',
+    width: 160,
+  },
+  {
+    title: '创建人',
+    ellipsis: true,
+    dataIndex: 'createNickName',
+    width: 120,
+  },
+  {
+    title: '创建时间',
+    ellipsis: true,
+    dataIndex: 'createTime',
+    width: 150,
+  },
+];
+export const newApiAddschemas: FormSchema[] = [
+  {
+    field: 'companyName',
+    component: 'Select',
+    label: '合同所属公司',
+    rules: [{ required: true }],
+    colProps: {
+      span: 20,
+    },
+    itemProps: {
+      autoLink: false,
+    },
+    componentProps: {
+      options: [
+        {
+          label: '珠海市四维时代网络科技有限公司',
+          value: '珠海市四维时代网络科技有限公司',
+          key: '珠海市四维时代网络科技有限公司',
+        },
+        {
+          label: '广东四维看看智能设备有限公司',
+          value: '广东四维看看智能设备有限公司',
+          key: '广东四维看看智能设备有限公司',
+        },
+        {
+          label: '四维看看(香港)有限公司',
+          value: '四维看看(香港)有限公司',
+          key: '四维看看(香港)有限公司',
+        },
+        {
+          label: '四维看看(北京)数据科技有限公司',
+          value: '四维看看(北京)数据科技有限公司',
+          key: '四维看看(北京)数据科技有限公司',
+        },
+      ],
+    },
+  },
+  {
+    field: 'businessDept',
+    component: 'Select',
+    label: '业务部门',
+    rules: [{ required: true }],
+    colProps: {
+      span: 20,
+    },
+    itemProps: {
+      autoLink: false,
+    },
+    componentProps: {
+      options: [
+        {
+          label: '数字营销事业部',
+          value: '数字营销事业部',
+          key: '数字营销事业部',
+        },
+        {
+          label: '政企事业部',
+          value: '政企事业部',
+          key: '政企事业部',
+        },
+        {
+          label: '海外事业部',
+          value: '海外事业部',
+          key: '海外事业部',
+        },
+        {
+          label: '市场部',
+          value: '市场部',
+          key: '市场部',
+        },
+        {
+          label: '总经办',
+          value: '总经办',
+          key: '总经办',
+        },
+      ],
+    },
+  },
+  {
+    field: 'businessName',
+    component: 'Input',
+    label: '业务员',
+    required: true,
+    colProps: { span: 20 },
+    componentProps: {
+      maxlength: 100,
+    },
+  },
+];

+ 180 - 0
src/views/empower/differenceList.vue

@@ -0,0 +1,180 @@
+<template>
+  <PageWrapper contentClass="testPageWrapper">
+    <BasicTable @register="registerTable">
+      <template #action="{ record }">
+        <TableAction
+          :actions="[
+            {
+              label: '差分账号授权',
+              onClick: handleAuthorize.bind(null, record),
+            },
+            {
+              label: '授权记录',
+              onClick: handleLogList.bind(null, record, 'edit'),
+            },
+          ]"
+        />
+      </template>
+    </BasicTable>
+    <AddModal @register="register" @update="reload" />
+    <logListModal @register="registerlogLis" @update="reload" />
+  </PageWrapper>
+</template>
+<script lang="ts">
+  import { defineComponent, h, ref } from 'vue';
+  import { BasicTable, useTable, FormProps, TableAction } from '/@/components/Table';
+  import { PageWrapper } from '/@/components/Page';
+  import { authorizeCameraList, rtkDevicedel, rtkAccountdel } from '/@/api/rtk';
+  import { useModal } from '/@/components/Modal';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { copyTextToClipboard } from '/@/hooks/web/useCopyToClipboard';
+  import AddModal from './modal/difference/AddModal.vue';
+  import logListModal from './modal/difference/logListModal.vue';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { usePermissionStore } from '/@/store/modules/permission';
+  import { rtkdeviceColumns } from './data';
+  export default defineComponent({
+    components: {
+      BasicTable,
+      AddModal,
+      logListModal,
+      PageWrapper,
+      TableAction,
+    },
+    setup() {
+      const { t } = useI18n();
+      const activeKey = ref(0);
+      const { createMessage, createConfirm } = useMessage();
+      const permissionStore = usePermissionStore();
+      const { getCheckPerm } = permissionStore;
+      const [register, { openModal }] = useModal();
+      const [registerlogLis, { openModal: openlogLisModal }] = useModal();
+
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 100,
+        autoSubmitOnEnter: true,
+        schemas: [
+          {
+            field: 'cameraSn',
+            label: '相机Sn',
+            component: 'Input',
+            colProps: {
+              xl: 8,
+              xxl: 8,
+            },
+          },
+          {
+            field: 'rtkSnCode',
+            label: '板卡SN号',
+            component: 'Input',
+            colProps: {
+              xl: 8,
+              xxl: 8,
+            },
+          },
+          {
+            field: 'sgRtkSn',
+            label: '深光rtk插件SN号',
+            labelWidth: 140,
+            component: 'Input',
+            colProps: {
+              xl: 8,
+              xxl: 8,
+            },
+          },
+        ],
+      };
+      const [registerTable, { reload }] = useTable({
+        api: authorizeCameraList,
+        title: 'RTK设备列表',
+        columns: rtkdeviceColumns,
+        useSearchForm: true,
+        showIndexColumn: false,
+        formConfig: searchForm,
+        showTableSetting: true,
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },
+        actionColumn: {
+          width: 180,
+          title: '操作',
+          dataIndex: 'action',
+          slots: { customRender: 'action' },
+        },
+        rowKey: 'id',
+        canResize: false,
+      });
+      async function handleDelete(record) {
+        createConfirm({
+          iconType: 'warning',
+          title: () => h('span', '温馨提示'),
+          content: () => h('span', '确定要删除吗?'),
+          onOk: async () => {
+            let apiUrl = activeKey.value == 0 ? rtkDevicedel : rtkAccountdel;
+            await apiUrl({ id: record.id });
+            reload();
+            createMessage.success(t('common.optSuccess'));
+          },
+        });
+      }
+      function handleCopy(str: string) {
+        copyTextToClipboard(str);
+        createMessage.success('复制成功');
+      }
+      function changeTable(val: number) {
+        activeKey.value = val;
+        // reload();
+      }
+      function handleActive(record) {
+        createConfirm({
+          iconType: 'warning',
+          title: () => h('span', '温馨提示'),
+          content: () => h('span', `确定要${record.status ? '禁用' : '激活'}吗?`),
+          onOk: async () => {
+            await activation({ id: record.id, status: record.status ? 0 : 1 });
+            reload();
+            createMessage.success(t('common.optSuccess'));
+          },
+        });
+      }
+      function handleAuthorize(record) {
+        openModal(true, record);
+      }
+      function handleLogList(record) {
+        openlogLisModal(true, record);
+      }
+      function handleEdit(record = {}) {
+        openModal(true, {
+          ...record,
+          accountType: record.rtkType == 0 ? 0 : record.accountType,
+          authorizeTime: `${record.authorizeTime || '10'}_${record.authorizeTimeUnit || '1'}`,
+        });
+      }
+      function handleuserEdit(record = {}) {
+        openModal1(true, {
+          ...record,
+        });
+      }
+      return {
+        activeKey,
+        registerTable,
+        openlogLisModal,
+        handleAuthorize,
+        handleLogList,
+        handleCopy,
+        handleDelete,
+        reload,
+        register,
+        registerlogLis,
+        handleActive,
+        getCheckPerm,
+        handleEdit,
+        handleuserEdit,
+        changeTable,
+      };
+    },
+  });
+</script>

+ 1 - 1
src/views/empower/install.vue

@@ -47,7 +47,7 @@
   } from '/@/api/authorizeModeling';
   import { useModal } from '/@/components/Modal';
   import { useI18n } from '/@/hooks/web/useI18n';
-  import AddModal from './AddInstallModal.vue';
+  import AddModal from './modal/install/AddInstallModal.vue';
   import { useMessage } from '/@/hooks/web/useMessage';
   import { usePermissionStore } from '/@/store/modules/permission';
   import { incrementUseTypeList } from '/@/api/account';

+ 218 - 0
src/views/empower/modal/api/AddApiModal.vue

@@ -0,0 +1,218 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    title="新增API授权"
+    @visible-change="handleVisibleChange"
+    @cancel="resetFields"
+    minHeight="900px"
+    @ok="handleConfirm"
+  >
+    <div class="pt-2px pr-3px zdysrk">
+      <BasicForm @register="registerForm">
+        <template #text="{ model, field }"> {{ model[field] }}{{ fileFlow.type }} </template>
+      </BasicForm>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, nextTick, onMounted, reactive, computed, h } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { remarkschemas, Addschemas, newApiAddschemas } from '../../data';
+  import { InvoiceRegister } from '/@/api/order';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { uploadApi } from '/@/api/product/index';
+  import { ResultEnum } from '/@/enums/httpEnum';
+  import { authorizeOpenApiadd } from '/@/api/authorizeModeling';
+  import { copyTextToClipboard } from '/@/hooks/web/useCopyToClipboard';
+  import { useUserStore } from '/@/store/modules/user';
+  import { currencyList } from '/@/api/account';
+  import dayjs from 'dayjs';
+  import { otherInfoStore } from '/@/store/modules/other';
+  import { incrementUseTypeList } from '/@/api/account';
+
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['update', 'register'],
+    setup(props, { emit }) {
+      const otherInfo = otherInfoStore();
+      const userStore = useUserStore();
+      const overviewInfo = computed(() => otherInfo.getOverviewInfo);
+      // const overviewInfo = getOverviewInfo() || {}
+      const fileFlow = reactive({
+        file: null,
+        id: '',
+        key: '',
+        type: 'down', //down-下载,equity-权益
+      });
+      const { createMessage, createConfirm, createSuccessModal } = useMessage();
+      const schemas: FormSchema[] = [
+        {
+          field: 'id',
+          component: 'Input',
+          show: false,
+          label: 'id',
+        },
+        {
+          field: 'userName',
+          component: 'Input',
+          required: true,
+          componentProps: {
+            rows: 4,
+          },
+          label: '四维看看账户',
+          colProps: { span: 20 },
+        },
+        {
+          field: 'useType',
+          component: 'ApiSelect',
+          required: true,
+          label: '使用类型',
+          componentProps: {
+            // filterOption: onFilterOption,
+            // showSearch: true,
+            api: async ()=>{
+              let list = await incrementUseTypeList()
+              return list.filter(item=>item.name != '正常销售') || []
+
+            },
+            labelField: 'name',
+            valueField: 'id',
+            immediate: true,
+          },
+          itemProps: {
+            autoLink: false,
+          },
+          colProps: {
+            span: 20,
+          },
+        },
+      ];
+
+      const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
+        labelWidth: 120,
+        schemas: [
+          ...schemas, 
+          ...newApiAddschemas, 
+          ...Addschemas, 
+          ...remarkschemas,
+        ],
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+      onMounted(() => {});
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        data && onDataReceive(data);
+      });
+      async function onDataReceive(data) {
+        resetFields();
+        fileFlow.id = data.id;
+        fileFlow.key = data.authorizeKey;
+        updateSchema([
+          {
+            field: 'useType',
+            componentProps: {
+              onChange: useTypeChange,
+            },
+          },
+          {
+            field: 'projectNum',
+            ifShow: data.useType == '4',
+          },
+          {
+            field: 'machineCode',
+            componentProps: {
+              disabled: data.id ? true : false,
+            },
+          },
+          {
+            field: 'snCodes',
+            componentProps: {
+              disabled: data.id ? true : false,
+            },
+          },
+        ]);
+        useTypeChange(data.useType || 0);
+        setFieldsValue(data);
+      }
+      const useTypeChange = (value) => {
+        updateSchema([
+          { field: 'projectNum', ifShow: value == '4' },
+          { field: 'companyName', ifShow: value != '3' },
+          { field: 'businessDept', ifShow: value != '3' },
+          { field: 'businessName', ifShow: value != '3' },
+          { field: 'customerName', ifShow: value != '3' },
+          { field: 'customerType', ifShow: value != '3' },
+          { field: 'endCustomer', ifShow: value != '3' },
+          { field: 'customerPayTime', required: value == '4' },
+        ]);
+      };
+      async function handleConfirm() {
+        const { id } = await validate();
+        createConfirm({
+          iconType: 'warning',
+          title: () => h('span', '温馨提示'),
+          content: () => h('span', `确定要${id ? '编辑' : '新增'}授权吗?`),
+          onOk: async () => {
+            handleSubmit();
+          },
+        });
+      }
+      const handleSubmit = async () => {
+        try {
+          const params = await validate();
+          let res = await authorizeOpenApiadd(params);
+          let count = (res.snCodes && res.snCodes.split('\n')) || [];
+          closeModal();
+          resetFields();
+          createSuccessModal({
+            title: t('layout.setting.operatingTitle'),
+            content: h('div', {}, [
+              h('p', `授权Key:${res || fileFlow.key}`)
+            ]),
+            okText: '复制授权Key',
+            onOk: async () => {
+              // 双击复制
+              copyTextToClipboard(res || fileFlow.key);
+              createMessage.success('复制成功');
+            },
+          });
+          // 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,
+        registerForm,
+        fileFlow,
+        handleVisibleChange,
+        handleSubmit,
+        addListFunc,
+        resetFields,
+        handleConfirm,
+        t,
+      };
+    },
+  });
+</script>
+<style lang="less">
+  .zdysrk {
+    .ant-calendar-picker {
+      min-width: 285px;
+    }
+  }
+</style>

+ 43 - 3
src/views/empower/AddCameraModal.vue

@@ -20,13 +20,15 @@
   import { BasicModal, useModalInner } from '/@/components/Modal';
   import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
   import { useMessage } from '/@/hooks/web/useMessage';
-  import { remarkschemas, Addschemas, newAddschemas } from './data';
+  import { remarkschemas, Addschemas, newAddschemas } from '../.../../../data';
   import { InvoiceRegister } from '/@/api/order';
   import { useI18n } from '/@/hooks/web/useI18n';
   import { uploadApi } from '/@/api/product/index';
   import { ResultEnum } from '/@/enums/httpEnum';
   import { authorizeCameraaddOrUpdate } from '/@/api/authorizeModeling';
   import { copyTextToClipboard } from '/@/hooks/web/useCopyToClipboard';
+  import { useUserStore } from '/@/store/modules/user';
+  import { currencyList } from '/@/api/account';
   import dayjs from 'dayjs';
   import { otherInfoStore } from '/@/store/modules/other';
 
@@ -39,6 +41,7 @@
     emits: ['update', 'register'],
     setup(props, { emit }) {
       const otherInfo = otherInfoStore();
+      const userStore = useUserStore();
       const overviewInfo = computed(() => otherInfo.getOverviewInfo);
       // const overviewInfo = getOverviewInfo() || {}
       const fileFlow = reactive({
@@ -90,7 +93,44 @@
 
       const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
         labelWidth: 120,
-        schemas: [...newAddschemas, ...Addschemas, ...schemas, ...remarkschemas],
+        schemas: [
+          ...newAddschemas, 
+          ...Addschemas, 
+          ...schemas, 
+          {
+            field: 'amount',
+            component: 'InputNumber',
+            label: '订单金额',
+            required: true,
+            colProps: {
+              span: 16,
+            },
+            componentProps: {
+              precision: 2,
+              min: 0,
+              step: 1,
+            },
+          },
+          {
+            field: 'currencySymbol',
+            component: 'ApiSelect',
+            required: true,
+            label: '币种',
+            defaultValue: userStore.isEnv ? '' : 'CNY',
+            componentProps: {
+              // filterOption: onFilterOption,
+              // showSearch: true,
+              api: currencyList,
+              labelField: 'name',
+              valueField: 'symbol',
+              immediate: true,
+            },
+            colProps: {
+              span: 20,
+            },
+          },
+          ...remarkschemas,
+        ],
         showActionButtonGroup: false,
         actionColOptions: {
           span: 24,
@@ -138,10 +178,10 @@
           { field: 'companyName', ifShow: value != '3' },
           { field: 'businessDept', ifShow: value != '3' },
           { field: 'businessName', ifShow: value != '3' },
-          { field: 'customerPayTime', ifShow: value != '3' },
           { field: 'customerName', ifShow: value != '3' },
           { field: 'customerType', ifShow: value != '3' },
           { field: 'endCustomer', ifShow: value != '3' },
+          { field: 'customerPayTime', required: value == '4' },
         ]);
       };
       async function handleConfirm() {

src/views/empower/detailModel.vue → src/views/empower/modal/camera/detailModel.vue


src/views/empower/logListModal.vue → src/views/empower/modal/camera/logListModal.vue


src/views/empower/uploadModal.vue → src/views/empower/modal/camera/uploadModal.vue


+ 189 - 0
src/views/empower/modal/difference/AddModal.vue

@@ -0,0 +1,189 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    title="差分账号授权"
+    @visible-change="handleVisibleChange"
+    @cancel="resetFields"
+    @ok="handleConfirm"
+  >
+    <div class="pt-2px pr-3px zdysrk">
+      <BasicForm @register="registerForm">
+        <template #text="{ model, field }"> {{ model[field] }}{{ fileFlow.type }} </template>
+      </BasicForm>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, nextTick, onMounted, reactive, computed, h } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { remarkschemas, newAddschemas, Addschemas } from '../.../../../data';
+  // import { remarkschemas, Addschemas } from '../.../../data';
+  import { InvoiceRegister } from '/@/api/order';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { uploadApi } from '/@/api/product/index';
+  import { copyTextToClipboard } from '/@/hooks/web/useCopyToClipboard';
+  import { ResultEnum } from '/@/enums/httpEnum';
+  import { authorizeInstalladdOrUpdate, checkMachineCode } from '/@/api/authorizeModeling';
+  import dayjs from 'dayjs';
+  import { otherInfoStore } from '/@/store/modules/other';
+  import { incrementUseTypeList } from '/@/api/account';
+
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['update', 'register'],
+    setup(props, { emit }) {
+      const otherInfo = otherInfoStore();
+      const overviewInfo = computed(() => otherInfo.getOverviewInfo);
+      // const overviewInfo = getOverviewInfo() || {}
+      const fileFlow = reactive({
+        file: null,
+        id: '',
+        key: '',
+        type: 'down', //down-下载,equity-权益
+      });
+      const { createMessage, createConfirm, createSuccessModal } = useMessage();
+      const schemas: FormSchema[] = [
+        {
+          field: 'id',
+          component: 'Input',
+          show: false,
+          label: 'id',
+        },
+        {
+          field: 'machineCode1',
+          component: 'Select',
+          required: true,
+          defaultValue: 1,
+          label: '*差分账号期限',
+          componentProps: {
+            rows: 4,
+            options: [
+              {
+                label: '1年',
+                value: 1,
+              },
+            ]
+          },
+          colProps: { span: 20 },
+        },
+        {
+          field: 'machineCode',
+          component: 'DatePicker',
+          required: true,
+          label: '差分账号期限',
+          componentProps: {
+            rows: 4,
+          },
+          colProps: { span: 20 },
+        },
+      ];
+
+      const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
+        labelWidth: 120,
+        schemas: [
+          ...newAddschemas,
+          ...Addschemas,
+          ...schemas,
+          ...remarkschemas,
+        ],
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+      onMounted(() => {});
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        data && onDataReceive(data);
+      });
+      async function onDataReceive(data) {
+        resetFields();
+        fileFlow.id = data.id;
+        fileFlow.key = data.authorizeKey;
+        // setFieldsValue(data);
+      }
+      async function handleConfirm() {
+        const { id, machineCode } = await validate();
+        let res = await checkMachineCode({ machineCode: machineCode.replace(/\s*/g, '') });
+        console.log('res', res, !id);
+        if (!id && res && res.id) {
+          createConfirm({
+            iconType: 'warning',
+            title: () => h('span', '温馨提示'),
+            content: () => h('span', `当前设备已存在授权记录。`),
+            okText: '继续',
+            onOk: async () => {
+              handleSubmit();
+            },
+          });
+        } else {
+          createConfirm({
+            iconType: 'warning',
+            title: () => h('span', '温馨提示'),
+            content: () => h('span', `确定要${id ? '编辑' : '新增'}授权吗?`),
+            onOk: async () => {
+              handleSubmit();
+            },
+          });
+        }
+      }
+      const handleSubmit = async () => {
+        try {
+          const params = await validate();
+          console.log('validate', params);
+          const apiData = {
+            ...params,
+            snCodes: params.snCodes && params.snCodes.replace(/\s*/g, ''),
+            machineCode: params.machineCode.replace(/\s*/g, ''),
+            userId: params.id,
+          };
+          let res = await authorizeInstalladdOrUpdate(apiData);
+          closeModal();
+          resetFields();
+          createSuccessModal({
+            title: t('layout.setting.operatingTitle'),
+            content: `安装Key:${res.authorizeKey || fileFlow.key}`,
+            okText: '复制',
+            onOk: async () => {
+              // 双击复制
+              copyTextToClipboard(res.authorizeKey || fileFlow.key);
+              createMessage.success('复制成功');
+            },
+          });
+          // 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,
+        registerForm,
+        fileFlow,
+        handleVisibleChange,
+        handleSubmit,
+        addListFunc,
+        resetFields,
+        handleConfirm,
+        t,
+      };
+    },
+  });
+</script>
+<style lang="less">
+  .zdysrk {
+    .ant-calendar-picker {
+      min-width: 285px;
+    }
+  }
+</style>

+ 149 - 0
src/views/empower/modal/difference/logListModal.vue

@@ -0,0 +1,149 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    title="授权记录"
+    :width="800"
+    @ok="closeModal"
+    @visible-change="handleVisibleChange"
+  >
+    <div>板卡SN号:4235323412003A272B</div> 
+    <BasicTable @register="registerSubtable">
+      <template #copy="{ text }">
+        <a @click="handleCopy(text)">
+          {{ text }}
+        </a>
+      </template>
+    </BasicTable>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, nextTick, onMounted, reactive, computed, h, ref } from 'vue';
+  import { BasicTable, useTable, BasicColumn, TableAction } from '/@/components/Table';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm } from '/@/components/Form/index';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { authorizeCamerasnUpdateLog } from '/@/api/authorizeModeling';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { GetCameraDetailApi, UnbindCameraApi } from '/@/api/account';
+  import { otherInfoStore } from '/@/store/modules/other';
+  import { DetailsApi, IncrementDelayApi } from '/@/api/account';
+  import { usePermissionStore } from '/@/store/modules/permission';
+  import { useModal } from '/@/components/Modal';
+  import { copyTextToClipboard } from '/@/hooks/web/useCopyToClipboard';
+
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm, BasicTable, TableAction },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['update'],
+    setup(props, { emit }) {
+      const otherInfo = otherInfoStore();
+      const overviewInfo = computed(() => otherInfo.getOverviewInfo);
+      const { createMessage, createConfirm } = useMessage();
+      const [registerList, { openModal }] = useModal();
+      const permissionStore = usePermissionStore();
+      const { getCheckPerm } = permissionStore;
+      console.log('overviewInfo', overviewInfo);
+      // const overviewInfo = getOverviewInfo() || {}
+      const id = ref('');
+      const fileFlow = reactive({
+        file: null,
+        id: '',
+        type: 'down', //down-下载,equity-权益
+      });
+      const columns: BasicColumn[] = [
+        {
+          title: '原SN码',
+          dataIndex: 'oldSnCode',
+          width: 120,
+        },
+        {
+          title: '新SN码',
+          dataIndex: 'newSnCode',
+          width: 150,
+        },
+        {
+          title: '更换Key',
+          dataIndex: 'updateAuthorizeKey',
+          ellipsis: true,
+          slots: { customRender: 'copy' },
+          width: 150,
+        },
+        {
+          title: '操作时间',
+          dataIndex: 'updateTime',
+          width: 150,
+        },
+      ];
+      const [registerSubtable, { reload }] = useTable({
+        api: () => {
+          return authorizeCamerasnUpdateLog(id.value);
+        },
+        columns: columns,
+        immediate: false,
+        rowKey: 'id',
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'data',
+          totalField: 'total',
+        },
+        pagination: false,
+        canResize: true,
+        bordered: true,
+      });
+
+      onMounted(() => {});
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        data && onDataReceive(data);
+      });
+      function onDataReceive(data) {
+        console.log('onDataReceive', data);
+        fileFlow.id = data.id;
+        id.value = data.id;
+        reload();
+      }
+      async function handleDelete(record: Recordable) {
+        createConfirm({
+          iconType: 'warning',
+          title: () => h('span', '温馨提示'),
+          content: () => h('span', `您确定解绑该相机!`),
+          onOk: async () => {
+            await await UnbindCameraApi({ cameraId: record.id });
+            createMessage.success(t('common.optSuccess'));
+            reload();
+          },
+        });
+      }
+      const handleSubmit = async () => {
+        closeModal();
+        emit('update');
+      };
+      function handleCopy(str: string) {
+        copyTextToClipboard(str)
+        createMessage.success('复制成功');
+      }
+      function handleVisibleChange(v) {
+        v && props.userData && nextTick(() => onDataReceive(props.userData));
+      }
+      return {
+        register,
+        registerList,
+        fileFlow,
+        handleVisibleChange,
+        handleSubmit,
+        handleCopy,
+        addListFunc,
+        registerSubtable,
+        reload,
+        closeModal,
+        handleDelete,
+        t,
+      };
+    },
+  });
+</script>

+ 2 - 1
src/views/empower/AddInstallModal.vue

@@ -19,7 +19,8 @@
   import { BasicModal, useModalInner } from '/@/components/Modal';
   import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
   import { useMessage } from '/@/hooks/web/useMessage';
-  import { remarkschemas, Addschemas } from './data';
+  import { remarkschemas, Addschemas } from '../.../../../data';
+  // import { remarkschemas, Addschemas } from '../.../../data';
   import { InvoiceRegister } from '/@/api/order';
   import { useI18n } from '/@/hooks/web/useI18n';
   import { uploadApi } from '/@/api/product/index';

+ 66 - 74
src/views/invoice/EditModal.vue

@@ -13,10 +13,16 @@
     <div class="pt-2px pr-3px">
       <BasicForm @register="registerForm">
         <template #text="{ model, field }">
-          {{ model[field]  }}
+          {{ model[field] }}
         </template>
         <template #img="{ model }">
-          <TableImg v-if="model.invoiceUrl" :size="200" :adaptations="true" :simpleShow="true" :imgList="[model.invoiceUrl]" />
+          <TableImg
+            v-if="model.invoiceUrl"
+            :size="200"
+            :adaptations="true"
+            :simpleShow="true"
+            :imgList="[model.invoiceUrl]"
+          />
         </template>
       </BasicForm>
     </div>
@@ -27,11 +33,8 @@
   import { BasicModal, useModalInner } from '/@/components/Modal';
   import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
   import { TableImg } from '/@/components/Table';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { InvoiceRegister, InvoiceDetail } from '/@/api/order';
+  import { InvoiceDetail } from '/@/api/order';
   import { useI18n } from '/@/hooks/web/useI18n';
-  import { uploadApi } from '/@/api/product/index';
-  import { ResultEnum } from '/@/enums/httpEnum';
 
   const { t } = useI18n();
   export default defineComponent({
@@ -42,71 +45,60 @@
     emits: ['update', 'register'],
     setup(props, { emit }) {
       const fileFlow = reactive({
-        file:null,
-        type:2,//2-普通发票,3-专用发票
-      })
-      const { createMessage } = useMessage();
+        file: null,
+        type: 2, //2-普通发票,3-专用发票
+      });
       const schemas: FormSchema[] = [
-          {
-            field: 'id',
-            component: 'Input',
-            show:false,
-            label: '发票编号',
-            required: true,
+        {
+          field: 'id',
+          component: 'Input',
+          show: false,
+          label: '发票编号',
+          required: true,
+        },
+        {
+          field: 'email',
+          component: 'Input',
+          label: '邮箱',
+          slot: 'text',
+          colProps: {
+            span: 24,
+          },
+        },
+        {
+          field: 'invoiceNum',
+          component: 'Input',
+          label: '发票编号',
+          slot: 'text',
+          required: true,
+          colProps: {
+            span: 24,
           },
-          {
-            field: 'email',
-            component: 'Input',
-            label: '邮箱',
-            slot: 'text',
-            ifShow:fileFlow.type == 2,
-            colProps: {
-              span: 24,
-            },
-          },{
-            field: 'invoiceNum',
-            component: 'Input',
-            label: '发票编号',
-            slot: 'text',
-            required: true,
-            colProps: {
-              span: 24,
-            },
-          },{
-            field: 'invoiceUrl',
-            component: 'Upload',
-            label: '电子发票',
-            ifShow:fileFlow.type == 2,
-            required: true,
-            slot: 'img',
-            colProps: {
-              span: 22,
-            },
-          },{
-            field: 'invoiceNum',
-            component: 'Input',
-            label: '发票编号',
-            required: true,
-            slot: 'text',
-            colProps: {
-              span: 24,
-            },
-          },{
-            field: 'shipNum',
-            component: 'Input',
-            ifShow:fileFlow.type == 3,
-            slot: 'text',
-            label: '快递单号',
-            required: true,
-            colProps: {
-              span: 24,
-            },
+        },
+        {
+          field: 'invoiceUrl',
+          component: 'Upload',
+          label: '电子发票',
+          required: true,
+          slot: 'img',
+          colProps: {
+            span: 22,
+          },
+        },
+        {
+          field: 'oddNumber',
+          component: 'Input',
+          slot: 'text',
+          label: '开票审批单号',
+          colProps: {
+            span: 24,
           },
+        },
       ];
 
-      const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
+      const [registerForm, { resetFields, setFieldsValue, updateSchema }] = useForm({
         labelWidth: 120,
-        schemas:schemas,
+        schemas: schemas,
         showActionButtonGroup: false,
         actionColOptions: {
           span: 24,
@@ -119,21 +111,21 @@
       });
       async function onDataReceive(data) {
         resetFields();
-        let detail = await InvoiceDetail({id:data.id})
-        fileFlow.type = data.type
+        let detail = await InvoiceDetail({ id: data.id });
+        fileFlow.type = data.type;
         setFieldsValue({
           ...data,
           ...detail,
         });
-        updateSchema([
-          {field: 'shipNum',ifShow:fileFlow.type == 3,},
-          {field: 'email',ifShow:fileFlow.type == 2,},
-          {field: 'invoiceUrl',ifShow:fileFlow.type == 2,},
-        ])
+        // updateSchema([
+        //   { field: 'shipNum', ifShow: fileFlow.type == 3 },
+        //   { field: 'email', ifShow: fileFlow.type == 2 },
+        //   { field: 'invoiceUrl', ifShow: fileFlow.type == 2 },
+        // ]);
       }
       const handleSubmit = async () => {
-          closeModal();
-          emit('update');
+        closeModal();
+        emit('update');
       };
       function handleVisibleChange(v) {
         v && props.userData && nextTick(() => onDataReceive(props.userData));

+ 92 - 106
src/views/invoice/InvoiceModal.vue

@@ -12,7 +12,7 @@
     <div class="pt-2px pr-3px">
       <BasicForm @register="registerForm">
         <template #text="{ model, field }">
-          {{ model[field]  }}
+          {{ model[field] }}
         </template>
       </BasicForm>
     </div>
@@ -37,99 +37,88 @@
     emits: ['update', 'register'],
     setup(props, { emit }) {
       const fileFlow = reactive({
-        file:null,
-        type:2,//2-普通发票,3-专用发票
-      })
-      const okText = ref('发送')
-      const loading = ref(false)
+        file: null,
+        type: 2, //2-普通发票,3-专用发票
+      });
+      const okText = ref('发送');
+      const loading = ref(false);
       const { createMessage } = useMessage();
       const schemas: FormSchema[] = [
-          {
-            field: 'id',
-            component: 'Input',
-            show:false,
-            label: '发票编号',
-            required: true,
+        {
+          field: 'id',
+          component: 'Input',
+          show: false,
+          label: '发票编号',
+          required: true,
+        },
+        {
+          field: 'email',
+          component: 'Input',
+          label: '邮箱',
+          slot: 'text',
+          componentProps: {
+            maxLength: 50,
           },
-          {
-            field: 'email',
-            component: 'Input',
-            label: '邮箱',
-            slot: 'text',
-            ifShow:fileFlow.type == 2,
-            componentProps: {
-              maxLength: 50,
-            },
-            colProps: {
-              span: 24,
-            },
-          },{
-            field: 'invoiceNum',
-            component: 'Input',
-            label: '发票编号',
-            required: true,
-            componentProps: {
-              maxLength: 50,
-            },
-            colProps: {
-              span: 24,
-            },
-          },{
-            field: 'file',
-            component: 'Upload',
-            label: '电子发票',
-            ifShow:fileFlow.type == 2,
-            required: true,
-            rules: [{ required: true, message: t('common.uploadMessge') }],
-            itemProps: {
-              validateTrigger: 'blur',
-            },
-            componentProps: {
-              api: uploadApi,
-              fileFlow:true,
-              maxNumber: 1,
-              maxSize: 1000,
-              accept: ['jpeg','jpg','png'],
-              afterFetch: function (data) {
-                console.log('url',data)
-                // Reflect.set(data, 'url', data.file);
-                fileFlow.file = data.file
-                return data;
-              },
+          colProps: {
+            span: 24,
+          },
+        },
+        {
+          field: 'invoiceNum',
+          component: 'Input',
+          label: '发票编号',
+          required: true,
+          componentProps: {
+            maxLength: 50,
+          },
+          colProps: {
+            span: 24,
+          },
+        },
+        {
+          field: 'file',
+          component: 'Upload',
+          label: '电子发票',
+          required: true,
+          rules: [{ required: true, message: t('common.uploadMessge') }],
+          itemProps: {
+            validateTrigger: 'blur',
+          },
+          componentProps: {
+            api: uploadApi,
+            fileFlow: true,
+            maxNumber: 1,
+            maxSize: 1000,
+            accept: ['jpeg', 'jpg', 'png'],
+            afterFetch: function (data) {
+              console.log('url', data);
+              // Reflect.set(data, 'url', data.file);
+              fileFlow.file = data.file;
+              return data;
             },
+          },
 
-            colProps: {
-              span: 22,
-            },
-          },{
-            field: 'invoiceNum',
-            component: 'Input',
-            label: '发票编号',
-            required: true,
-            componentProps: {
-              maxLength: 50,
-            },
-            colProps: {
-              span: 24,
-            },
-          },{
-            field: 'shipNum',
-            component: 'Input',
-            ifShow:fileFlow.type == 3,
-            label: '快递单号',
-            componentProps: {
-              maxLength: 50,
-            },
-            required: true,
-            colProps: {
-              span: 24,
-            },
+          colProps: {
+            span: 22,
+          },
+        },
+        {
+          field: 'oddNumber',
+          component: 'Input',
+          label: '开票审批单号',
+          componentProps: {
+            maxLength: 50,
           },
+          required: true,
+          colProps: {
+            span: 24,
+          },
+        },
       ];
 
       const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
         labelWidth: 120,
-        schemas:schemas,
+        schemas: schemas,
         showActionButtonGroup: false,
         actionColOptions: {
           span: 24,
@@ -142,40 +131,37 @@
       });
       function onDataReceive(data) {
         resetFields();
-        fileFlow.type = data.type
+        fileFlow.type = data.type;
         setFieldsValue(data);
-        okText.value = fileFlow.type == 2?'发送':'确认'
-        updateSchema([
-          {field: 'shipNum',ifShow:fileFlow.type == 3,},
-          {field: 'email',ifShow:fileFlow.type == 2,},
-          {field: 'file',ifShow:fileFlow.type == 2,},
-        ])
+        okText.value = fileFlow.type == 2 ? '发送' : '确认';
+        // updateSchema([
+        //   { field: 'shipNum', ifShow: fileFlow.type == 3 },
+        //   { field: 'email', ifShow: fileFlow.type == 2 },
+        //   { field: 'file', ifShow: fileFlow.type == 2 },
+        // ]);
       }
       const handleSubmit = async () => {
-        loading.value = true
+        loading.value = true;
         try {
           const params = await validate();
           const apiData = {
-            data:fileFlow.type == 3?{
-              id:params.id,
-              invoiceNum:params.invoiceNum,
-              shipNum:params.shipNum,
-            }:{
-              id:params.id,
-              invoiceNum:params.invoiceNum,
-              file:fileFlow.file,
-            // file:params.file[0],
-            }
-          }
-          console.log('res', apiData,params);
+            data: {
+              id: params.id,
+              invoiceNum: params.invoiceNum,
+              file: fileFlow.file,
+              oddNumber: params.oddNumber,
+              // file:params.file[0],
+            },
+          };
+          console.log('res', apiData, params);
           await InvoiceRegister(apiData);
           closeModal();
           resetFields();
           createMessage.success(t('common.optSuccess'));
           emit('update');
-          loading.value = false
+          loading.value = false;
         } catch (error) {
-          loading.value = false
+          loading.value = false;
           console.log('not passing', error);
         }
       };

+ 53 - 57
src/views/invoice/index.vue

@@ -2,32 +2,28 @@
   <div>
     <BasicTable @register="registerTable">
       <template #toolbar>
-        <a-button type="primary" @click="exportExcel" v-if="getCheckPerm('invoice-export')"> 导出</a-button>
+        <a-button type="primary" @click="exportExcel" v-if="getCheckPerm('invoice-export')">
+          导出</a-button
+        >
       </template>
       <template #action="{ record }">
-          <TableAction
-            stopButtonPropagation
-            :actions="[
-              {
-                label: '开票登记',
-                //icon: 'la:file-invoice-dollar',
-                ifShow:getCheckPerm('invoice-checkin') && record.invoiced==0,
-                onClick: handleInvoice.bind(null, record),
-              },
-              {
-                label: '电子发票',
-                ifShow:record.type == 2 && record.invoiced==1,
-                //icon: 'simple-icons:invoiceninja',
-                onClick: headleDetails.bind(null, record),
-              },
-              {
-                label: '快递单号',
-                ifShow:record.type != 2&& record.invoiced==1,
-                //icon: 'icon-park-outline:express-delivery',
-                onClick: headleDetails.bind(null, record),
-              },
-            ]"
-          />
+        <TableAction
+          stopButtonPropagation
+          :actions="[
+            {
+              label: '开票登记',
+              //icon: 'la:file-invoice-dollar',
+              ifShow: getCheckPerm('invoice-checkin') && record.invoiced == 0,
+              onClick: handleInvoice.bind(null, record),
+            },
+            {
+              label: '开票详情',
+              ifShow: record.invoiced == 1,
+              //icon: 'simple-icons:invoiceninja',
+              onClick: headleDetails.bind(null, record),
+            },
+          ]"
+        />
       </template>
     </BasicTable>
     <AddModal @update="reload" @register="registerAddModal" />
@@ -42,9 +38,9 @@
   import { Descriptions } from 'ant-design-vue';
   import { useI18n } from '/@/hooks/web/useI18n';
   import { useMessage } from '/@/hooks/web/useMessage';
-  import { InvoiceList,InvoiceExport } from '/@/api/order'
-  import { downloadByData } from '/@/utils/file/download'
-  import { searchForm, columns } from './data'
+  import { InvoiceList, InvoiceExport } from '/@/api/order';
+  import { downloadByData } from '/@/utils/file/download';
+  import { searchForm, columns } from './data';
   import AddModal from './InvoiceModal.vue';
   import EditModal from './EditModal.vue';
   import { usePermissionStore } from '/@/store/modules/permission';
@@ -58,11 +54,11 @@
     sortBy?: string;
   }
   export default defineComponent({
-    components: { 
+    components: {
       AddModal,
       EditModal,
-      BasicTable, 
-      TableAction, 
+      BasicTable,
+      TableAction,
       PageWrapper,
       TableImg,
       [Descriptions.name]: Descriptions,
@@ -81,7 +77,7 @@
         orderBy: '',
         sortBy: '',
       });
-      const { createMessage,createConfirm } = useMessage();
+      const { createMessage, createConfirm } = useMessage();
       const [registerAddModal, { openModal: openAddModal }] = useModal();
       const [registerEditModal, { openModal: openEditModal }] = useModal();
       const [registerTable, { reload }] = useTable({
@@ -92,25 +88,25 @@
         useSearchForm: true,
         formConfig: searchForm,
         showTableSetting: true,
-        showIndexColumn:false,
+        showIndexColumn: false,
         rowKey: 'id',
-        beforeFetch:(params) =>{
+        beforeFetch: (params) => {
           let searchData = {
-              orderSn: params.orderSn,
-              payTimeStart: params.payTime && params.payTime[0],
-              payTimeEnd: params.payTime && params.payTime[1],
-              invoiceTimeStart: params.invoiceTime && params.invoiceTime[0],
-              invoiceTimeEnd: params.invoiceTime && params.invoiceTime[1],
-          }
-          apiData.orderSn = searchData.orderSn
-          apiData.payTimeStart = searchData.payTimeStart
-          apiData.payTimeEnd = searchData.payTimeEnd
-          apiData.invoiceTimeStart = searchData.invoiceTimeStart
-          apiData.invoiceTimeEnd = searchData.invoiceTimeEnd
+            orderSn: params.orderSn,
+            payTimeStart: params.payTime && params.payTime[0],
+            payTimeEnd: params.payTime && params.payTime[1],
+            invoiceTimeStart: params.invoiceTime && params.invoiceTime[0],
+            invoiceTimeEnd: params.invoiceTime && params.invoiceTime[1],
+          };
+          apiData.orderSn = searchData.orderSn;
+          apiData.payTimeStart = searchData.payTimeStart;
+          apiData.payTimeEnd = searchData.payTimeEnd;
+          apiData.invoiceTimeStart = searchData.invoiceTimeStart;
+          apiData.invoiceTimeEnd = searchData.invoiceTimeEnd;
           return {
             ...params,
             ...searchData,
-          }
+          };
         },
         fetchSetting: {
           pageField: 'pageNum',
@@ -135,22 +131,22 @@
           ...record,
         });
       }
-    function handleEdit(record: Recordable) {
-      console.log('record', record);
-    }
-    function headleDetails(record: Recordable) {
-      console.log('record', record);
-      openEditModal(true, {
-        ...record,
-      });
-    }
-    function exportExcel() {
+      function handleEdit(record: Recordable) {
+        console.log('record', record);
+      }
+      function headleDetails(record: Recordable) {
+        console.log('record', record);
+        openEditModal(true, {
+          ...record,
+        });
+      }
+      function exportExcel() {
         createConfirm({
           iconType: 'warning',
           title: () => h('span', '温馨提示'),
           content: () => h('span', '确定导出当前发票所有记录?'),
           onOk: async () => {
-           await InvoiceExport(apiData);
+            await InvoiceExport(apiData);
           },
         });
       }
@@ -168,4 +164,4 @@
       };
     },
   });
-</script>
+</script>

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

@@ -0,0 +1,561 @@
+import { incrementUseTypeList } from '/@/api/account';
+import { FormSchema } from '/@/components/Form/index';
+import { BasicColumn, FormProps } from '/@/components/Table';
+import { Time } from '/@/components/Time';
+import { h } from 'vue';
+
+export const equitySearchForm: Partial<FormProps> = {
+  labelWidth: 100,
+  autoSubmitOnEnter: true,
+  autoAdvancedLine: 1,
+  actionColOptions: {
+    span: 24,
+  },
+  schemas: [
+    {
+      field: 'ctivated',
+      label: '下单时间',
+      component: 'RangePicker',
+      componentProps: {
+        maxLength: 100,
+        format: 'YYYY-MM-DD',
+        valueFormat: 'YYYY-MM-DD',
+      },
+      colProps: {
+        xl: 8,
+        xxl: 8,
+      },
+    },
+    {
+      field: 'orderSn',
+      label: '订单号',
+      component: 'Input',
+      componentProps: {
+        maxLength: 100,
+      },
+      colProps: {
+        xl: 8,
+        xxl: 8,
+      },
+    },
+
+    {
+      field: 'customerType',
+      component: 'Select',
+      label: '客户类别',
+      colProps: {
+        span: 8,
+      },
+      componentProps: {
+        options: [
+          {
+            label: '直销',
+            value: 0,
+            key: '0',
+          },
+          {
+            label: '经销',
+            value: 1,
+            key: '1',
+          },
+        ],
+      },
+    },
+    {
+      field: 'useType',
+      component: 'ApiSelect',
+      label: '使用类型',
+      componentProps: {
+        // filterOption: onFilterOption,
+        // showSearch: true,
+        api: incrementUseTypeList,
+        labelField: 'name',
+        valueField: 'id',
+        immediate: true,
+      },
+      colProps: {
+        span: 8,
+      },
+    },
+    {
+      field: 'companyName',
+      component: 'Select',
+      label: '合同所属公司',
+      colProps: {
+        span: 8,
+      },
+      itemProps: {
+        autoLink: false,
+      },
+      componentProps: {
+        options: [
+          {
+            label: '珠海市四维时代网络科技有限公司',
+            value: '珠海市四维时代网络科技有限公司',
+            key: '珠海市四维时代网络科技有限公司',
+          },
+          {
+            label: '广东四维看看智能设备有限公司',
+            value: '广东四维看看智能设备有限公司',
+            key: '广东四维看看智能设备有限公司',
+          },
+          {
+            label: '四维看看(香港)有限公司',
+            value: '四维看看(香港)有限公司',
+            key: '四维看看(香港)有限公司',
+          },
+          {
+            label: '四维看看(北京)数据科技有限公司',
+            value: '四维看看(北京)数据科技有限公司',
+            key: '四维看看(北京)数据科技有限公司',
+          },
+        ],
+      },
+    },
+    {
+      field: 'businessDept',
+      component: 'Select',
+      label: '业务部门',
+      colProps: {
+        span: 8,
+      },
+      itemProps: {
+        autoLink: false,
+      },
+      componentProps: {
+        options: [
+          {
+            label: '数字营销事业部',
+            value: '数字营销事业部',
+            key: '数字营销事业部',
+          },
+          {
+            label: '政企事业部',
+            value: '政企事业部',
+            key: '政企事业部',
+          },
+          {
+            label: '海外事业部',
+            value: '海外事业部',
+            key: '海外事业部',
+          },
+          {
+            label: '市场部',
+            value: '市场部',
+            key: '市场部',
+          },
+          {
+            label: '总经办',
+            value: '总经办',
+            key: '总经办',
+          },
+        ],
+      },
+    },
+    {
+      field: 'amount',
+      component: 'Input',
+      label: '订单金额',
+      colProps: { span: 7 },
+      componentProps: {
+        type: 'number',
+      },
+    },
+  ],
+};
+export const dowmColumns: BasicColumn[] = [
+  {
+    title: '下单时间',
+    dataIndex: 'createTime',
+    width: 150,
+    customRender: ({ record }) => {
+      return (
+        record.createTime &&
+        h(Time, {
+          value: record.createTime,
+          mode: 'datetime',
+        })
+      );
+    },
+  },
+  {
+    title: '订单号',
+    dataIndex: 'orderSn',
+    ellipsis: false,
+    width: 180,
+  },
+  {
+    title: '合同所属公司',
+    dataIndex: 'companyName',
+    ellipsis: true,
+    width: 230,
+  },
+  {
+    title: '业务部门',
+    dataIndex: 'businessDept',
+    ellipsis: true,
+    width: 120,
+  },
+  {
+    title: '业务员',
+    dataIndex: 'businessName',
+    ellipsis: true,
+    width: 120,
+  },
+  {
+    title: '客户付款时间',
+    dataIndex: 'customerPayTime',
+    ellipsis: true,
+    width: 160,
+  },
+  {
+    title: '客户名称',
+    dataIndex: 'customerName',
+    width: 100,
+  },
+  {
+    title: '客户类别',
+    dataIndex: 'customerTypeStr',
+    width: 100,
+    customRender: ({ record }) => {
+      return record.customerTypeStr ? record.customerTypeStr : '直销';
+    },
+  },
+  {
+    title: '终端客户',
+    dataIndex: 'endCustomer',
+    width: 100,
+  },
+  {
+    title: '经销商名称',
+    dataIndex: 'agentName',
+    width: 100,
+  },
+  {
+    title: '使用类型',
+    dataIndex: 'useTypeStr',
+    width: 100,
+  },
+  {
+    title: '权益类型',
+    dataIndex: 'memberLevels',
+    width: 100,
+  },
+  {
+    title: '订单金额',
+    dataIndex: 'amount',
+    width: 80,
+  },
+  {
+    title: '币种',
+    dataIndex: 'currencySymbol',
+    width: 80,
+  },
+  {
+    title: '数量',
+    dataIndex: 'count',
+    width: 80,
+  },
+  {
+    title: '支付方式',
+    dataIndex: 'payType',
+    // slots: { customRender: 'orderType' },
+    width: 80,
+  },
+  {
+    title: '交易号',
+    dataIndex: 'number',
+    width: 180,
+  },
+  {
+    title: '付款状态',
+    dataIndex: 'payStatus',
+    // slots: { customRender: 'orderStatus' },
+    customRender: ({ record }) => {
+      return record.payStatus ? record.payStatus : '-';
+    },
+    width: 80,
+  },
+  {
+    title: '充值方式',
+    dataIndex: 'payMethod',
+    width: 100,
+  },
+  {
+    title: '会员服务期限',
+    dataIndex: 'incrementTime',
+    width: 100,
+  },
+  {
+    title: 'SN码',
+    dataIndex: 'snCode',
+    width: 100,
+  },
+  {
+    title: '项目号',
+    dataIndex: 'projectNum',
+    width: 100,
+  },
+  {
+    title: '备注',
+    dataIndex: 'remark',
+    width: 100,
+  },
+];
+
+export const localCameraColumns: BasicColumn[] = [
+  {
+    title: '下单时间',
+    dataIndex: 'createTime',
+    width: 150,
+    customRender: ({ record }) => {
+      return (
+        record.createTime &&
+        h(Time, {
+          value: record.createTime,
+          mode: 'datetime',
+        })
+      );
+    },
+  },
+  {
+    title: '订单号',
+    dataIndex: 'orderSn',
+    ellipsis: false,
+    width: 180,
+  },
+  {
+    title: '合同所属公司',
+    dataIndex: 'companyName',
+    ellipsis: true,
+    width: 230,
+  },
+  {
+    title: '业务部门',
+    dataIndex: 'businessDept',
+    ellipsis: true,
+    width: 120,
+  },
+  {
+    title: '业务员',
+    dataIndex: 'businessName',
+    ellipsis: true,
+    width: 120,
+  },
+  {
+    title: '客户付款时间',
+    dataIndex: 'customerPayTime',
+    ellipsis: true,
+    width: 160,
+  },
+  {
+    title: '客户名称',
+    dataIndex: 'customerName',
+    width: 100,
+  },
+  {
+    title: '客户类别',
+    dataIndex: 'customerTypeStr',
+    width: 100,
+    customRender: ({ record }) => {
+      return record.customerTypeStr ? record.customerTypeStr : '直销';
+    },
+  },
+  {
+    title: '终端客户',
+    dataIndex: 'endCustomer',
+    width: 100,
+  },
+  {
+    title: '使用类型',
+    dataIndex: 'useTypeStr',
+    width: 100,
+  },
+  {
+    title: '订单金额',
+    dataIndex: 'amount',
+    width: 80,
+  },
+  {
+    title: '币种',
+    dataIndex: 'currencySymbol',
+    width: 80,
+  },
+  {
+    title: '数量',
+    dataIndex: 'count',
+    width: 80,
+  },
+  {
+    title: '付款状态',
+    dataIndex: 'payStatus',
+    // slots: { customRender: 'orderStatus' },
+    customRender: ({ record }) => {
+      return record.payStatus ? record.payStatus : '-';
+    },
+    width: 80,
+  },
+  {
+    title: '充值方式',
+    dataIndex: 'payMethod',
+    width: 100,
+  },
+  {
+    title: '客户机器码',
+    dataIndex: 'machineCode',
+    slots: { customRender: 'copy' },
+    width: 120,
+  },
+  {
+    title: '相机SN',
+    dataIndex: 'snCode',
+    width: 100,
+  },
+  {
+    title: '项目号',
+    dataIndex: 'projectNum',
+    width: 100,
+  },
+  {
+    title: '备注',
+    dataIndex: 'remark',
+    width: 100,
+  },
+];
+
+export const differenceColumns: BasicColumn[] = [
+  {
+    title: '下单时间',
+    dataIndex: 'createTime',
+    width: 150,
+    customRender: ({ record }) => {
+      return (
+        record.createTime &&
+        h(Time, {
+          value: record.createTime,
+          mode: 'datetime',
+        })
+      );
+    },
+  },
+  {
+    title: '订单号',
+    dataIndex: 'orderSn',
+    ellipsis: false,
+    width: 180,
+  },
+  {
+    title: '合同所属公司',
+    dataIndex: 'companyName',
+    ellipsis: true,
+    width: 230,
+  },
+  {
+    title: '业务部门',
+    dataIndex: 'businessDept',
+    ellipsis: true,
+    width: 120,
+  },
+  {
+    title: '业务员',
+    dataIndex: 'businessName',
+    ellipsis: true,
+    width: 120,
+  },
+  {
+    title: '客户付款时间',
+    dataIndex: 'customerPayTime',
+    ellipsis: true,
+    width: 160,
+  },
+  {
+    title: '客户名称',
+    dataIndex: 'customerName',
+    width: 100,
+  },
+  {
+    title: '客户类别',
+    dataIndex: 'customerTypeStr',
+    width: 100,
+    customRender: ({ record }) => {
+      return record.customerTypeStr ? record.customerTypeStr : '直销';
+    },
+  },
+  {
+    title: '终端客户',
+    dataIndex: 'endCustomer',
+    width: 100,
+  },
+  {
+    title: '使用类型',
+    dataIndex: 'useTypeStr',
+    width: 100,
+  },
+  {
+    title: '订单金额',
+    dataIndex: 'amount',
+    width: 80,
+  },
+  {
+    title: '币种',
+    dataIndex: 'currencySymbol',
+    width: 80,
+  },
+  {
+    title: '数量',
+    dataIndex: 'count',
+    width: 80,
+  },
+  {
+    title: '付款状态',
+    dataIndex: 'payStatus',
+    // slots: { customRender: 'orderStatus' },
+    customRender: ({ record }) => {
+      return record.payStatus ? record.payStatus : '-';
+    },
+    width: 80,
+  },
+  {
+    title: '充值方式',
+    dataIndex: 'payMethod',
+    width: 100,
+  },
+  {
+    title: '相机SN',
+    dataIndex: 'snCode',
+    width: 100,
+  },
+  {
+    title: '板卡SN号',
+    dataIndex: 'rtkSnCode',
+    width: 265,
+  },
+  {
+    title: '深光rtk插件SN号',
+    ellipsis: true,
+    dataIndex: 'sgRtkSn',
+    customRender: ({ record }) => {
+      return record.sgRtkSn || '-';
+    },
+    width: 160,
+  },
+  {
+    title: '差分账号期限',
+    ellipsis: true,
+    dataIndex: 'sgRtkSn',
+    customRender: ({ record }) => {
+      return record.sgRtkSn || '-';
+    },
+    width: 160,
+  },
+  {
+    title: '项目号',
+    dataIndex: 'projectNum',
+    width: 100,
+  },
+  {
+    title: '备注',
+    dataIndex: 'remark',
+    width: 100,
+  },
+];

+ 124 - 0
src/views/order/differenceList.vue

@@ -0,0 +1,124 @@
+<template>
+  <BasicTable @register="registerTable">
+    <template #toolbar>
+      <a-button type="primary" @click="exportExcel" v-if="getCheckPerm('download-order-export')">
+        导出</a-button
+      >
+    </template>
+    <template #bodyCell="{ column, record }">
+      <template v-if="column.key === 'action'">
+        <TableAction
+          stopButtonPropagation
+          :actions="[
+            {
+              label: '删除',
+              //icon: 'ic:outline-delete-outline',
+              onClick: handleDelete.bind(null, record),
+            },
+          ]"
+          :dropDownActions="[
+            {
+              label: '启用',
+              popConfirm: {
+                title: '是否启用?',
+                confirm: handleOpen.bind(null, record),
+              },
+            },
+          ]"
+        />
+      </template>
+    </template>
+  </BasicTable>
+</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 { Descriptions } from 'ant-design-vue';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { authorizeRtkList, DownExport } from '/@/api/order';
+  import { downloadByData } from '/@/utils/file/download';
+  import { usePermissionStore } from '/@/store/modules/permission';
+  import { dowmColumns, equitySearchForm } from './data';
+
+  export default defineComponent({
+    components: {
+      BasicTable,
+      TableAction,
+      PageWrapper,
+      TableImg,
+      [Descriptions.name]: Descriptions,
+      [Descriptions.Item.name]: Descriptions.Item,
+    },
+    setup() {
+      const { t } = useI18n();
+      const isSearch = ref(false);
+      const { createConfirm } = useMessage();
+      const permissionStore = usePermissionStore();
+      const { getCheckPerm } = permissionStore;
+      const [registerTable] = useTable({
+        api: authorizeRtkList,
+        title: '差分账号订单列表',
+        // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
+        columns: dowmColumns,
+        useSearchForm: true,
+        formConfig: equitySearchForm,
+        showTableSetting: true,
+        showIndexColumn: false,
+        rowKey: 'id',
+        beforeFetch: (T) => {
+          const { ctivated, tradeNum, userName, orderSn } = T;
+          if (ctivated || tradeNum || userName || orderSn) {
+            isSearch.value = true;
+          } else {
+            isSearch.value = false;
+          }
+          if (T.ctivated) {
+            T.startTime = T.ctivated[0];
+            T.endTime = T.ctivated[1];
+          }
+          return T;
+        },
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },
+        canResize: true,
+      });
+      function handleDelete(record: Recordable) {
+        console.log('点击了删除', record);
+      }
+      function handleOpen(record: Recordable) {
+        console.log('点击了启用', record);
+      }
+      function exportExcel() {
+        createConfirm({
+          iconType: 'warning',
+          title: () => h('span', '温馨提示'),
+          content: () => h('span', isSearch.value ? '确认导出搜索结果?' : '确认导出全部?'),
+          onOk: async () => {
+            DownExport();
+          },
+        });
+      }
+      return {
+        registerTable,
+        handleDelete,
+        handleOpen,
+        exportExcel,
+        getCheckPerm,
+      };
+    },
+  });
+</script>

+ 135 - 0
src/views/order/localCameraList.vue

@@ -0,0 +1,135 @@
+<template>
+  <BasicTable @register="registerTable">
+    <template #toolbar>
+      <a-button type="primary" @click="exportExcel" v-if="getCheckPerm('download-order-export')">
+        导出</a-button
+      >
+    </template>
+    <template #copy="{ text }">
+        <a @click="handleCopy(text)">
+          {{ text }}
+        </a>
+      </template>
+    <template #bodyCell="{ column, record }">
+      <template v-if="column.key === 'action'">
+        <TableAction
+          stopButtonPropagation
+          :actions="[
+            {
+              label: '删除',
+              //icon: 'ic:outline-delete-outline',
+              onClick: handleDelete.bind(null, record),
+            },
+          ]"
+          :dropDownActions="[
+            {
+              label: '启用',
+              popConfirm: {
+                title: '是否启用?',
+                confirm: handleOpen.bind(null, record),
+              },
+            },
+          ]"
+        />
+      </template>
+    </template>
+  </BasicTable>
+</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 { Descriptions } from 'ant-design-vue';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { authorizeCameraList, DownExport } from '/@/api/order';
+  import { downloadByData } from '/@/utils/file/download';
+  import { usePermissionStore } from '/@/store/modules/permission';
+  import { localCameraColumns, equitySearchForm } from './data';
+  import { copyTextToClipboard } from '/@/hooks/web/useCopyToClipboard';
+
+  export default defineComponent({
+    components: {
+      BasicTable,
+      TableAction,
+      PageWrapper,
+      TableImg,
+      [Descriptions.name]: Descriptions,
+      [Descriptions.Item.name]: Descriptions.Item,
+    },
+    setup() {
+      const { t } = useI18n();
+      const isSearch = ref(false);
+      const { createConfirm, createMessage } = useMessage();
+      const permissionStore = usePermissionStore();
+      const { getCheckPerm } = permissionStore;
+      const [registerTable] = useTable({
+        api: authorizeCameraList,
+        title: '本地版相机授权订单列表',
+        // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
+        columns: localCameraColumns,
+        useSearchForm: true,
+        formConfig: equitySearchForm,
+        showTableSetting: true,
+        showIndexColumn: false,
+        rowKey: 'id',
+        beforeFetch: (T) => {
+          const { ctivated, tradeNum, userName, orderSn } = T;
+          if (ctivated || tradeNum || userName || orderSn) {
+            isSearch.value = true;
+          } else {
+            isSearch.value = false;
+          }
+          if (T.ctivated) {
+            T.startTime = T.ctivated[0];
+            T.endTime = T.ctivated[1];
+          }
+          return T;
+        },
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },
+        canResize: true,
+      });
+      function handleDelete(record: Recordable) {
+        console.log('点击了删除', record);
+      }
+      function handleOpen(record: Recordable) {
+        console.log('点击了启用', record);
+      }
+      function handleCopy(str: string) {
+        copyTextToClipboard(str);
+        createMessage.success('复制成功');
+      }
+      function exportExcel() {
+        createConfirm({
+          iconType: 'warning',
+          title: () => h('span', '温馨提示'),
+          content: () => h('span', isSearch.value ? '确认导出搜索结果?' : '确认导出全部?'),
+          onOk: async () => {
+            DownExport();
+          },
+        });
+      }
+      return {
+        registerTable,
+        handleDelete,
+        handleOpen,
+        exportExcel,
+        getCheckPerm,
+        handleCopy,
+      };
+    },
+  });
+</script>

+ 7 - 5
src/views/productOperation/data.ts

@@ -417,9 +417,6 @@ export const getColumns = (val) => {
       title: '点位数量',
       dataIndex: 'shootCount',
       width: 80,
-      // customRender: ({ record }) => {
-      //   return ( tableType.value == 2 || tableType.value == 6 )||!record.shootCount ? '-' : record.shootCount
-      // },
     },
     {
       title: '场景大小',
@@ -433,9 +430,9 @@ export const getColumns = (val) => {
     },
     {
       title: 'slam帧数',
-      ifShow: isobj,
+      ifShow: isobj || val == 2 || val == 6,
       dataIndex: 'slamCount',
-      width: 180,
+      width: 80,
     },
     {
       title: '拍摄位置',
@@ -597,6 +594,11 @@ export const getVrColumns = () => {
       width: 120,
       slots: { customRender: 'status' },
     },
+    // {
+    //   title: '切图状态',
+    //   dataIndex: 'qtstatus',
+    //   width: 120,
+    // },
     {
       title: '操作',
       dataIndex: 'action',

+ 154 - 0
src/views/productOperation/modal/cutpriorityMoadl.vue

@@ -0,0 +1,154 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    title="切图优先级设置"
+    @ok="handleSubmit"
+    :width="600"
+    :height="300"
+    :min-height="0"
+  >
+    <div class="pt-2px pr-3px">
+      <div style="padding-left: 64px; line-height: 32px">全景VR,全景图切图优先级设置</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', 'clearSelected'],
+    setup(props, { emit }) {
+      const modelRef = ref({
+        num: '',
+        numList: [],
+        cutDiagram: false,
+      });
+      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: 24,
+          },
+          defaultValue: 2,
+          componentProps: {
+            placeholder: '请输入相机SN码',
+            maxLength: 15,
+            api: async function (params) {
+              const res = (await mqQueueConfigList(params)) as any as TreeNode[];
+              return res.map(ele => {
+                let remark = ele.remark.replace('${openScalingTime}', ele.openScalingTime);
+                remark = remark.replace('${scalingThreshold}', ele.scalingThreshold);
+                return {...ele, name: remark}
+              });
+            },
+            // numberToString: true,
+            labelField: 'name',
+            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) {
+        modelRef.value.cutDiagram = data.cutDiagram;
+        let { id } = await getInfo(data);
+        modelRef.value = data;
+        resetFields();
+        updateSchema({
+          field: 'type',
+          ifShow: false,
+        });
+        setFieldsValue({
+          num: data.num,
+          cameraId: data.num ? '' : data.cameraId,
+          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');
+          emit('clearSelected');
+        } 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>

+ 33 - 8
src/views/productOperation/modal/priorityMoadl.vue

@@ -2,13 +2,14 @@
   <BasicModal
     v-bind="$attrs"
     @register="register"
-    title="优先级设置"
+    :title="model.cutDiagram?'切图优先级设置':'优先级设置'"
     @ok="handleSubmit"
     :width="600"
     :height="300"
     :min-height="0"
   >
     <div class="pt-2px pr-3px">
+      <div v-if="model.cutDiagram" style="padding-left: 64px; line-height: 32px;" >全景VR,全景图切图优先级设置</div>
       <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 }">
@@ -36,7 +37,8 @@
     setup(props, { emit }) {
       const modelRef = ref({
         num: '',
-        numList: []
+        numList: [],
+        cutDiagram: false,
       });
       const fileFlow = reactive({
         file: null,
@@ -56,12 +58,18 @@
           show: false,
         },
         {
+          field: 'type',
+          component: 'Input',
+          label: 'num',
+          show: false,
+        },
+        {
           field: 'configId',
           component: 'ApiRadioGroup',
           label: '优先级',
           required: true,
           colProps: {
-            span: 16,
+            span: 24,
           },
           defaultValue: 2,
           componentProps: {
@@ -104,23 +112,40 @@
       });
 
       async function onDataReceive(data) {
+        modelRef.value.cutDiagram = data.cutDiagram;
+        data.type = data.cutDiagram ? 'pano' : '4dkk';
         let { id } = await getInfo(data);
         modelRef.value = data;
         resetFields();
-        updateSchema({
-          field: 'type',
-          ifShow: false,
-        });
+        updateSchema([
+          {
+            field: 'type',
+            ifShow: false,
+          },
+          {
+            field: 'configId',
+            componentProps: {
+              params: {
+                agentName: '',
+                type: data.type,
+              },
+            }
+          }
+        ]);
         setFieldsValue({
           num: data.num,
           cameraId: data.num ? '' : data.cameraId,
           configId: id,
+          type: data.type,
         });
       }
       const handleSubmit = async () => {
         try {
           const params = await validate();
-          const res = await updateModelingLevel(params);
+          const res = await updateModelingLevel({
+            ...params,
+            type: modelRef.value.cutDiagram ? 'pano' : '4dkk',
+          });
           console.log('res', res);
           closeModal();
           resetFields();

+ 13 - 1
src/views/productOperation/viewKankan.vue

@@ -73,11 +73,16 @@
                 onClick: handleMove.bind(null, record),
               },
               {
-                label: '优先级',
+                label: '计算优先级',
                 ifShow: getTypeCheckPerm('scenes-priority') && record.calcStatus == -4,
                 onClick: handlePriority.bind(null, record),
               },
               {
+                label: '切图优先级',
+                ifShow: getTypeCheckPerm('scenes-priority') && record.calcStatus == 1 && record.panoStatus == 1,
+                onClick: handleQtPriority.bind(null, record),
+              },
+              {
                 label: '解冻',
                 disabled: !record.isColdStorage || !record.calcStatus == 1,
                 ifShow: getTypeCheckPerm('scenes-thaw'),
@@ -288,6 +293,12 @@
       function handlePriority(record) {
         openPriorityModal(true, record);
       }
+      function handleQtPriority(record) {
+        openPriorityModal(true, {
+          ...record,
+          cutDiagram: true,
+        });
+      }
       function handleMoveAll() {
         let numList = getSelectRowKeys() || [];
         if (numList.length == 0) {
@@ -426,6 +437,7 @@
         reload,
         handleMoveAll,
         handlePriority,
+        handleQtPriority,
         openDownModal,
         registerDownModal,
         registerMoveModal,

+ 20 - 6
src/views/system/menu/index.vue

@@ -1,8 +1,15 @@
 <template>
   <div>
-    <BasicTable @register="registerTable" @fetch-success="onFetchSuccess" :searchInfo="searchInfo">
+    <BasicTable
+      class="mytestTable"
+      @register="registerTable"
+      @fetch-success="onFetchSuccess"
+      :searchInfo="searchInfo"
+    >
       <template #toolbar>
-        <a-button type="primary" @click="handleCreate" v-if="getCheckPerm('menu-add')"> {{ t('routes.system.newMenu') }} </a-button>
+        <a-button type="primary" @click="handleCreate" v-if="getCheckPerm('menu-add')">
+          {{ t('routes.system.newMenu') }}
+        </a-button>
       </template>
       <template #action="{ record }">
         <TableAction
@@ -10,14 +17,14 @@
             {
               label: '编辑',
               //icon: 'clarity:note-edit-line',
-              ifShow:getCheckPerm('menu-update'),
+              ifShow: getCheckPerm('menu-update'),
               onClick: handleEdit.bind(null, record),
             },
             {
               label: '删除',
               //icon: 'ant-design:delete-outlined',
               color: 'error',
-              ifShow:getCheckPerm('menu-delete'),
+              ifShow: getCheckPerm('menu-delete'),
               onClick: handleDelete.bind(null, record),
             },
           ]"
@@ -108,9 +115,9 @@
           title: () => h('span', '温馨提示'),
           content: () => h('span', `您确定删除${record.name}!`),
           onOk: async () => {
-            await deleteMenuApi({id:record.id});
+            await deleteMenuApi({ id: record.id });
             createMessage.success(t('common.optSuccess'));
-            reload()
+            reload();
           },
         });
       }
@@ -139,3 +146,10 @@
     },
   });
 </script>
+<style lang="less">
+  .mytestTable {
+    .ant-table-cell-content {
+      display: inline-block !important;
+    }
+  }
+</style>