Procházet zdrojové kódy

修改接口绑定

tangning před 2 roky
rodič
revize
50478e3a9e

+ 1 - 1
src/api/customer/index.ts

@@ -7,7 +7,7 @@ enum Api {
   companyAdd = '/service/manage/company/add',
   companyUpdate = '/service/manage/company/update',
   companyDelete = '/service/manage/company/delete',
-  cameraList = '/service/manage/camera/list',
+  cameraList = '/service/agent/camera',
   companyUploadExcel = '/service/manage/excel/uploadExcel',
   downTemplate = '/service/manage/excel/downTemplate',
 }

+ 89 - 0
src/api/equity/index.ts

@@ -0,0 +1,89 @@
+import { defHttp } from '/@/utils/http/axios';
+import { listParams, checkParams, dincrementResult } from './model'
+import { Result } from '/#/axios';
+
+enum Api {
+  incrementAdd = '/service/agent/increment/add',
+  incrementRenew = '/service/agent/increment/renew',
+  checkUserName = '/service/agent/increment/checkUserName',
+  listApi = '/service/agent/increment/list',
+  allList = '/service/agent/incrementType/allList',
+  addDowm = '/service/agent/down/add',
+  dowmList = '/service/agent/down/list'
+}
+
+export const listApi = (params:listParams) =>
+  defHttp.post<Result>({
+    url: Api.listApi,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const dowmListApi = (params:listParams) =>
+  defHttp.post<Result>({
+    url: Api.dowmList,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const addApi = (params:checkParams) =>
+  defHttp.post<Result>({
+    url: Api.incrementAdd,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+//权益延期
+export const dincrementList = (params) =>
+defHttp.get<dincrementResult>({
+  url: Api.allList,
+  params: params,
+  headers: {
+    // @ts-ignore
+    ignoreCancelToken: true,
+  },
+});
+export const renewApi = (params:checkParams) =>
+  defHttp.post<Result>({
+    url: Api.incrementRenew,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const checkUserName = (params:checkParams) =>
+    defHttp.get<Result>({
+      url: Api.checkUserName,
+      params: params,
+      // data: params,
+      headers: {
+        // @ts-ignore
+        ignoreCancelToken: true,
+      },
+});
+
+export const addDowm = (params:checkParams) =>
+    defHttp.post<Result>({
+      url: Api.addDowm,
+      params: params,
+      // data: params,
+      headers: {
+        // @ts-ignore
+        ignoreCancelToken: true,
+      },
+});

+ 16 - 0
src/api/equity/model.ts

@@ -0,0 +1,16 @@
+import { BasicPageParams, BasicFetchResult } from '/@/api/model/baseModel';
+/**
+ * @description: Request list interface parameters
+ */
+export type PageParams = BasicPageParams;
+export interface listParams {
+  id?: string;
+  userName?: string;
+  incrementTypeId?: string;
+}
+export interface checkParams {
+  userName: string;
+}
+export interface dincrementResult {
+  list: [any];
+}

+ 52 - 0
src/api/finance/index.ts

@@ -0,0 +1,52 @@
+import { defHttp } from '/@/utils/http/axios';
+import { Result, FileStream } from '/#/axios';
+
+enum Api {
+  logData = '/service/agent/log/logData',
+  logList = '/service/agent/log/logList',
+  export = '/service/agent/log/export',
+}
+
+/**
+ * @description: Get sample list value
+ */
+
+ interface logDataResule {
+  lastDownNum: number;
+  lastHighNum: number;
+  lastMajorNum: number;
+}
+ export const logData = (params) =>
+ defHttp.get<logDataResule>({
+   url: Api.logData,
+   params: params,
+   headers: {
+     // @ts-ignore
+     ignoreCancelToken: true,
+   },
+ });
+
+ 
+ export const logList = (params) =>
+ defHttp.post<Result>({
+   url: Api.logList,
+   params: params,
+   // data: params,
+   headers: {
+     // @ts-ignore
+     ignoreCancelToken: true,
+   },
+ });
+
+ export const DownExport = (params) =>
+  defHttp.downloadFile<FileStream>({
+    url: Api.export,
+    params: params,
+    fileName:'销售统计.xlsx',
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+    responseType: 'blob'
+  });

+ 3 - 3
src/api/operate/index.ts

@@ -33,12 +33,12 @@ enum Api {
   intercomMessageList = '/service/manage/intercomMessage/list',
   intercomMessageHandle = '/service/manage/intercomMessage/handle',
 
-  operateSceneList = '/service/manage/scene/list',
-  sceneMove = '/service/manage/scene/move',
+  operateSceneList = '/service/agent/scene/list',
+  sceneMove = '/service/agent/scene/move',
   sceneDelete = '/service/manage/scene/delete',
   qjsceneDelete = '/service/manage/overall/delete',
   sceneDownload = '/service/manage/scene/downScene',
-  sceneCopy = '/service/manage/scene/copy',
+  sceneCopy = '/service/agent/scene/copy',
   checkDownLoad = '/service/manage/scene/checkDownLoad',
   downloadProcess = '/service/manage/scene/downloadProcess',
   rebuildScene = '/service/manage/scene/rebuildScene',

+ 1 - 1
src/api/order/index.ts

@@ -17,7 +17,7 @@ enum Api {
   incrementExport = '/service/manage/order/increment/export',
   downList = '/service/manage/order/down/list',
   downExport = '/service/manage/order/down/export',
-  pageInvoice = '/service/manage/invoice/pageInvoice',
+  pageInvoice = '/service/agent/increment/list',
   exportInvoice = '/service/manage/invoice/export',
   invoiceRegister = '/service/manage/invoice/invoiceRegister',
   getInvoiceRegisterDetail = '/service/manage/invoice/getInvoiceRegisterDetail',

+ 4 - 1
src/api/sys/model/userModel.ts

@@ -1,3 +1,4 @@
+import type { UserInfo, UserAgent } from '/#/store';
 /**
  * @description: Login interface parameters
  */
@@ -22,6 +23,8 @@ export interface LoginResultModel {
   roleName: string;
   userName: string;
   roleId: number;
+  agent:UserAgent;
+  user:UserInfo;
 }
 
 /**
@@ -42,5 +45,5 @@ export interface GetUserInfoModel {
   desc?: string;
   // 权限
   roleId: number;
-
+  agent:UserAgent;
 }

+ 6 - 5
src/api/sys/user.ts

@@ -1,3 +1,4 @@
+import type { UserInfo } from '/#/store';
 import { defHttp } from '/@/utils/http/axios';
 import { LoginParams, LoginResultModel, GetUserInfoModel } from './model/userModel';
 import { encodeStr } from '/@/utils/encodeUtil';
@@ -6,9 +7,9 @@ import type { AppRouteRecordRaw } from '/@/router/types';
 
 enum Api {
   // Login = '/basic-api/login',
-  Login = '/service/manage/login',
-  Logout = '/service/manage/logout',
-  GetUserInfo = '/service/manage/sysUser/getInfo',
+  Login = '/service/agent/fdLogin',
+  Logout = '/service/agent/fdLogout',
+  GetUserInfo = '/service/agent/getUserInfo',
   GetPermCode = '/service/manage/sysMenu/getButtonByUserId',
 }
 
@@ -21,7 +22,7 @@ export function loginApi(params: LoginParams, mode: ErrorMessageMode = 'modal')
       url: Api.Login,
       params:{
         ...params,
-        userName:params.username,
+        phoneNum:params.username,
         password: encodeStr(window.btoa(params.password))
     },
     },
@@ -35,7 +36,7 @@ export function loginApi(params: LoginParams, mode: ErrorMessageMode = 'modal')
  * @description: getUserInfo
  */
 export function getUserInfo() {
-  return defHttp.get<GetUserInfoModel>({ url: Api.GetUserInfo }, { errorMessageMode: 'none' });
+  return defHttp.post<UserInfo>({ url: Api.GetUserInfo }, { errorMessageMode: 'none' });
 }
 
 export function getPermCode() {

+ 1 - 0
src/enums/cacheEnum.ts

@@ -8,6 +8,7 @@ export const USER_INFO_KEY = 'USER__INFO__';
 
 // role info key
 export const ROLES_KEY = 'ROLES__KEY__';
+export const AGENT_KEY = 'USER__AGENT__';
 
 // project config key
 export const PROJ_CFG_KEY = 'PROJ__CFG__KEY__';

+ 1 - 1
src/enums/pageEnum.ts

@@ -2,7 +2,7 @@ export enum PageEnum {
   // basic login path
   BASE_LOGIN = '/login',
   // basic home path
-  BASE_HOME = '/dashboard/analysis',
+  BASE_HOME = '/device/index',
   // error page path
   ERROR_PAGE = '/exception',
   // error log page path

+ 10 - 3
src/locales/lang/zh-CN/routes/staff.ts

@@ -11,8 +11,15 @@ export default {
   staffList: '账号列表',
   updateBtn: '修改密码',
   password: '修改密码',
-  roleType: {
-    0: '公司管理员',
-    1: '公司员工',
+  equityType: {
+    0: '专业会员(年)',
+    1: '高级会员(月)',
+    2: '场景下载',
+  },
+  giveType: {
+    0: '经销商授权',
+    1: '经销商续费',
+    2: '官网自购',
+    3: '平台授权',
   },
 };

+ 2 - 1
src/router/routes/modules/dashboard.ts

@@ -12,7 +12,8 @@ const dashboard: AppRouteModule = {
     orderNo: 1,
     icon: 'ion:grid-outline',
     title: t('routes.dashboard.dashboard'),
-    hideChildrenInMenu: true,
+    hideMenu:false,
+    hideChildrenInMenu: false,
   },
   children: [
     {

+ 22 - 9
src/store/modules/user.ts

@@ -1,10 +1,10 @@
-import type { UserInfo } from '/#/store';
+import type { UserInfo, UserAgent } from '/#/store';
 import type { ErrorMessageMode } from '/#/axios';
 import { defineStore } from 'pinia';
 import { store } from '/@/store';
 import { RoleEnum } from '/@/enums/roleEnum';
 import { PageEnum } from '/@/enums/pageEnum';
-import { ROLES_KEY, TOKEN_KEY, USER_INFO_KEY } from '/@/enums/cacheEnum';
+import { ROLES_KEY, TOKEN_KEY, USER_INFO_KEY, AGENT_KEY } from '/@/enums/cacheEnum';
 import { getAuthCache, setAuthCache } from '/@/utils/auth';
 import { GetUserInfoModel, LoginParams } from '/@/api/sys/model/userModel';
 import { doLogout, getUserInfo, loginApi } from '/@/api/sys/user';
@@ -23,6 +23,7 @@ interface UserState {
   roleList: RoleEnum[];
   sessionTimeout?: boolean;
   lastUpdateTime: number;
+  agent: Nullable<UserAgent>;
 }
 
 export const useUserStore = defineStore({
@@ -38,6 +39,8 @@ export const useUserStore = defineStore({
     sessionTimeout: false,
     // Last fetch time
     lastUpdateTime: 0,
+    // 经销商信息
+    agent: null
   }),
   getters: {
     getUserInfo(): UserInfo {
@@ -49,6 +52,9 @@ export const useUserStore = defineStore({
     getRoleList(): RoleEnum[] {
       return this.roleList.length > 0 ? this.roleList : getAuthCache<RoleEnum[]>(ROLES_KEY);
     },
+    getAgent(): UserAgent {
+      return this.agent || getAuthCache<UserAgent>(AGENT_KEY);
+    },
     getSessionTimeout(): boolean {
       return !!this.sessionTimeout;
     },
@@ -65,6 +71,11 @@ export const useUserStore = defineStore({
       this.roleList = roleList;
       setAuthCache(ROLES_KEY, roleList);
     },
+    setAgent(agent: UserAgent){
+      console.log('setAgent',agent)
+      this.agent = agent;
+      setAuthCache(AGENT_KEY, agent);
+    },
     setUserInfo(info: UserInfo | null) {
       this.userInfo = info;
       this.lastUpdateTime = new Date().getTime();
@@ -91,13 +102,14 @@ export const useUserStore = defineStore({
       try {
         const { goHome = true, mode, ...loginParams } = params;
         const data = await loginApi(loginParams, mode);
-        const { token } = data;
+        const { token, user, agent } = data;
+        this.setAgent(agent)
         this.setUserInfo({
-          ...data,
-          userId:data.userId,
-          realName: data.roleName,
-          username:data.userName,
-          avatar:data.avatar||'https://q1.qlogo.cn/g?b=qq&nk=339449197&s=640',
+          ...user,
+          userId:user.id,
+          realName: user.nickName,
+          username:user.userName,
+          avatar:user.head||'https://q1.qlogo.cn/g?b=qq&nk=339449197&s=640',
           roles:[data.roleId],
         });
         // save token
@@ -132,7 +144,8 @@ export const useUserStore = defineStore({
     async getUserInfoAction(): Promise<UserInfo | null> {
       if (!this.getToken) return null;
       const userInfo = await getUserInfo();
-      const { roleId  } = userInfo;
+      const { roleId, agent = null } = userInfo;
+      this.setAgent(agent)
       if (isArray(roleId)) { 
         const roleList = roleId.map((item) => item.value) as RoleEnum[];
         this.setRoleList(roleList);

+ 5 - 3
src/utils/cache/persistent.ts

@@ -1,4 +1,4 @@
-import type { LockInfo, UserInfo } from '/#/store';
+import type { LockInfo, UserInfo, UserAgent } from '/#/store';
 import type { ProjectConfig } from '/#/config';
 import type { RouteLocationNormalized } from 'vue-router';
 
@@ -7,6 +7,7 @@ import { Memory } from './memory';
 import {
   TOKEN_KEY,
   USER_INFO_KEY,
+  AGENT_KEY,
   ROLES_KEY,
   LOCK_INFO_KEY,
   PROJ_CFG_KEY,
@@ -22,6 +23,7 @@ interface BasicStore {
   [TOKEN_KEY]: string | number | null | undefined;
   [USER_INFO_KEY]: UserInfo;
   [ROLES_KEY]: string[];
+  [AGENT_KEY]: UserAgent;
   [LOCK_INFO_KEY]: LockInfo;
   [LOCK_INFO_KEY]: LockInfo;
   [PROJ_CFG_KEY]: ProjectConfig;
@@ -102,11 +104,11 @@ window.addEventListener('beforeunload', function () {
   // LOCK_INFO_KEY 在锁屏和解锁时写入,此处也不应修改
   ls.set(APP_LOCAL_CACHE_KEY, {
     ...omit(localMemory.getCache, LOCK_INFO_KEY),
-    ...pick(ls.get(APP_LOCAL_CACHE_KEY), [TOKEN_KEY, USER_INFO_KEY, LOCK_INFO_KEY]),
+    ...pick(ls.get(APP_LOCAL_CACHE_KEY), [TOKEN_KEY, USER_INFO_KEY, LOCK_INFO_KEY, AGENT_KEY]),
   });
   ss.set(APP_SESSION_CACHE_KEY, {
     ...omit(sessionMemory.getCache, LOCK_INFO_KEY),
-    ...pick(ss.get(APP_SESSION_CACHE_KEY), [TOKEN_KEY, USER_INFO_KEY, LOCK_INFO_KEY]),
+    ...pick(ss.get(APP_SESSION_CACHE_KEY), [TOKEN_KEY, USER_INFO_KEY, LOCK_INFO_KEY, AGENT_KEY]),
   });
 });
 

+ 54 - 136
src/views/device/index.vue

@@ -2,12 +2,12 @@
   <PageWrapper contentBackground>
     <div class="desc-wrap-BasicTable">
       <BasicTable @register="registerTable">
-        <template #toolbar>
+        <!--<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>
         </template>
-        <template #action="{ record }">
+         <template #action="{ record }">
           <TableAction
             stopButtonPropagation
             :actions="[
@@ -32,13 +32,13 @@
               },
             ]"
           />
-        </template>
+        </template> -->
       </BasicTable>
     </div>
-    <batchOutflowModal @register="registerLinkModal" @reload="reload" />
+    <!-- <batchOutflowModal @register="registerLinkModal" @reload="reload" />
     <detailModal @register="register" @reload="reload" />
     <batchPutModal @register="registerPut" @reload="reload" />
-    <PutModal @register="registerEnter" @reload="reload" />
+    <PutModal @register="registerEnter" @reload="reload" /> -->
   </PageWrapper>
 </template>
 <script lang="ts">
@@ -57,10 +57,10 @@
   import { useMessage } from '/@/hooks/web/useMessage';
   import { cameraList } from '/@/api/customer';
   import { cameraDelete } from '/@/api/device'
-  import batchOutflowModal from './OutflowModal.vue';
-  import detailModal from './detailsMoadl.vue';
-  import batchPutModal from './batchPutModal.vue';
-  import PutModal from './putModal.vue';
+  // import batchOutflowModal from './OutflowModal.vue';
+  // import detailModal from './detailsMoadl.vue';
+  // import batchPutModal from './batchPutModal.vue';
+  // import PutModal from './putModal.vue';
   import { useModal } from '/@/components/Modal';
   import { useRouter } from 'vue-router';
   import { UnbindCameraApi } from '/@/api/account';
@@ -71,10 +71,10 @@
       TableAction,
       PageWrapper,
       TableImg,
-      batchOutflowModal,
-      detailModal,
-      batchPutModal,
-      PutModal,
+      // batchOutflowModal,
+      // detailModal,
+      // batchPutModal,
+      // PutModal,
       [Descriptions.name]: Descriptions,
       [Descriptions.Item.name]: Descriptions.Item,
     },
@@ -83,10 +83,10 @@
       const { createMessage, createConfirm } = useMessage();
       const permissionStore = usePermissionStore();
       const { getCheckPerm } = permissionStore;
-      const [registerLinkModal, { openModal: openLinkModal }] = useModal();
-      const [register, { openModal }] = useModal();
-      const [registerPut, { openModal:openModalPut }] = useModal();
-      const [registerEnter, { openModal:openModalEnter }] = useModal();
+      // const [registerLinkModal, { openModal: openLinkModal }] = useModal();
+      // const [register, { openModal }] = useModal();
+      // const [registerPut, { openModal:openModalPut }] = useModal();
+      // const [registerEnter, { openModal:openModalEnter }] = useModal();
       const router = useRouter();
       const companyId: Number = router.currentRoute.value.params.id - 0;
       onMounted(() => {
@@ -121,30 +121,11 @@
         },
 
         {
-          title: '激活时间',
+          title: '出库时间',
           dataIndex: 'activatedTime',
           width: 180,
         },
         {
-          title: '出库类型',
-          dataIndex: 'outType',
-          width: 80,
-          customRender: ({ record }) => {
-            let typeObj ={
-              '0':t('routes.product.outType.0'),
-              '1':t('routes.product.outType.1'),
-              '2':t('routes.product.outType.2'),
-              '3':t('routes.product.outType.3'),
-            }
-            return typeObj[record.outType] || '未出库'
-          }
-        },
-        {
-          title: '客户名称',
-          dataIndex: 'companyName',
-          width: 80,
-        },
-        {
           title: '绑定账号',
           dataIndex: 'userName',
           width: 180,
@@ -152,7 +133,6 @@
             return record.userName?record.userName:'未绑定'
           },
         },
-
         {
           title: '操作',
           dataIndex: 'action',
@@ -211,68 +191,6 @@
             },
           },
           {
-            field: 'ctivated',
-            label: '激活时间',
-            component: 'RangePicker',
-            componentProps: {
-              format: 'YYYY-MM-DD',
-              valueFormat:'YYYY-MM-DD',
-            },
-            colProps: {
-              xl: 7,
-              xxl: 7,
-            },
-          },
-          {
-            field: 'outType',
-            component: 'Select',
-            label: '出库类型',
-            colProps: {
-              xl: 6,
-              xxl: 6,
-            },
-            componentProps: {
-              options: [
-                {
-                  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',
-                },
-              ],
-            },
-          },
-          {
-            field: 'companyName',
-            label: '客户名称',
-            component: 'Input',
-            colProps: {
-              xl: 6,
-              xxl: 6,
-            },
-            componentProps: {
-              // api: brandTypeListApi,
-              resultField: 'list',
-              labelField: 'name',
-              valueField: 'brandType',
-              params: {
-                page: 1,
-                limit: 1000,
-              },
-            },
-          },
-          {
             field: 'userName',
             component: 'Input',
             label: '绑定账号',
@@ -335,47 +253,47 @@
         });
       }
 
-      function deviceLink() {
-        openLinkModal(true);
-      }
-      function handleCheckout(record: Recordable) {
-        openModal(true, {
-          ...record,
-          isUpdate: false,
-        });
-      }
-      function handleEdit(record: Recordable) {
-        openModal(true, {
-          ...record,
-          isUpdate: true,
-        });
-      }
-      function put() {
-        openModalEnter(true)
-      }
-      function batchPut() {
-        console.log('批量入库');
-        openModalPut(true, {})
-      }
-      function batchOutflow() {
-        console.log('批量出库');
-        openLinkModal(true, {})
-      }
+      // function deviceLink() {
+      //   openLinkModal(true);
+      // }
+      // function handleCheckout(record: Recordable) {
+      //   openModal(true, {
+      //     ...record,
+      //     isUpdate: false,
+      //   });
+      // }
+      // function handleEdit(record: Recordable) {
+      //   openModal(true, {
+      //     ...record,
+      //     isUpdate: true,
+      //   });
+      // }
+      // function put() {
+      //   openModalEnter(true)
+      // }
+      // function batchPut() {
+      //   console.log('批量入库');
+      //   openModalPut(true, {})
+      // }
+      // function batchOutflow() {
+      //   console.log('批量出库');
+      //   openLinkModal(true, {})
+      // }
       return {
         registerTable,
         handleUnbind,
-        deviceLink,
-        registerLinkModal,
-        register,
-        registerEnter,
-        put,
-        batchPut,
-        batchOutflow,
-        handleEdit,
-        handleCheckout,
+        // deviceLink,
+        // registerLinkModal,
+        // register,
+        // registerEnter,
+        // put,
+        // batchPut,
+        // batchOutflow,
+        // handleEdit,
+        // handleCheckout,
+        // registerPut,
         reload,
         handleDelete,
-        registerPut,
         getCheckPerm,
       };
     },

+ 143 - 0
src/views/equity/DownModal.vue

@@ -0,0 +1,143 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    title="新增下载"
+    height="500"
+    @visible-change="handleVisibleChange"
+    @cancel="resetFields"
+    @ok="handleSubmit"
+  >
+    <div class="pt-2px pr-3px">
+      <BasicForm @register="registerForm">
+        <template #text="{ model, field }">
+          {{ model[field]  }}
+        </template>
+        <template #img="{ model }">
+          <TableImg v-if="model.invoiceUrl" :size="200" :adaptations="true" :simpleShow="true" :imgList="[model.invoiceUrl]" />
+        </template>
+      </BasicForm>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, nextTick, onMounted, reactive, computed } from 'vue';
+  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 { useI18n } from '/@/hooks/web/useI18n';
+  import { uploadApi } from '/@/api/product/index';
+  import { ResultEnum } from '/@/enums/httpEnum';
+  import dayjs from 'dayjs';
+  import { checkUserName, addDowm } from '/@/api/equity'
+  import { useUserStore } from '/@/store/modules/user';
+
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm, TableImg },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['update', 'register'],
+    setup(props, { emit }) {
+      const fileFlow = reactive({
+        file:null,
+        type:2,//2-普通发票,3-专用发票
+      })
+      const userStore = useUserStore();
+      const agent = computed(() => userStore.getAgent);
+      const { createMessage } = useMessage();
+      const schemas: FormSchema[] = [
+        {
+            field: 'userName',
+            component: 'Input',
+            label: '用户账号',
+            required: true,
+            componentProps: {
+              autoComplete:'off',
+              // readonly:preventAutoFill.value
+            },
+            rules: [
+              {
+                required: true,
+                // @ts-ignore
+                validator: async (rule, value) => {
+                  console.log('value',value)
+                  const regPos = /^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/; // 非中文
+                  if (!value) {
+                    return Promise.reject('请输入用户账号');
+                  }
+                  if (!regPos.test(value)) {
+                    /* eslint-disable-next-line */
+                    return Promise.reject('请输入正确的手机号');
+                  }
+                  let res = await checkUserName({userName:value})
+                  if(!res){
+                    return Promise.reject('该账号不存在');
+                  }
+                  return Promise.resolve();
+                },
+                trigger: 'change',
+              },
+            ],
+            colProps: {
+              span: 22,
+            },
+        },{
+            field: 'count',
+            component: 'InputNumber',
+            label: ' 新增次数',
+            required: true,
+            suffix:`剩余可售 ${agent.value.downSubNum} 个`,
+            componentProps:{
+              max:agent.value.downSubNum,
+              min:0,
+            },
+            colProps: {
+              span: 19,
+            },
+          },
+      ];
+
+      const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
+        labelWidth: 120,
+        schemas:schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+      onMounted(() => {});
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        resetFields();
+        // data && onDataReceive(data);
+      });
+      async function onDataReceive() {
+        resetFields();
+      }
+      const handleSubmit = async () => {
+          const values = await validate();
+          const res = await addDowm(values)
+          console.log('res',res)
+          closeModal();
+          emit('update',true);
+      };
+      function handleVisibleChange(v) {
+        v && props.userData && nextTick(() => onDataReceive(props.userData));
+      }
+      return {
+        register,
+        registerForm,
+        fileFlow,
+        handleVisibleChange,
+        handleSubmit,
+        addListFunc,
+        resetFields,
+        t,
+      };
+    },
+  });
+</script>

+ 23 - 46
src/views/equity/EditModal.vue

@@ -2,7 +2,7 @@
   <BasicModal
     v-bind="$attrs"
     @register="register"
-    title="开票详情"
+    title="续费"
     height="500"
     :showOkBtn="false"
     :showCancelBtn="false"
@@ -30,8 +30,8 @@
   import { useMessage } from '/@/hooks/web/useMessage';
   import { InvoiceRegister, InvoiceDetail } from '/@/api/order';
   import { useI18n } from '/@/hooks/web/useI18n';
-  import { uploadApi } from '/@/api/product/index';
-  import { ResultEnum } from '/@/enums/httpEnum';
+  import { renewApi } from '/@/api/equity/index';
+  import dayjs from 'dayjs';
 
   const { t } = useI18n();
   export default defineComponent({
@@ -48,60 +48,39 @@
       const { createMessage } = useMessage();
       const schemas: FormSchema[] = [
           {
-            field: 'id',
+            field: 'userName',
             component: 'Input',
-            show:false,
-            label: '发票编号',
-            required: true,
-          },
-          {
-            field: 'email',
-            component: 'Input',
-            label: '邮箱',
+            label: '用户账号',
             slot: 'text',
-            ifShow:fileFlow.type == 2,
             colProps: {
               span: 24,
             },
           },{
             field: 'invoiceNum',
             component: 'Input',
-            label: '发票编号',
+            label: '权益ID',
             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: '发票编号',
+            field: 'incrementEndTime',
+            component: 'DatePicker',
+            label: '到期日期',
             required: true,
-            slot: 'text',
-            colProps: {
-              span: 24,
+            defaultValue:dayjs().add(1,'year').format('YYYY-MM-DD'),
+            componentProps: {
+              disabled:false,
+              valueFormat: 'YYYY-MM-DD',
+              format: 'YYYY-MM-DD',
+              disabledDate: (current) => {
+                return current && current < dayjs().endOf('day');
+              },
             },
-          },{
-            field: 'shipNum',
-            component: 'Input',
-            ifShow:fileFlow.type == 3,
-            slot: 'text',
-            label: '快递单号',
-            required: true,
             colProps: {
-              span: 24,
+              span: 22,
             },
-          },
+          }
       ];
 
       const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
@@ -125,15 +104,13 @@
           ...data,
           ...detail,
         });
-        updateSchema([
-          {field: 'shipNum',ifShow:fileFlow.type == 3,},
-          {field: 'email',ifShow:fileFlow.type == 2,},
-          {field: 'invoiceUrl',ifShow:fileFlow.type == 2,},
-        ])
       }
       const handleSubmit = async () => {
+          const params = await validate();
+          await renewApi(params);
+          createMessage.success(t('common.optSuccess'));
           closeModal();
-          emit('update');
+          emit('update',true);
       };
       function handleVisibleChange(v) {
         v && props.userData && nextTick(() => onDataReceive(props.userData));

+ 93 - 74
src/views/equity/InvoiceModal.vue

@@ -2,7 +2,7 @@
   <BasicModal
     v-bind="$attrs"
     @register="register"
-    title="开票登记"
+    title="新增授权"
     :okText="okText"
     @visible-change="handleVisibleChange"
     @cancel="resetFields"
@@ -18,7 +18,7 @@
   </BasicModal>
 </template>
 <script lang="ts">
-  import { defineComponent, nextTick, onMounted, reactive, ref } from 'vue';
+  import { defineComponent, nextTick, onMounted, reactive, ref, computed } from 'vue';
   import { BasicModal, useModalInner } from '/@/components/Modal';
   import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
   import { useMessage } from '/@/hooks/web/useMessage';
@@ -26,6 +26,9 @@
   import { useI18n } from '/@/hooks/web/useI18n';
   import { uploadApi } from '/@/api/product/index';
   import { ResultEnum } from '/@/enums/httpEnum';
+  import { dincrementList, checkUserName, addApi } from '/@/api/equity'
+  import { useUserStore } from '/@/store/modules/user';
+  import dayjs from 'dayjs';
 
   const { t } = useI18n();
   export default defineComponent({
@@ -40,89 +43,118 @@
         type:2,//2-普通发票,3-专用发票
       })
       const okText = ref('发送')
+      const userStore = useUserStore();
       const { createMessage } = useMessage();
+      const agent = computed(() => userStore.getAgent);
+      console.log('gent',agent.value.highSubNum)
       const schemas: FormSchema[] = [
           {
-            field: 'id',
+            field: 'userName',
             component: 'Input',
-            show:false,
-            label: '发票编号',
+            label: '用户账号',
             required: true,
-          },
-          {
-            field: 'email',
-            component: 'Input',
-            label: '邮箱',
-            slot: 'text',
-            ifShow:fileFlow.type == 2,
             componentProps: {
-              maxLength: 50,
+              autoComplete:'off',
+              // readonly:preventAutoFill.value
             },
+            rules: [
+              {
+                required: true,
+                // @ts-ignore
+                validator: async (rule, value) => {
+                  console.log('value',value)
+                  const regPos = /^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/; // 非中文
+                  if (!value) {
+                    return Promise.reject('请输入用户账号');
+                  }
+                  if (!regPos.test(value)) {
+                    /* eslint-disable-next-line */
+                    return Promise.reject('请输入正确的手机号');
+                  }
+                  let res = await checkUserName({userName:value})
+                  if(!res){
+                    return Promise.reject('该账号不存在');
+                  }
+                  return Promise.resolve();
+                },
+                trigger: 'change',
+              },
+            ],
             colProps: {
-              span: 24,
+              span: 16,
             },
-          },{
-            field: 'invoiceNum',
-            component: 'Input',
-            label: '发票编号',
+        },{
+            field: 'incrementTypeId',
+            component: 'ApiSelect',
+            label: '权益类型',
             required: true,
             componentProps: {
               maxLength: 50,
-            },
+              api: async function () {
+                const list = await dincrementList();
+                return list.map(ele => {
+                  return {name:ele.name,value:ele.id}
+                });
+              },
+              numberToString: true,
+              labelField: 'name',
+              valueField: 'value',
+              immediate: true,
+              params: {
+                agentName: '',
+              },
+              onChange:(value)=>{
+                updateSchema([{
+                  field: 'count',
+                  suffix:`剩余可售 ${value == 3?agent.value.highSubNum:agent.value.majorSubNum} 个`, 
+                  componentProps: {
+                    max:value == 3?agent.value.highSubNum:agent.value.majorSubNum,
+                    min:0,
+                  },
+                }])
+                setFieldsValue({
+                  count:0,
+                  incrementEndTime: dayjs().add(1,value!='3'?'year':'month').format('YYYY-MM-DD'),
+                });
+              }
+              },
             colProps: {
-              span: 24,
+              span: 16,
             },
           },{
-            field: 'file',
-            component: 'Upload',
-            label: '电子发票',
-            ifShow:fileFlow.type == 2,
+            field: 'count',
+            component: 'InputNumber',
+            label: '数量',
             required: true,
-            rules: [{ required: true, message: t('common.uploadMessge') }],
+            suffix:`剩余可售 ${agent.value.majorSubNum} 个`,
             itemProps: {
               validateTrigger: 'onBlur',
             },
             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;
-              },
+              max:agent.value.majorSubNum,
+              min:0,
             },
-
             colProps: {
-              span: 22,
+              span: 19,
             },
           },{
-            field: 'invoiceNum',
-            component: 'Input',
-            label: '发票编号',
+            field: 'incrementEndTime',
+            component: 'DatePicker',
+            label: '到期日期',
             required: true,
+            defaultValue:dayjs().add(1,'year').format('YYYY-MM-DD'),
             componentProps: {
-              maxLength: 50,
-            },
-            colProps: {
-              span: 24,
-            },
-          },{
-            field: 'shipNum',
-            component: 'Input',
-            ifShow:fileFlow.type == 3,
-            label: '快递单号',
-            componentProps: {
-              maxLength: 50,
+              disabled:true,
+              valueFormat: 'YYYY-MM-DD',
+              format: 'YYYY-MM-DD',
+              disabledDate: (current) => {
+                return current && current < dayjs().endOf('day');
+              },
             },
-            required: true,
             colProps: {
               span: 24,
             },
-          },
+          }
       ];
 
       const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
@@ -150,29 +182,16 @@
         ])
       }
       const handleSubmit = async () => {
-        try {
+        // 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);
-          await InvoiceRegister(apiData);
+          await addApi(params);
           closeModal();
           resetFields();
           createMessage.success(t('common.optSuccess'));
-          emit('update');
-        } catch (error) {
-          console.log('not passing', error);
-        }
+          emit('update',true);
+        // } catch (error) {
+        //   console.log('not passing', error);
+        // }
       };
       function handleVisibleChange(v) {
         v && props.userData && nextTick(() => onDataReceive(props.userData));

+ 66 - 22
src/views/equity/data.tsx

@@ -4,9 +4,23 @@ import { h } from 'vue';
 import { FormSchema } from '/@/components/Form/index';
 import { useI18n } from '/@/hooks/web/useI18n';
 const { t } = useI18n();
-
+export const columnsDown: BasicColumn[] = [
+  {
+    title: '用户账号',
+    dataIndex: 'userName',
+  },
+  {
+    title: '下载次数',
+    dataIndex: 'count',
+    // slots: { customRender: 'orderStatus' },
+  },
+  {
+    title: '下载次数',
+    dataIndex: 'createTime',
+    // slots: { customRender: 'orderStatus' },
+  },
+];
 export const columns: BasicColumn[] = [
-        
   {
     title: '订单号',
     dataIndex: 'orderSn',
@@ -50,13 +64,13 @@ export const columns: BasicColumn[] = [
     title: '开票类型',
     dataIndex: 'type',
     width: 80,
-    customRender:({record})=>{
-      if(record.type == 2){
-        return '普通发票'
-      }else{
-        return '专用发票'
+    customRender: ({ record }) => {
+      if (record.type == 2) {
+        return '普通发票';
+      } else {
+        return '专用发票';
       }
-    }
+    },
   },
   {
     title: '发票抬头',
@@ -123,13 +137,13 @@ export const columns: BasicColumn[] = [
     dataIndex: 'invoiced',
     // slots: { customRender: 'orderStatus' },
     width: 80,
-    customRender:({record})=>{
-      if(record.invoiced == 0){
-        return '未开票'
-      }else{
-        return '已开票'
+    customRender: ({ record }) => {
+      if (record.invoiced == 0) {
+        return '未开票';
+      } else {
+        return '已开票';
       }
-    }
+    },
   },
 ];
 export const searchForm: Partial<FormProps> = {
@@ -141,7 +155,7 @@ export const searchForm: Partial<FormProps> = {
       component: 'RangePicker',
       componentProps: {
         maxLength: 100,
-        valueFormat:'YYYY-MM-DD',
+        valueFormat: 'YYYY-MM-DD',
         format: 'YYYY-MM-DD',
       },
       colProps: {
@@ -155,14 +169,15 @@ export const searchForm: Partial<FormProps> = {
       component: 'RangePicker',
       componentProps: {
         maxLength: 100,
-        valueFormat:'YYYY-MM-DD',
+        valueFormat: 'YYYY-MM-DD',
         format: 'YYYY-MM-DD',
       },
       colProps: {
         xl: 7,
         xxl: 7,
       },
-    },{
+    },
+    {
       field: 'orderSn',
       label: '订单号',
       component: 'Input',
@@ -173,9 +188,38 @@ export const searchForm: Partial<FormProps> = {
         xl: 6,
         xxl: 6,
       },
-    }
+    },
   ],
 };
+export const DownSchemas: Partial<FormProps> = {
+  labelWidth: 100,
+  schemas: [{
+    field: 'userName',
+    label: '用户账号',
+    component: 'Input',
+    componentProps: {
+      maxLength: 100,
+    },
+    colProps: {
+      xl: 6,
+      xxl: 6,
+    },
+  },
+  {
+    field: 'timeList',
+    label: '支付时间',
+    component: 'RangePicker',
+    componentProps: {
+      maxLength: 100,
+      valueFormat: 'YYYY-MM-DD',
+      format: 'YYYY-MM-DD',
+    },
+    colProps: {
+      xl: 7,
+      xxl: 7,
+    },
+  },]
+};
 export const InvoiceSchemas: FormSchema[] = [
   {
     field: 'type',
@@ -200,9 +244,9 @@ export const InvoiceSchemas: FormSchema[] = [
         // @ts-ignore
         validator: async (rule, value) => {
           if (!value) {
-            return Promise.reject(t('common.inputText')+t('routes.product.version'));
+            return Promise.reject(t('common.inputText') + t('routes.product.version'));
           }
-          if(/.*[\u4e00-\u9fa5]+.*$/.test(value)){
+          if (/.*[\u4e00-\u9fa5]+.*$/.test(value)) {
             /* eslint-disable-next-line */
             return Promise.reject('不支持中文字符');
           }
@@ -224,10 +268,10 @@ export const InvoiceSchemas: FormSchema[] = [
     required: true,
     label: t('routes.product.description'),
     componentProps: {
-      rows:4,
+      rows: 4,
     },
     colProps: {
       span: 24,
     },
   },
-]
+];

+ 99 - 60
src/views/equity/index.vue

@@ -1,52 +1,59 @@
 <template>
-  <div>
-    <BasicTable @register="registerTable">
-      <template #toolbar>
-        <a-button type="primary" @click="exportExcel" v-if="getCheckPerm('invoice-export')"> 导出</a-button>
+  <PageWrapper contentBackground>
+    <template #footer>
+      <a-tabs v-model:activeKey="incrementTypeId" @change="changeTable">
+        <a-tab-pane :key="0" tab="会员权益" >
+          <div class="desc-wrap-BasicTable">
+            <BasicTable @register="registerTable">
+              <template #toolbar>
+                <a-button type="primary" @click="handleInvoice"> 新增授权</a-button>
+              </template>
+              <template #action="{ record }">
+                  <TableAction
+                    stopButtonPropagation
+                    :actions="[
+                      {
+                        label: '续费',
+                        //icon: 'la:file-invoice-dollar',
+                        onClick: headleDetails.bind(null, record),
+                      }
+                    ]"
+                  />
+              </template>
+            </BasicTable>
+          </div>
+        </a-tab-pane>
+        <a-tab-pane :key="1" tab="场景下载" >
+          <div class="desc-wrap-BasicTable">
+            <BasicTable @register="registerDownTable">
+              <template #toolbar>
+                <a-button type="primary" @click="handleInvoice"> 新增下载</a-button>
+              </template>
+            </BasicTable>
+          </div>
+        </a-tab-pane>
+      </a-tabs>
       </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),
-              },
-            ]"
-          />
-      </template>
-    </BasicTable>
     <AddModal @update="reload" @register="registerAddModal" />
     <EditModal @register="registerEditModal" @update="reload" />
-  </div>
+    <DownModal @register="registerDownModal" @update="reload" />
+  </PageWrapper>
 </template>
 <script lang="ts">
-  import { defineComponent, h, reactive } from 'vue';
+  import { defineComponent, h, reactive, ref, computed } from 'vue';
   import { BasicTable, useTable, TableAction, TableImg } from '/@/components/Table';
   import { PageWrapper } from '/@/components/Page';
   import { useModal } from '/@/components/Modal';
-  import { Descriptions } from 'ant-design-vue';
+  import { Descriptions,Tabs } from 'ant-design-vue';
   import { useI18n } from '/@/hooks/web/useI18n';
   import { useMessage } from '/@/hooks/web/useMessage';
-  import { InvoiceList,InvoiceExport } from '/@/api/order'
+  import { listApi, dowmListApi } from '/@/api/equity'
   import { downloadByData } from '/@/utils/file/download'
-  import { searchForm, columns } from './data'
+  import { useUserStore } from '/@/store/modules/user';
+  import { searchForm, columns, columnsDown, DownSchemas } from './data'
   import AddModal from './InvoiceModal.vue';
   import EditModal from './EditModal.vue';
+  import DownModal from './DownModal.vue'
   import { usePermissionStore } from '/@/store/modules/permission';
   interface apiDataParam {
     orderSn?: string;
@@ -61,17 +68,24 @@
     components: { 
       AddModal,
       EditModal,
+      DownModal,
       BasicTable, 
       TableAction, 
       PageWrapper,
       TableImg,
       [Descriptions.name]: Descriptions,
       [Descriptions.Item.name]: Descriptions.Item,
+      [Tabs.name]: Tabs,
+      [Tabs.TabPane.name]: Tabs.TabPane,
     },
     setup() {
       const { t } = useI18n();
+      const userStore = useUserStore();
       const permissionStore = usePermissionStore();
+      const { afterLoginAction } = userStore
+      const agent = computed(() => userStore.getAgent);
       const { getCheckPerm } = permissionStore;
+      const incrementTypeId = ref<number>(0); //0看看 、1看见、2深时
       const apiData = reactive<apiDataParam>({
         orderSn: '',
         payTimeStart: '',
@@ -81,37 +95,21 @@
         orderBy: '',
         sortBy: '',
       });
-      const { createMessage,createConfirm } = useMessage();
+      const { createMessage, createConfirm } = useMessage();
       const [registerAddModal, { openModal: openAddModal }] = useModal();
+      const [registerDownModal, { openModal: openDownModal }] = useModal();
       const [registerEditModal, { openModal: openEditModal }] = useModal();
-      const [registerTable, { reload }] = useTable({
-        api: InvoiceList,
-        title: '发票列表',
+      const [registerTable, { reload:reloadEqiuty }] = useTable({
+        api: listApi,
+        title: '',
         // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
         columns: columns,
         useSearchForm: true,
         formConfig: searchForm,
         showTableSetting: true,
         showIndexColumn:false,
+        searchInfo: { incrementTypeId:0 },
         rowKey: 'id',
-        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
-          return {
-            ...params,
-            ...searchData,
-          }
-        },
         fetchSetting: {
           pageField: 'pageNum',
           sizeField: 'pageSize',
@@ -127,13 +125,38 @@
         },
         canResize: false,
       });
+      const [registerDownTable, { reload:reloadDown }] = useTable({
+        api: dowmListApi,
+        title: '',
+        // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
+        columns: columnsDown,
+        useSearchForm: true,
+        formConfig: DownSchemas,
+        showTableSetting: true,
+        showIndexColumn:false,
+        searchInfo: { incrementTypeId:1 },
+        rowKey: 'id',
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },
+        canResize: false,
+      });
       function handleDelete(record: Recordable) {
         console.log('点击了删除', record);
       }
       function handleInvoice(record: Recordable) {
-        openAddModal(true, {
-          ...record,
-        });
+        if(incrementTypeId.value == 0){
+          openAddModal(true, {
+            ...record,
+          });
+        }else{
+          openDownModal(true, {
+            ...record,
+          });
+        }
       }
     function handleEdit(record: Recordable) {
       console.log('record', record);
@@ -144,6 +167,17 @@
         ...record,
       });
     }
+    function reload(value){
+      if(value){
+        afterLoginAction()
+      }
+      if(incrementTypeId.value == 0){
+        reloadEqiuty()
+      }else{
+        reloadDown()
+      }
+
+    }
     function exportExcel() {
         createConfirm({
           iconType: 'warning',
@@ -156,6 +190,7 @@
       }
       return {
         registerTable,
+        registerDownTable,
         handleDelete,
         registerAddModal,
         registerEditModal,
@@ -164,7 +199,11 @@
         handleEdit,
         headleDetails,
         reload,
+        reloadEqiuty,
+        reloadDown,
+        incrementTypeId,
         getCheckPerm,
+        registerDownModal,
       };
     },
   });

+ 72 - 114
src/views/finance/data.tsx

@@ -8,14 +8,8 @@ const { t } = useI18n();
 export const columns: BasicColumn[] = [
         
   {
-    title: '订单号',
-    dataIndex: 'orderSn',
-    ellipsis: false,
-    width: 180,
-  },
-  {
-    title: '支付时间',
-    dataIndex: 'payTime',
+    title: '授权时间',
+    dataIndex: 'creatTime',
     width: 150,
     customRender: ({ record }) => {
       return (
@@ -28,152 +22,116 @@ export const columns: BasicColumn[] = [
     },
   },
   {
-    title: '开票申请时间',
-    dataIndex: 'invoiceTime',
+    title: '权益类型',
+    dataIndex: 'type',
     width: 150,
-    customRender: ({ record }) => {
-      return (
-        record.invoiceTime &&
-        h(Time, {
-          value: record.invoiceTime,
-          mode: 'datetime',
-        })
-      );
-    },
+    customRender:({record})=>{
+      return t(`routes.finance.equityType.${record.type}`) || '-'
+  }
   },
   {
-    title: '开票金额',
-    dataIndex: 'money',
+    title: '昵称',
+    dataIndex: 'nickName',
     width: 80,
   },
   {
-    title: '开票类型',
-    dataIndex: 'type',
+    title: '账号',
+    dataIndex: 'userName',
     width: 80,
-    customRender:({record})=>{
-      if(record.type == 2){
-        return '普通发票'
-      }else{
-        return '专用发票'
-      }
-    }
   },
   {
-    title: '发票抬头',
-    dataIndex: 'title',
+    title: '邮箱',
+    dataIndex: 'email',
     // slots: { customRender: 'orderType' },
     width: 150,
   },
   {
-    title: '纳税人识别号',
-    dataIndex: 'code',
+    title: '授权数量',
+    dataIndex: 'count',
     // slots: { customRender: 'orderStatus' },
     width: 180,
   },
   {
-    title: '注册地址',
-    dataIndex: 'organizedAddress',
+    title: '授予方式',
+    dataIndex: 'giveType',
     // slots: { customRender: 'orderStatus' },
     width: 180,
-  },
-  {
-    title: '注册电话',
-    dataIndex: 'registerPhone',
-    // slots: { customRender: 'orderStatus' },
-    width: 120,
-  },
-  {
-    title: '开户银行',
-    dataIndex: 'bankName',
-    // slots: { customRender: 'orderStatus' },
-    width: 150,
-  },
-  {
-    title: '银行账号',
-    dataIndex: 'bankAccount',
-    // slots: { customRender: 'orderStatus' },
-    width: 130,
-  },
-  {
-    title: '收件人姓名',
-    dataIndex: 'shipName',
-    // slots: { customRender: 'orderStatus' },
-    width: 120,
-  },
-  {
-    title: '收件人电话',
-    dataIndex: 'shipMobile',
-    // slots: { customRender: 'orderStatus' },
-    width: 110,
-  },
-  {
-    title: '收货地址',
-    dataIndex: 'shipAddress',
-    // slots: { customRender: 'orderStatus' },
-    width: 130,
-  },
-  {
-    title: '邮箱',
-    dataIndex: 'email',
-    // slots: { customRender: 'orderStatus' },
-    width: 150,
-  },
-  {
-    title: '状态',
-    dataIndex: 'invoiced',
-    // slots: { customRender: 'orderStatus' },
-    width: 80,
     customRender:({record})=>{
-      if(record.invoiced == 0){
-        return '未开票'
-      }else{
-        return '已开票'
-      }
-    }
+      return t(`routes.finance.giveType.${record.giveType}`) || '-'
+  }
   },
 ];
 export const searchForm: Partial<FormProps> = {
   labelWidth: 100,
   schemas: [
     {
-      field: 'invoiceTime',
-      label: '开票申请时间',
-      component: 'RangePicker',
+      field: 'giveType',
+      label: '权益类型',
+      component: 'Select',
       componentProps: {
-        maxLength: 100,
-        valueFormat:'YYYY-MM-DD',
-        format: 'YYYY-MM-DD',
+        options: [
+          {
+            label: t('routes.finance.equityType.0'),
+            value: 0,
+            key: '0',
+          },{
+            label: t('routes.finance.equityType.1'),
+            value: 1,
+            key: '1',
+          },{
+            label: t('routes.finance.equityType.2'),
+            value: 3,
+            key: '3',
+          },
+        ],
       },
       colProps: {
-        xl: 7,
-        xxl: 7,
+        xl: 5,
+        xxl: 5,
       },
-    },
-    {
-      field: 'payTime',
-      label: '支付时间',
-      component: 'RangePicker',
+    },{
+      field: 'giveType',
+      label: '授权方式',
+      component: 'Select',
       componentProps: {
-        maxLength: 100,
-        valueFormat:'YYYY-MM-DD',
-        format: 'YYYY-MM-DD',
+        options: [
+          {
+            label: t('routes.finance.giveType.0'),
+            value: 0,
+            key: '0',
+          },{
+            label: t('routes.finance.giveType.1'),
+            value: 1,
+            key: '1',
+          },{
+            label: t('routes.finance.giveType.2'),
+            value: 2,
+            key: '2',
+          },{
+            label: t('routes.finance.giveType.3'),
+            value: 3,
+            key: '3',
+          },
+        ],
       },
       colProps: {
-        xl: 7,
-        xxl: 7,
+        xl: 5,
+        xxl: 5,
       },
     },{
-      field: 'orderSn',
-      label: '订单号',
-      component: 'Input',
+      field: 'timeList',
+      label: '授权时间',
+      component: 'RangePicker',
       componentProps: {
         maxLength: 100,
+        valueFormat:'YYYY-MM-DD',
+        format: 'YYYY-MM-DD',
       },
       colProps: {
-        xl: 6,
-        xxl: 6,
+        xl: 7,
+        xxl: 7,
       },
-    }
+    },
   ],
 };
 export const InvoiceSchemas: FormSchema[] = [

+ 22 - 76
src/views/finance/index.vue

@@ -3,34 +3,7 @@
     <GrowCard :loading="loading" class="enter-y" :list="growCardList" />
     <BasicTable @register="registerTable">
       <template #toolbar>
-        <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),
-            },
-          ]"
-        />
+        <a-button type="primary" @click="exportExcel" > 导出excel</a-button>
       </template>
     </BasicTable>
     <AddModal @update="reload" @register="registerAddModal" />
@@ -38,7 +11,7 @@
   </div>
 </template>
 <script lang="ts">
-import { defineComponent, h, reactive, ref } from 'vue';
+import { defineComponent, h, reactive, ref, onMounted } from 'vue';
 import GrowCard from '../dashboard/analysis/components/GrowCard.vue';
 import { BasicTable, useTable, TableAction, TableImg } from '/@/components/Table';
 import { PageWrapper } from '/@/components/Page';
@@ -46,7 +19,7 @@ import { useModal } from '/@/components/Modal';
 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 { logData, logList, DownExport } from '/@/api/finance';
 import { downloadByData } from '/@/utils/file/download';
 import { searchForm, columns } from './data';
 import AddModal from './InvoiceModal.vue';
@@ -84,56 +57,36 @@ export default defineComponent({
   setup() {
     const { t } = useI18n();
     const loading = ref(true);
-    const growCardList = ref<GrowCardItem[]>([{
-        title: '累计用户',
+    const growCardList = ref<GrowCardItem[]>([]);
+    onMounted(async () => {
+      const {lastDownNum = 0,lastHighNum = 0,lastMajorNum = 0} = await logData({})
+      loading.value = false
+      growCardList.value = [{
+        title: '上月销售专业会员(年)',
         // icon: 'fa6-solid:users-gear',
         icon: 'visit-count|svg',
-        value: 0,
-        unit: '人',
+        value: lastMajorNum || 0,
+        unit: '',
         color: 'green',
         action: '年',
       },
       {
-        title: '上月新增用户',
+        title: '上月销售高级会员(月)',
         icon: 'akar-icons:person-add',
-        value: 0,
-        unit: '',
+        value: lastHighNum || 0,
+        unit: '',
         color: 'blue',
         action: '月',
       },
       {
-        title: '今日新增用户',
+        title: '上月销售场景下载',
         icon: 'carbon:user-role',
-        value: 0,
-        unit: '人',
-        color: 'orange',
-        action: '日',
-      },
-      {
-        title: '上月权益订单数',
-        icon: 'fxemoji:notchedrightsemi3dot',
-        value: 0,
-        unit: '笔',
-        color: 'blue',
-        action: '月',
-      },
-      {
-        title: '上月下载订单数',
-        icon: 'download-count|svg',
-        value: 0,
-        unit: '笔',
+        value: lastDownNum || 0,
+        unit: '次',
         color: 'orange',
         action: '月',
-      },
-      {
-        title: '上月配件订单数',
-        icon: 'transaction|svg',
-        value: 0,
-        unit: '人',
-        color: 'blue',
-        action: '月',
-      },
-    ]);
+      },]
+    });
     const permissionStore = usePermissionStore();
     const { getCheckPerm } = permissionStore;
     const apiData = reactive<apiDataParam>({
@@ -149,7 +102,7 @@ export default defineComponent({
     const [registerAddModal, { openModal: openAddModal }] = useModal();
     const [registerEditModal, { openModal: openEditModal }] = useModal();
     const [registerTable, { reload }] = useTable({
-      api: InvoiceList,
+      api: logList,
       title: '发票列表',
       // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
       columns: columns,
@@ -182,13 +135,6 @@ export default defineComponent({
         listField: 'list',
         totalField: 'total',
       },
-      actionColumn: {
-        width: 100,
-        title: '操作',
-        fixed: 'right',
-        dataIndex: 'action',
-        slots: { customRender: 'action' },
-      },
       canResize: false,
     });
     function handleDelete(record: Recordable) {
@@ -212,9 +158,9 @@ export default defineComponent({
       createConfirm({
         iconType: 'warning',
         title: () => h('span', '温馨提示'),
-        content: () => h('span', '确定导出当前发票所有记录?'),
+        content: () => h('span', '确定导出excel?'),
         onOk: async () => {
-          await InvoiceExport(apiData);
+          await DownExport(apiData);
         },
       });
     }

+ 3 - 54
src/views/scene/list.vue

@@ -24,44 +24,13 @@
               {
                 label: '迁移',
                 disabled:!(record.status == 1 || record.status == -2),
-                ifShow:getTypeCheckPerm('scenes-move') && tableType != 3,
                 onClick: handleMove.bind(null, record),
               },
               {
-                label: '下载',
-                ifShow:getTypeCheckPerm('scenes-download') && tableType != 3,
-                disabled:!(record.status == 1 || (record.status == -2 && record.payStatus == 1)),
-                //icon: 'carbon:download',
-                onClick: handleDownload.bind(null, record),
-              },
-              {
-                label: '重算',
-                disabled: record.status == 0 || (record.status == -2 && record.payStatus != 1),
-                ifShow:getTypeCheckPerm('scenes-recalculate') && tableType != 3,
-                popConfirm: {
-                  title: '是否重算?',
-                  confirm: handleReset.bind(null, record),
-                },
-              },
-              {
                 label: '复制',
                 disabled:!(record.status == 1 || (record.status == -2 && record.payStatus == 1)),
-                ifShow:getTypeCheckPerm('scenes-copy') && tableType != 3,
                 onClick: handleCopy.bind(null, record),
               },
-              {
-                label: '删除',
-                //icon: 'ic:outline-delete-outline',
-                color: 'error',
-                ifShow:getTypeCheckPerm('scenes-delete'),
-                disabled:record.status == 0,
-                //onClick: handleDelete.bind(null, record),
-                popConfirm: {
-                  title: '是否删除?',
-                  confirm: handleDelete.bind(null, record),
-                  placement: 'topRight',
-                },
-              },
             ]"
           />
         </template>
@@ -191,27 +160,6 @@
           },
         },
         {
-          title: '是否复制',
-          dataIndex: 'isCopy',
-          width: 80,
-          customRender: ({ record }) => {
-            return record.isCopy ? '是' : '否';
-          },
-        },
-        {
-          title: '复制时间',
-          dataIndex: 'copyTime',
-          width: 180,
-          customRender: ({ record }) => {
-            return record.copyTime
-              ? h(Time, {
-                  value: record.copyTime,
-                  mode: 'datetime',
-                })
-              : '-';
-          },
-        },
-        {
           title: '绑定账号',
           dataIndex: 'userName',
           width: 100,
@@ -251,7 +199,7 @@
           ifShow: true,
           fixed: 'right',
           flag: 'ACTION',
-          width: 250,
+          width: 120,
         },
       ];
       const searchForm: Partial<FormProps> = {
@@ -302,13 +250,14 @@
       const [registerMoveModal, { openModal: openMoveModal }] = useModal();
       const [registerTable, { reload }] = useTable({
         api: operateSceneList,
-        title: `场景列表`,
+        // title: `场景列表`,
         // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
         columns: columns,
         searchInfo: { type: tableType },
         useSearchForm: true,
         formConfig: searchForm,
         showTableSetting: true,
+        showIndexColumn:false,
         rowKey: 'num',
         fetchSetting: {
           pageField: 'pageNum',

+ 49 - 2
types/store.d.ts

@@ -57,9 +57,56 @@ export interface UserInfo {
   desc?: string;
   homePath?: string;
   roleId: number;
-  roles: number[];//RoleInfo[];
+  roles: number[]; //RoleInfo[];
+  availableSpace: number;
+  cameraCount: number;
+  city:  string |null;
+  country: string;
+  downloadNum: 57;
+  downloadNumTotal: number;
+  email: string;
+  expansionTotal: number;
+  head: string;
+  id: number;
+  incrementBindNum: string | number | null;
+  incrementNum: string | number | null;
+  isNotice: number;
+  mainPage: string | number | null;
+  nickName: string;
+  organizationName: string | number | null;
+  password: string;
+  province: string | number | null;
+  registerTime: string;
+  replyCount: number;
+  sceneCount: number;
+  shipAddress: string | number | null;
+  shipAreaPath: string | number | null;
+  status: number;
+  themeCount: number;
+  totalSpace: string | number | null;
+  usedSpace: string | number | null;
+  userName: string;
+  agent?:UserAgent;
+}
+export interface UserAgent {
+  createTime: string;
+  downSubNum: number;
+  downTotalNum: number;
+  downUseNum: number;
+  highSubNum: number;
+  highTotalNum: number;
+  highUseNum: number;
+  id: number;
+  majorSubNum: number;
+  majorTotalNum: number;
+  majorUseNum: number;
+  name: string;
+  nickName: string;
+  recStatus: string;
+  sysUserId: number;
+  updateTime: string;
+  userName: string;
 }
-
 export interface BeforeMiniState {
   menuCollapsed?: boolean;
   menuSplit?: boolean;