Переглянути джерело

Merge branch 'release/release-20220602prod'

tangning 3 роки тому
батько
коміт
c2323c2bf3
75 змінених файлів з 3687 додано та 296 видалено
  1. 2 2
      .env.uat
  2. 2 1
      .vscode/settings.json
  3. 1 1
      mock/company/selectCompanyByType.ts
  4. 1 1
      mock/company/selectCompanyNum.ts
  5. 3 3
      mock/demo/account.ts
  6. 7 7
      mock/demo/system.ts
  7. 1 1
      mock/devices/pageList.ts
  8. 1 1
      mock/feedback/list.ts
  9. 1 1
      mock/house/selectHouseByType.ts
  10. 1 1
      mock/member/list.ts
  11. 1 1
      mock/order/list.ts
  12. 1 1
      mock/product/category.ts
  13. 1 1
      mock/product/list.ts
  14. 1 1
      mock/scene/list.ts
  15. 1 1
      mock/scene/live.ts
  16. 1 1
      mock/staff/list.ts
  17. 1 1
      mock/sys/menu.ts
  18. 4 4
      mock/sys/user.ts
  19. 3 3
      src/api/account/index.ts
  20. 1 1
      src/api/feedback/list.ts
  21. 1 1
      src/api/member/list.ts
  22. 7 7
      src/api/order/list.ts
  23. 9 9
      src/api/product/category.ts
  24. 9 9
      src/api/product/list.ts
  25. 249 0
      src/api/rightsEnterprises/list.ts
  26. 30 0
      src/api/rightsEnterprises/model.ts
  27. 1 1
      src/api/scene/list.ts
  28. 10 10
      src/api/scene/live.ts
  29. 12 0
      src/api/staff/list.ts
  30. 2 2
      src/api/sys/model/uploadModel.ts
  31. 1 1
      src/api/sys/user.ts
  32. 3 3
      src/api/system/system.ts
  33. 1 0
      src/components/Upload/src/BasicUpload.vue
  34. 1 2
      src/components/Upload/src/UploadModal.vue
  35. 3 0
      src/enums/cacheEnum.ts
  36. 1 0
      src/locales/lang/zh-CN/common.ts
  37. 1 0
      src/locales/lang/zh-CN/routes/dashboard.ts
  38. 1 1
      src/locales/lang/zh-CN/routes/devices.ts
  39. 44 0
      src/locales/lang/zh-CN/routes/rightsEnterprises.ts
  40. 5 0
      src/locales/lang/zh-CN/routes/scenes.ts
  41. 1 0
      src/locales/lang/zh-CN/routes/staff.ts
  42. 69 0
      src/router/routes/modules/rightsEnterprises.ts
  43. 9 0
      src/router/routes/modules/staff.ts
  44. 31 2
      src/store/modules/user.ts
  45. 2 0
      src/utils/cache/persistent.ts
  46. 44 2
      src/views/advertisement/schemas.ts
  47. 16 16
      src/views/corporation/AddCorporationModal.vue
  48. 69 79
      src/views/corporation/SubaccountModal.vue
  49. 6 6
      src/views/corporation/index.vue
  50. 40 40
      src/views/devices/AddModal.vue
  51. 12 12
      src/views/devices/EditModal.vue
  52. 1 0
      src/views/devices/list.vue
  53. 15 2
      src/views/product/list.data.ts
  54. 15 2
      src/views/product/list.vue
  55. 214 0
      src/views/rightsEnterprises/BindModal.vue
  56. 204 0
      src/views/rightsEnterprises/addCameraModal.vue
  57. 328 0
      src/views/rightsEnterprises/addModal.vue
  58. 296 0
      src/views/rightsEnterprises/camera.vue
  59. 107 0
      src/views/rightsEnterprises/cameraBind.vue
  60. 17 0
      src/views/rightsEnterprises/cameraDetail.vue
  61. 291 0
      src/views/rightsEnterprises/cameraList.vue
  62. 235 0
      src/views/rightsEnterprises/enterprises.vue
  63. 316 0
      src/views/rightsEnterprises/list.vue
  64. 88 0
      src/views/rightsEnterprises/productDrawer.vue
  65. 17 0
      src/views/rightsEnterprises/rightsDetail.vue
  66. 265 0
      src/views/rightsEnterprises/rightsList.vue
  67. 287 0
      src/views/rightsEnterprises/staff.vue
  68. 46 27
      src/views/scenes/list.vue
  69. 22 6
      src/views/scenes/live.vue
  70. 1 0
      src/views/scenes/liveDrawer.vue
  71. 78 0
      src/views/staff/clean.vue
  72. 1 1
      src/views/staff/delListModal.vue
  73. 87 6
      src/views/staff/detailsModal.vue
  74. 30 15
      src/views/staff/list.vue
  75. 1 0
      types/store.d.ts

+ 2 - 2
.env.uat

@@ -7,9 +7,9 @@ VITE_PUBLIC_PATH = /
 # Delete console
 VITE_DROP_CONSOLE = true
 
-VITE_PROXY = [["/basic-api","https://cszfb.4dkankan.com/basic-api"],["/upload","http://localhost:3300/upload"],["/zfb-api","https://cszfb.4dkankan.com"]]
+VITE_PROXY = [["/upload","http://localhost:3300/upload"],["/zfb-api","https://cszfb.4dkankan.com"]]
 # Whether to enable gzip or brotli compression
-# Optional: gzip | brotli | none
+# Optional: gzip | brotli | none ["/basic-api","https://cszfb.4dkankan.com/basic-api"],
 # If you need multiple forms, you can use `,` to separate
 VITE_BUILD_COMPRESS = 'none'
 

+ 2 - 1
.vscode/settings.json

@@ -95,7 +95,8 @@
   "[vue]": {
     "editor.codeActionsOnSave": {
       "source.fixAll.eslint": false
-    }
+    },
+    "editor.defaultFormatter": "octref.vetur"
   },
   "i18n-ally.localesPaths": ["src/locales/lang"],
   "i18n-ally.keystyle": "nested",

+ 1 - 1
mock/company/selectCompanyByType.ts

@@ -50,7 +50,7 @@ const demoList = (() => {
 
 export default [
   {
-    url: '/basic-api/zfb/company/selectCompanyByType',
+    url: '/zfb-api/zfb/company/selectCompanyByType',
     timeout: 1000,
     method: 'get',
     response: ({ query }) => {

+ 1 - 1
mock/company/selectCompanyNum.ts

@@ -66,7 +66,7 @@ const demoList = (() => {
 
 export default [
   {
-    url: '/basic-api/mock/zfb/company/selectCompanyNum',
+    url: '/zfb-api/zfb/mock/zfb/company/selectCompanyNum',
     timeout: 1000,
     method: 'post',
     response: ({ query }) => {

+ 3 - 3
mock/demo/account.ts

@@ -45,7 +45,7 @@ const userInfo = {
 
 export default [
   {
-    url: '/basic-api/account/getAccountInfo',
+    url: '/zfb-api/zfb/account/getAccountInfo',
     timeout: 1000,
     method: 'get',
     response: () => {
@@ -53,7 +53,7 @@ export default [
     },
   },
   {
-    url: '/basic-api/user/sessionTimeout',
+    url: '/zfb-api/zfb/user/sessionTimeout',
     method: 'post',
     statusCode: 401,
     response: () => {
@@ -61,7 +61,7 @@ export default [
     },
   },
   {
-    url: '/basic-api/user/tokenExpired',
+    url: '/zfb-api/zfb/user/tokenExpired',
     method: 'post',
     statusCode: 200,
     response: () => {

+ 7 - 7
mock/demo/system.ts

@@ -136,7 +136,7 @@ const menuList = (() => {
 
 export default [
   {
-    url: '/basic-api/system/getAccountList',
+    url: '/zfb-api/zfb/system/getAccountList',
     timeout: 100,
     method: 'get',
     response: ({ query }) => {
@@ -145,7 +145,7 @@ export default [
     },
   },
   {
-    url: '/basic-api/system/getRoleListByPage',
+    url: '/zfb-api/zfb/system/getRoleListByPage',
     timeout: 100,
     method: 'get',
     response: ({ query }) => {
@@ -154,7 +154,7 @@ export default [
     },
   },
   {
-    url: '/basic-api/system/setRoleStatus',
+    url: '/zfb-api/zfb/system/setRoleStatus',
     timeout: 500,
     method: 'post',
     response: ({ query }) => {
@@ -163,7 +163,7 @@ export default [
     },
   },
   {
-    url: '/basic-api/system/getAllRoleList',
+    url: '/zfb-api/zfb/system/getAllRoleList',
     timeout: 100,
     method: 'get',
     response: () => {
@@ -171,7 +171,7 @@ export default [
     },
   },
   {
-    url: '/basic-api/system/getDeptList',
+    url: '/zfb-api/zfb/system/getDeptList',
     timeout: 100,
     method: 'get',
     response: () => {
@@ -179,7 +179,7 @@ export default [
     },
   },
   {
-    url: '/basic-api/system/getMenuList',
+    url: '/zfb-api/zfb/system/getMenuList',
     timeout: 100,
     method: 'get',
     response: () => {
@@ -187,7 +187,7 @@ export default [
     },
   },
   {
-    url: '/basic-api/system/accountExist',
+    url: '/zfb-api/zfb/system/accountExist',
     timeout: 500,
     method: 'post',
     response: ({ body }) => {

+ 1 - 1
mock/devices/pageList.ts

@@ -70,7 +70,7 @@ const demoList = (() => {
 
 export default [
   {
-    url: '/basic-api/zfb/camera/pageList',
+    url: '/zfb-api/zfb/camera/pageList',
     timeout: 1000,
     method: 'get',
     response: ({ query }) => {

+ 1 - 1
mock/feedback/list.ts

@@ -32,7 +32,7 @@ const demoList = (() => {
 
 export default [
   {
-    url: '/basic-api/zfb/feedback/list',
+    url: '/zfb-api/zfb/feedback/list',
     timeout: 1000,
     method: 'get',
     response: ({ query }) => {

+ 1 - 1
mock/house/selectHouseByType.ts

@@ -74,7 +74,7 @@ const demoList = (() => {
 
 export default [
   {
-    url: '/basic-api/zfb/house/selectHouseByType',
+    url: '/zfb-api/zfb/house/selectHouseByType',
     timeout: 1000,
     method: 'get',
     response: ({ query }) => {

+ 1 - 1
mock/member/list.ts

@@ -39,7 +39,7 @@ const demoList = (() => {
 
 export default [
   {
-    url: '/basic-api/zfb/member/list',
+    url: '/zfb-api/zfb/member/list',
     timeout: 1000,
     method: 'get',
     response: ({ query }) => {

+ 1 - 1
mock/order/list.ts

@@ -60,7 +60,7 @@ const demoList = (() => {
 
 export default [
   {
-    url: '/basic-api/zfb/order/list',
+    url: '/zfb-api/zfb/order/list',
     timeout: 1000,
     method: 'get',
     response: ({ query }) => {

+ 1 - 1
mock/product/category.ts

@@ -62,7 +62,7 @@ const categoryList = (() => {
 
 export default [
   {
-    url: '/basic-api/zfb/product/category',
+    url: '/zfb-api/zfb/product/category',
     timeout: 1000,
     method: 'get',
     response: ({ query }) => {

+ 1 - 1
mock/product/list.ts

@@ -40,7 +40,7 @@ const demoList = (() => {
 
 export default [
   {
-    url: '/basic-api/zfb/product/list',
+    url: '/zfb-api/zfb/product/list',
     timeout: 1000,
     method: 'get',
     response: ({ query }) => {

+ 1 - 1
mock/scene/list.ts

@@ -27,7 +27,7 @@ const demoList = (() => {
 
 export default [
   {
-    url: '/basic-api/zfb/scene/list',
+    url: '/zfb-api/zfb/scene/list',
     timeout: 1000,
     method: 'get',
     response: ({ query }) => {

+ 1 - 1
mock/scene/live.ts

@@ -33,7 +33,7 @@ const demoList = (() => {
 
 export default [
   {
-    url: '/basic-api/zfb/scene/live',
+    url: '/zfb-api/zfb/scene/live',
     timeout: 1000,
     method: 'get',
     response: ({ query }) => {

+ 1 - 1
mock/staff/list.ts

@@ -32,7 +32,7 @@ const demoList = (() => {
 
 export default [
   {
-    url: '/basic-api/zfb/staff/list',
+    url: '/zfb-api/zfb/staff/list',
     timeout: 1000,
     method: 'get',
     response: ({ query }) => {

+ 1 - 1
mock/sys/menu.ts

@@ -237,7 +237,7 @@ const linkRoute = {
 
 export default [
   {
-    url: '/basic-api/getMenuList',
+    url: '/zfb-api/zfb/getMenuList',
     timeout: 1000,
     method: 'get',
     response: (request: requestParams) => {

+ 4 - 4
mock/sys/user.ts

@@ -82,7 +82,7 @@ const fakeCodeList: any = {
 export default [
   // mock user login
   {
-    url: '/basic-api/mock/login',
+    url: '/zfb-api/zfb/mock/login',
     timeout: 200,
     method: 'post',
     response: ({ body }) => {
@@ -105,7 +105,7 @@ export default [
     },
   },
   {
-    url: '/basic-api/getUserInfo',
+    url: '/zfb-api/zfb/getUserInfo',
     method: 'get',
     response: (request: requestParams) => {
       const token = getRequestToken(request);
@@ -118,7 +118,7 @@ export default [
     },
   },
   {
-    url: '/basic-api/getPermCode',
+    url: '/zfb-api/zfb/getPermCode',
     timeout: 200,
     method: 'get',
     response: (request: requestParams) => {
@@ -134,7 +134,7 @@ export default [
     },
   },
   {
-    url: '/basic-api/logout',
+    url: '/zfb-api/zfb/logout',
     timeout: 200,
     method: 'get',
     response: (request: requestParams) => {

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

@@ -2,9 +2,9 @@ import { defHttp } from '/@/utils/http/axios';
 import { GetAccountInfoModel } from './model';
 
 enum Api {
-  ACCOUNT_INFO = '/basic-api/account/getAccountInfo',
-  SESSION_TIMEOUT = '/basic-api/user/sessionTimeout',
-  TOKEN_EXPIRED = '/basic-api/user/tokenExpired',
+  ACCOUNT_INFO = '/zfb-api/zfb/account/getAccountInfo',
+  SESSION_TIMEOUT = '/zfb-api/zfb/user/sessionTimeout',
+  TOKEN_EXPIRED = '/zfb-api/zfb/user/tokenExpired',
 }
 
 // Get personal center-basic settings

+ 1 - 1
src/api/feedback/list.ts

@@ -2,7 +2,7 @@ import { defHttp } from '/@/utils/http/axios';
 import { PageParams, RentListGetResultModel } from './model';
 
 enum Api {
-  pageList = '/basic-api/feedback/list',
+  pageList = '/zfb-api/zfb/feedback/list',
 }
 
 /**

+ 1 - 1
src/api/member/list.ts

@@ -2,7 +2,7 @@ import { defHttp } from '/@/utils/http/axios';
 import { PageParams, MemberListGetResultModel } from './model';
 
 enum Api {
-  pageList = '/basic-api/user/list',
+  pageList = '/zfb-api/zfb/user/list',
 }
 
 /**

+ 7 - 7
src/api/order/list.ts

@@ -9,13 +9,13 @@ import {
 import type { Result } from '/#/axios';
 
 enum Api {
-  pageList = '/basic-api/order/list',
-  getOrderInfo = '/basic-api/order/info',
-  prderConfirm = '/basic-api/order/confirm',
-  shippingList = '/basic-api/shipping/list',
-  brandList = '/basic-api/brand/queryAll',
-  sendGoods = '/basic-api/order/sendGoods',
-  exportExcel = '/basic-api/order/export',
+  pageList = '/zfb-api/zfb/order/list',
+  getOrderInfo = '/zfb-api/zfb/order/info',
+  prderConfirm = '/zfb-api/zfb/order/confirm',
+  shippingList = '/zfb-api/zfb/shipping/list',
+  brandList = '/zfb-api/zfb/brand/queryAll',
+  sendGoods = '/zfb-api/zfb/order/sendGoods',
+  exportExcel = '/zfb-api/zfb/order/export',
 }
 
 /**

+ 9 - 9
src/api/product/category.ts

@@ -3,15 +3,15 @@ import { PageParams, updateItem, RentListGetResultModel, addCategoryParams } fro
 import { Result, UploadFileParams } from '/#/axios';
 
 enum Api {
-  category = '/basic-api/category/queryAll',
-  attribute = '/basic-api/specification/list',
-  delete = '/basic-api/specification/delete',
-  update = '/basic-api/specification/update',
-  save = '/basic-api/specification/save',
-  uploadBanner = '/basic-api/sys/oss/upload',
-  addCategory = '/basic-api/category/save',
-  updateCategory = '/basic-api/category/update',
-  deleteCategory = '/basic-api/category/delete',
+  category = '/zfb-api/zfb/category/queryAll',
+  attribute = '/zfb-api/zfb/specification/list',
+  delete = '/zfb-api/zfb/specification/delete',
+  update = '/zfb-api/zfb/specification/update',
+  save = '/zfb-api/zfb/specification/save',
+  uploadBanner = '/zfb-api/zfb/sys/oss/upload',
+  addCategory = '/zfb-api/zfb/category/save',
+  updateCategory = '/zfb-api/zfb/category/update',
+  deleteCategory = '/zfb-api/zfb/category/delete',
 }
 
 /**

+ 9 - 9
src/api/product/list.ts

@@ -3,15 +3,15 @@ import { PageParams, RentListGetResultModel } from './model';
 import { Result } from '/#/axios';
 
 enum Api {
-  pageList = '/basic-api/goods/list',
-  ref = '/basic-api/specification/list',
-  unSale = '/basic-api/goods/unSale',
-  enSale = '/basic-api/goods/enSale',
-  delete = '/basic-api/goods/delete',
-  info = '/basic-api/goods/info/',
-  update = '/basic-api/goods/update',
-  save = '/basic-api/goods/save',
-  queryAll = '/basic-api/specification/queryAll',
+  pageList = '/zfb-api/zfb/goods/list',
+  ref = '/zfb-api/zfb/specification/list',
+  unSale = '/zfb-api/zfb/goods/unSale',
+  enSale = '/zfb-api/zfb/goods/enSale',
+  delete = '/zfb-api/zfb/goods/delete',
+  info = '/zfb-api/zfb/goods/info/',
+  update = '/zfb-api/zfb/goods/update',
+  save = '/zfb-api/zfb/goods/save',
+  queryAll = '/zfb-api/zfb/specification/queryAll',
 }
 
 /**

+ 249 - 0
src/api/rightsEnterprises/list.ts

@@ -0,0 +1,249 @@
+import { defHttp } from '/@/utils/http/axios';
+import { PageParams, DelParams, roleParams } from './model';
+import { Result } from '/#/axios';
+
+enum Api {
+  pageList = '/zfb-api/zfb/shop/staffPerm/companyList',
+  cameraList = '/zfb-api/zfb/cameraIncrement/staticsByCompany',
+  staffList = '/zfb-api/zfb/shop/staffPerm/list',
+  cameraDetailList = '/zfb-api/zfb/cameraIncrement/list',
+  preDel = '/zfb-api/zfb/shop/sys/user/preDeleteStaff',
+  roleList = '/zfb-api/zfb/shop/sys/user/roleList',
+  getRoleListByParam = '/zfb-api/zfb/shop/sys/user/getRoleListByParam',
+  staffPermSave = '/zfb-api/zfb/shop/staffPerm/save',
+  staffPermBind = '/zfb-api/zfb/shop/staffPerm/bind',
+  bindStaffList = '/zfb-api/zfb/shop/staffPerm/bindStaffList',
+  cameraBind = '/zfb-api/zfb/cameraIncrement/bindCamera',
+  staffPermUnbind = '/zfb-api/zfb/shop/staffPerm/unbind',
+  cameraUnbind = '/zfb-api/zfb/cameraIncrement/unbind',
+  update = '/zfb-api/zfb/shop/sys/user/update',
+  checkUser = '/zfb-api/zfb/user/checkUserExists',
+  deleteStaff = '/zfb-api/zfb/shop/sys/user/deleteStaff',
+  getNumByStaff = '/zfb-api/zfb/shop/sys/user/getNumByStaff',
+  allList = '/zfb-api/zfb/shop/staffPerm/allList',
+  cameraallList = '/zfb-api/zfb/cameraIncrement/list',
+  allListType = '/zfb-api/zfb/shop/staffPerm/allListType',
+  deviceType = '/zfb-api/zfb/cameraIncrement/incrementTypes',
+  addCamrea = '/zfb-api/zfb/cameraIncrement/add',
+}
+
+/**
+ * @description: Get sample list value
+ */
+
+export const ListApi = (params: PageParams) =>
+  defHttp.post<Result>({
+    url: Api.pageList,
+    params,
+    data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const cameraListApi = (params: PageParams) =>
+  defHttp.post<Result>({
+    url: Api.cameraList,
+    params,
+    data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const staffList = (params: PageParams) =>
+  defHttp.post<Result>({
+    url: Api.staffList,
+    params,
+    data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const cameraDetailList = (params: PageParams) =>
+  defHttp.post<Result>({
+    url: Api.cameraDetailList,
+    params,
+    data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const getNumByStaff = (params: any) =>
+  defHttp.get<Result>({
+    url: Api.getNumByStaff,
+    params,
+    data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const delApi = (params: DelParams) =>
+  defHttp.post<Result>({
+    url: Api.deleteStaff,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const preDelApi = (params: number) =>
+  defHttp.post<Result>({
+    url: Api.preDel,
+    params: { userId: params },
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const getRoleListByParam = (params: roleParams) =>
+  defHttp.post<Result>({
+    url: Api.getRoleListByParam,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const roleLIstApi = (params) =>
+  defHttp.post<Result>({
+    url: Api.roleList,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const checkUserApi = (params) =>
+  defHttp.post<boolean>({
+    url: Api.checkUser,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const unbindRights = (params) =>
+  defHttp.post<Result>({
+    url: Api.staffPermUnbind,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const unbindCamera = (params) =>
+  defHttp.post<Result>({
+    url: Api.cameraUnbind,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const bindRights = (params) =>
+  defHttp.post<Result>({
+    url: Api.staffPermBind,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const bindStaffList = (params) =>
+  defHttp.get<Result>({
+    url: Api.bindStaffList,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const bindCamera = (params) =>
+  defHttp.post<Result>({
+    url: Api.cameraBind,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const saveRights = (params) =>
+  defHttp.post<Result>({
+    url: Api.staffPermSave,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const updateApi = (params) =>
+  defHttp.post<Result>({
+    url: Api.update,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const deviceType = (params: any) =>
+  defHttp.get<Result>({
+    url: Api.deviceType,
+    params,
+    data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const getAllList = (params: any) =>
+  defHttp.get<Result>({
+    url: Api.allList,
+    params,
+    data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const addCamrea = (params: any) =>
+  defHttp.post<Result>({
+    url: Api.addCamrea,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const getCameraallList = (params: any) =>
+  defHttp.get<Result>({
+    url: Api.cameraallList,
+    params,
+    data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const allListType = (params: any) =>
+  defHttp.get<Result>({
+    url: Api.allListType,
+    params,
+    data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });

+ 30 - 0
src/api/rightsEnterprises/model.ts

@@ -0,0 +1,30 @@
+import { BasicPageParams, BasicFetchResult } from '/@/api/model/baseModel';
+/**
+ * @description: Request list interface parameters
+ */
+export type PageParams = BasicPageParams;
+
+export interface DelParams {
+  userId: number;
+  toUserId: number;
+  toUserPhone: string;
+}
+
+export interface roleParams {
+  type: number;
+  roleId: number;
+}
+export interface StaffListItem {
+  id: number;
+
+  name: string;
+  company: string;
+  phone: string;
+  status: string;
+  role: string;
+  createTime: string;
+}
+/**
+ * @description: Request list return value
+ */
+export type ListGetResultModel = BasicFetchResult<StaffListItem>;

+ 1 - 1
src/api/scene/list.ts

@@ -15,7 +15,7 @@ enum Api {
   downloadSceneData = '/zfb-api/zfb/scene/downloadSceneData',
   getDownloadProcess = '/zfb-api/zfb/scene/getDownloadProcess',
   update = '/zfb-api/zfb/scene/update',
-  generateDefaultLiveRoom = '/basic-api/scene/generateDefaultLiveRoom',
+  generateDefaultLiveRoom = '/zfb-api/zfb/scene/generateDefaultLiveRoom',
 }
 
 /**

+ 10 - 10
src/api/scene/live.ts

@@ -10,20 +10,20 @@ import {
 } from './model';
 import { Result, UploadFileParams } from '/#/axios';
 enum Api {
-  pageList = '/basic-api/brand/brandBindList',
+  pageList = '/zfb-api/zfb/brand/brandBindList',
   bindAnchorList = '/zfb-api/zfb/shop/sys/user/bindList',
-  olderBindAnchorList = '/basic-api/sys/user/bindList',
+  olderBindAnchorList = '/zfb-api/zfb/sys/user/bindList',
   // brandTypeList = '/zfb-api/zfb/shop/brand/brandTypeList',
-  brandTypeList = '/basic-api/brand/brandTypeList',
+  brandTypeList = '/zfb-api/zfb/brand/brandTypeList',
   // bindUser = '/zfb-api/zfb/shop/sys/brand/bindUser',
-  bindUser = '/basic-api/brand/bindUser',
-  brandUpdate = '/basic-api/brand/update',
-  brandDelete = '/basic-api/brand/delete',
-  upload = '/basic-api/sys/oss/upload',
-  uploadVideo = '/basic-api/sys/oss/upLoadVideo',
+  bindUser = '/zfb-api/zfb/brand/bindUser',
+  brandUpdate = '/zfb-api/zfb/brand/update',
+  brandDelete = '/zfb-api/zfb/brand/delete',
+  upload = '/zfb-api/zfb/sys/oss/upload',
+  uploadVideo = '/zfb-api/zfb/sys/oss/upLoadVideo',
   getAllScene = '/zfb-api/zfb/scene/list',
-  getBrandInfo = '/basic-api/brand/info',
-  addSave = '/basic-api/brand/save',
+  getBrandInfo = '/zfb-api/zfb/brand/info',
+  addSave = '/zfb-api/zfb/brand/save',
 }
 export type SceneLiveItemResult = SceneLiveItem;
 /**

+ 12 - 0
src/api/staff/list.ts

@@ -12,12 +12,24 @@ enum Api {
   checkUser = '/zfb-api/zfb/user/checkUserExists',
   deleteStaff = '/zfb-api/zfb/shop/sys/user/deleteStaff',
   getNumByStaff = '/zfb-api/zfb/shop/sys/user/getNumByStaff',
+  clean = '/zfb-api/zfb/loginOutByUser',
 }
 
 /**
  * @description: Get sample list value
  */
 
+export const clean = (params) =>
+  defHttp.post<Result>({
+    url: Api.clean,
+    params,
+    data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
 export const ListApi = (params: PageParams) =>
   defHttp.post<ListGetResultModel>({
     url: Api.pageList,

+ 2 - 2
src/api/sys/model/uploadModel.ts

@@ -1,5 +1,5 @@
 export interface UploadApiResult {
   message: string;
-  code: number;
-  url: string;
+  code?: number;
+  url?: string;
 }

+ 1 - 1
src/api/sys/user.ts

@@ -12,7 +12,7 @@ import { ContentTypeEnum } from '/@/enums/httpEnum';
 // import { encode } from 'js-base64';
 
 enum Api {
-  // Login = '/basic-api/sys/login',
+  // Login = '/zfb-api/zfb/sys/login',
   Login = '/zfb-api/zfb/loginBackground',
   Logout = '/logout',
   updatePassword = '/zfb-api/zfb/user/updatePassword',

+ 3 - 3
src/api/system/system.ts

@@ -30,15 +30,15 @@ enum Api {
   AccountList = '/zfb-api/zfb/shop/sys/user/list',
   saveAccount = '/zfb-api/zfb/shop/sys/user/save',
   updateAccount = '/zfb-api/zfb/shop/sys/user/update',
-  IsAccountExist = '/basic-api/system/accountExist',
+  IsAccountExist = '/zfb-api/zfb/system/accountExist',
   deleteAccountUser = '/zfb-api/zfb/shop/sys/user/preDeleteStaff',
 
   RolePageList = '/zfb-api/zfb/shop/sys/role/list',
-  setRoleStatus = '/basic-api/system/setRoleStatus',
+  setRoleStatus = '/zfb-api/zfb/system/setRoleStatus',
   saveRole = '/zfb-api/zfb/shop/sys/role/save',
   deleteRole = '/zfb-api/zfb/shop/sys/role/delete',
   updateRole = '/zfb-api/zfb/shop/sys/role/update',
-  GetAllRoleList = '/basic-api/system/getAllRoleList',
+  GetAllRoleList = '/zfb-api/zfb/system/getAllRoleList',
   roleSelectList = '/zfb-api/zfb/shop/sys/role/select',
 
   DeptList = '/zfb-api/zfb/shop/sys/dept/list',

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

@@ -84,6 +84,7 @@
 
       // 上传modal保存操作
       function handleChange(urls: string[]) {
+        console.log('handleChange', urls);
         fileList.value = [...unref(fileList), ...(urls || [])];
         emit('update:value', fileList.value);
         emit('change', fileList.value);

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

@@ -283,9 +283,8 @@
 
         for (const item of fileListRef.value) {
           const { status, responseData } = item;
-          console.log('responseData', item);
           if (status === UploadResultStatus.SUCCESS && responseData) {
-            fileList.push(responseData.url);
+            fileList.push(responseData.message);
           }
         }
         // 存在一个上传成功的即可保存

+ 3 - 0
src/enums/cacheEnum.ts

@@ -9,6 +9,9 @@ export const USER_INFO_KEY = 'USER__INFO__';
 // role info key
 export const ROLES_KEY = 'ROLES__KEY__';
 
+// perm info key
+export const PERM_KEY = 'PERM__KEY__';
+
 // project config key
 export const PROJ_CFG_KEY = 'PROJ__CFG__KEY__';
 

+ 1 - 0
src/locales/lang/zh-CN/common.ts

@@ -40,4 +40,5 @@ export default {
   mobile: '手机',
   phone: '请填写您的手机号码!',
   phoneError: '请正确填写您的手机号码!',
+  staffPhoneError: '请正确填写您的企业账户!',
 };

+ 1 - 0
src/locales/lang/zh-CN/routes/dashboard.ts

@@ -29,6 +29,7 @@ export default {
   memberList: '会员列表',
   staff: '员工管理',
   staffList: '员工列表',
+  staffClean: '清除状态',
   feedback: '反馈管理',
   feedbackList: '反馈列表',
 };

+ 1 - 1
src/locales/lang/zh-CN/routes/devices.ts

@@ -45,7 +45,7 @@ export default {
   bindErr: '账号已被该企业绑定',
   excess: '账号数量已满!',
   unbindWarning: '确定要解绑该账号?',
-  addeduser: '已添加员工',
+  addeduser: '已添加员工',
   num: '设备数量',
   subNum: '可添加员工总数',
 

+ 44 - 0
src/locales/lang/zh-CN/routes/rightsEnterprises.ts

@@ -0,0 +1,44 @@
+export default {
+  menuName: '企业权益管理',
+  menuList: '企业权益',
+  menuTableList: '企业相机权益',
+  staffList: '员工权益',
+  staffName: '员工名称',
+  staffPhone: '员工手机号码',
+  timeField: '时间',
+  companyName: '企业名称',
+  companyId: '企业ID',
+  companyPhone: '企业账号',
+  userPermNum: '用户权益总数',
+  exUserPermNum: '已过期用户权益数',
+  // companyName:'购买日期',
+  ddd: '公司到期日期',
+  add: '新增权益',
+  title: '新增权益',
+  rightsType: '权益类型',
+  year: '年限',
+  muber: '数量',
+  purchaseTime: '购买日期',
+  permName: '权益',
+  createTime: '购买时间',
+  activationTime: '激活时间',
+  expirationTime: '到期时间',
+  incrementNum: '权益数',
+  addText: '新增',
+  kk: '四维看看 pro',
+  kj: '四维看见',
+  ss: '四维深时',
+  snCode: '授权相机S/N码',
+  snCodeText: '相机SN码',
+  cameraIncrementTypeName: '设备类型',
+  state: {
+    0: '未激活',
+    1: '已生效',
+    2: '已过期',
+    9: '未过期',
+  },
+  addcamera: '新增相机权益',
+  maxlength: '请输入0-999的权益数!',
+  integer: '权益数应为正整数!',
+  cameraTitle: '相机权益',
+};

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

@@ -44,4 +44,9 @@ export default {
     3: '民宿',
     9: '全部',
   },
+  status: '状态',
+  statusText: {
+    1: '正常',
+    0: '封存',
+  },
 };

+ 1 - 0
src/locales/lang/zh-CN/routes/staff.ts

@@ -4,6 +4,7 @@ export default {
   nickName: '员工昵称',
   setpaswd: '修改密码',
   mobile: '手机',
+  permList: '权益',
   createTime: '创建时间',
   staffList: '员工列表',
   updateBtn: '修改密码',

+ 69 - 0
src/router/routes/modules/rightsEnterprises.ts

@@ -0,0 +1,69 @@
+import type { AppRouteModule } from '/@/router/types';
+
+import { LAYOUT } from '/@/router/constant';
+import { t } from '/@/hooks/web/useI18n';
+
+const staff: AppRouteModule = {
+  path: '/rightsEnterprises',
+  name: 'RightsEnterprises',
+  component: LAYOUT,
+  redirect: '/rightsEnterprises/rights/list',
+  meta: {
+    icon: 'bi:columns',
+    title: t('routes.rightsEnterprises.menuName'),
+    orderNo: 150,
+  },
+  children: [
+    {
+      path: 'camera/list',
+      name: 'CameraList',
+      // component: () => import('/@/views/rightsEnterprises/enterprises.vue'),
+      component: () => import('/@/views/rightsEnterprises/cameraList.vue'),
+      meta: {
+        title: t('routes.rightsEnterprises.staffList'),
+        icon: 'ic:outline-remember-me',
+        hideChildrenInMenu: true,
+      },
+      children: [
+        {
+          path: 'camera/detail/:id',
+          name: 'CameraDetail',
+          component: () => import('/@/views/rightsEnterprises/cameraDetail.vue'),
+          meta: {
+            currentActiveMenu: '/rightsEnterprises/camera/list',
+            title: t('routes.rightsEnterprises.staffList'),
+            hideMenu: true,
+            dynamicLevel: 3,
+            realPath: '/rightsEnterprises/camera/detail',
+          },
+        },
+      ],
+    },
+    {
+      path: 'rights/list',
+      name: 'RightsList',
+      component: () => import('/@/views/rightsEnterprises/rightsList.vue'),
+      meta: {
+        title: t('routes.rightsEnterprises.staffList'),
+        icon: 'ic:outline-remember-me',
+        hideChildrenInMenu: true,
+      },
+      children: [
+        {
+          path: 'rights/detail/:id',
+          name: 'RightsDetail',
+          component: () => import('/@/views/rightsEnterprises/rightsDetail.vue'),
+          meta: {
+            currentActiveMenu: '/rightsEnterprises/rights/list',
+            title: t('routes.dashboard.orderDetail'),
+            hideMenu: true,
+            dynamicLevel: 3,
+            realPath: '/rightsEnterprises/rights/detail',
+          },
+        },
+      ],
+    },
+  ],
+};
+
+export default staff;

+ 9 - 0
src/router/routes/modules/staff.ts

@@ -23,6 +23,15 @@ const staff: AppRouteModule = {
         icon: 'ic:outline-remember-me',
       },
     },
+    {
+      path: 'clean',
+      name: 'StaffClean',
+      component: () => import('/@/views/staff/clean.vue'),
+      meta: {
+        title: t('routes.dashboard.staffClean'),
+        icon: 'ic:outline-remember-me',
+      },
+    },
   ],
 };
 

+ 31 - 2
src/store/modules/user.ts

@@ -4,7 +4,7 @@ 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, PERM_KEY, TOKEN_KEY, USER_INFO_KEY } from '/@/enums/cacheEnum';
 import { getAuthCache, setAuthCache } from '/@/utils/auth';
 import { GetUserInfoModel, LoginParams } from '/@/api/sys/model/userModel';
 // doLogout
@@ -23,6 +23,7 @@ interface UserState {
   userInfo: Nullable<UserInfo>;
   token?: string;
   roleList: RoleEnum[];
+  permList: number[];
   sessionTimeout?: boolean;
   lastUpdateTime: number;
 }
@@ -36,6 +37,7 @@ export const useUserStore = defineStore({
     token: undefined,
     // roleList
     roleList: [],
+    permList: [],
     // Whether the login expired
     sessionTimeout: false,
     // Last fetch time
@@ -54,6 +56,9 @@ export const useUserStore = defineStore({
     getRoleList(): RoleEnum[] {
       return this.roleList.length > 0 ? this.roleList : getAuthCache<RoleEnum[]>(ROLES_KEY);
     },
+    getPermList(): number[] {
+      return this.permList.length > 0 ? this.permList : getAuthCache<number[]>(PERM_KEY);
+    },
     getSessionTimeout(): boolean {
       return !!this.sessionTimeout;
     },
@@ -72,6 +77,11 @@ export const useUserStore = defineStore({
       console.log('setRoleList', roleList);
       setAuthCache(ROLES_KEY, roleList);
     },
+    setPermList(permList: number[]) {
+      this.permList = permList;
+      console.log('setPermList', permList);
+      setAuthCache(PERM_KEY, permList);
+    },
     setUserInfo(info: UserInfo | null) {
       this.userInfo = info;
       this.lastUpdateTime = new Date().getTime();
@@ -137,7 +147,8 @@ export const useUserStore = defineStore({
       const userId: number = id || Number(this.getUserInfoCache.id);
       // debugger;
       const userInfo = await getUserInfo(userId);
-      const { roleIdList = [] } = userInfo;
+      const { roleIdList = [], permList = [] } = userInfo;
+      isArray(roleIdList) && this.setPermList(permList);
       if (isArray(roleIdList)) {
         const roleList = roleIdList.map((item) => {
           switch (item) {
@@ -213,6 +224,24 @@ export const useUserStore = defineStore({
       }
       return (intersection(value, roleList) as RoleEnum[]).length > 0;
     },
+
+    getEquity(value): boolean {
+      //拍摄1  带看 2
+      function isContained(a, b) {
+        if (!(a instanceof Array) || !(b instanceof Array)) return false;
+        if (a.length < b.length) return false;
+        const aStr = a.toString();
+        for (let i = 0, len = b.length; i < len; i++) {
+          if (aStr.indexOf(b[i]) == -1) return false;
+        }
+        return true;
+      }
+      if (value.isArray) {
+        return isContained(this.permList, value);
+      } else {
+        return isContained(this.permList, [value]);
+      }
+    },
   },
 });
 

+ 2 - 0
src/utils/cache/persistent.ts

@@ -8,6 +8,7 @@ import {
   TOKEN_KEY,
   USER_INFO_KEY,
   ROLES_KEY,
+  PERM_KEY,
   LOCK_INFO_KEY,
   PROJ_CFG_KEY,
   APP_LOCAL_CACHE_KEY,
@@ -22,6 +23,7 @@ interface BasicStore {
   [TOKEN_KEY]: string | number | null | undefined;
   [USER_INFO_KEY]: UserInfo;
   [ROLES_KEY]: string[];
+  [PERM_KEY]: string[];
   [LOCK_INFO_KEY]: LockInfo;
   [PROJ_CFG_KEY]: ProjectConfig;
   [MULTIPLE_TABS_KEY]: RouteLocationNormalized[];

+ 44 - 2
src/views/advertisement/schemas.ts

@@ -59,15 +59,36 @@ export const padsSchemas: FormSchema[] = [
   },
   {
     field: 'orderNum',
-    component: 'Input',
+    component: 'InputNumber',
     label: '排序',
     defaultValue: 0,
     componentProps: {
+      maxLength: 5,
       placeholder: '推荐排序',
       type: 'number',
       min: 0,
+      max: 99999999,
     },
     required: true,
+    rules: [
+      {
+        required: true,
+        // @ts-ignore
+        validator: async (rule, value) => {
+          const regPos = /(^[1-9]\d*$)/; // 非负整数
+          // var reg = /\S+@\S+\.\S+/;
+          if (!value) {
+            return Promise.reject('请输入排序数');
+          }
+          if (!regPos.test(value)) {
+            /* eslint-disable-next-line */
+            return Promise.reject('请输入正确的排序数');
+          }
+          return Promise.resolve();
+        },
+        trigger: 'change',
+      },
+    ],
   },
   // {
   //   field: 'connectId',
@@ -114,15 +135,36 @@ export const schemas: FormSchema[] = [
 
   {
     field: 'orderNum',
-    component: 'Input',
+    component: 'InputNumber',
     label: '轮播排序',
     defaultValue: 0,
     componentProps: {
+      maxLength: 5,
       placeholder: '轮播排序',
+      max: 99999999,
       type: 'number',
       min: 0,
     },
     required: true,
+    rules: [
+      {
+        required: true,
+        // @ts-ignore
+        validator: async (rule, value) => {
+          const regPos = /(^[1-9]\d*$)/; // 非负整数
+          // var reg = /\S+@\S+\.\S+/;
+          if (!value) {
+            return Promise.reject('请输入排序数');
+          }
+          if (!regPos.test(value)) {
+            /* eslint-disable-next-line */
+            return Promise.reject('请输入正确的排序数');
+          }
+          return Promise.resolve();
+        },
+        trigger: 'change',
+      },
+    ],
   },
   // {
   //   field: 'url',

+ 16 - 16
src/views/corporation/AddCorporationModal.vue

@@ -17,7 +17,7 @@
   import { BasicModal, useModalInner } from '/@/components/Modal';
   import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
   import { useMessage } from '/@/hooks/web/useMessage';
-  import dayjs from 'dayjs';
+  // import dayjs from 'dayjs';
   // import { checkUserAddAble } from '/@/api/corporation/modal';
   import { data as CascaderData } from '/@/utils/cascaderData';
   import { useI18n } from '/@/hooks/web/useI18n';
@@ -127,21 +127,21 @@
         maxLength: 50,
       },
     },
-    {
-      field: 'expirationTime',
-      component: 'DatePicker',
-      label: t('routes.corporation.expirationTime'),
-      required: true,
-      colProps: {
-        span: 22,
-      },
-      componentProps: {
-        valueFormat: 'YYYY-MM-DD',
-        disabledDate: (current) => {
-          return current && current < dayjs().endOf('day');
-        },
-      },
-    },
+    // {
+    //   field: 'expirationTime',
+    //   component: 'DatePicker',
+    //   label: t('routes.corporation.expirationTime'),
+    //   required: true,
+    //   colProps: {
+    //     span: 22,
+    //   },
+    //   componentProps: {
+    //     valueFormat: 'YYYY-MM-DD',
+    //     disabledDate: (current) => {
+    //       return current && current < dayjs().endOf('day');
+    //     },
+    //   },
+    // },
     {
       field: 'logo',
       component: 'Upload',

+ 69 - 79
src/views/corporation/SubaccountModal.vue

@@ -15,14 +15,9 @@
         <template #name="{ model, field }">
           {{ model[field] }}
         </template>
-        <template #addeduser="{ model, field }">
-          {{ model[field] || 0 }}
-          <a-button
-            :disabled="model[field] >= modelRef.subNum"
-            @click="openTargetModal()"
-            type="primary"
-            preIcon="ic:outline-person-add"
-          >
+        <template #addeduser>
+          <!-- {{ model[field] || 0 }} :disabled="model[field] >= modelRef.subNum" ="{ model, field }"-->
+          <a-button @click="openTargetModal()" type="primary" preIcon="ic:outline-person-add">
             {{ t('routes.devices.add') }}{{ t('routes.devices.title') }}
           </a-button>
         </template>
@@ -201,68 +196,68 @@
           component: 'Input',
           labelWidth: 200,
         },
-        {
-          field: 'shotNum',
-          component: 'InputNumber',
-          slot: 'subNum',
-          label: `可拍摄员工数 :`,
-          labelWidth: 200,
-          rules: [
-            {
-              required: false,
-              // @ts-ignore
-              validator: async (rule, value) => {
-                let { addeduser, lookNum } = getFieldsValue();
-                if (value < addeduser - lookNum) {
-                  return Promise.reject('可添加员工总数应大于已添加员工数');
-                }
-                return Promise.resolve();
-              },
-              trigger: 'change',
-            },
-          ],
-          componentProps: () => {
-            return {
-              // xxxx props schema, tableAction, formModel  checkDevice
-              min: 0,
-              max: 999,
-              onChange: numOnChange,
-            };
-          },
-        },
-        {
-          field: 'lookNum',
-          component: 'InputNumber',
-          slot: 'subNum',
-          label: `可带看员工数 :`,
-          labelWidth: 200,
-          rules: [
-            {
-              required: false,
-              // @ts-ignore
-              validator: async (rule, value) => {
-                let { addeduser, shotNum } = getFieldsValue();
-                console.log('validator', value, addeduser);
-                if (value < addeduser - shotNum) {
-                  return Promise.reject('可添加员工总数应大于已添加员工数');
-                }
-                return Promise.resolve();
-              },
-              trigger: 'change',
-            },
-          ],
-          componentProps: () => {
-            return {
-              // xxxx props schema, tableAction, formModel  checkDevice
-              max: 999,
-              min: 0,
-              onChange: numsOnChange,
-            };
-          },
-        },
+        // {
+        //   field: 'shotNum',
+        //   component: 'InputNumber',
+        //   slot: 'subNum',
+        //   label: `可拍摄员工数 :`,
+        //   labelWidth: 200,
+        //   rules: [
+        //     {
+        //       required: false,
+        //       // @ts-ignore
+        //       validator: async (rule, value) => {
+        //         let { addeduser, lookNum } = getFieldsValue();
+        //         if (value < addeduser - lookNum) {
+        //           return Promise.reject('可添加员工总数应大于已添加员工数');
+        //         }
+        //         return Promise.resolve();
+        //       },
+        //       trigger: 'change',
+        //     },
+        //   ],
+        //   componentProps: () => {
+        //     return {
+        //       // xxxx props schema, tableAction, formModel  checkDevice
+        //       min: 0,
+        //       max: 999,
+        //       onChange: numOnChange,
+        //     };
+        //   },
+        // },
+        // {
+        //   field: 'lookNum',
+        //   component: 'InputNumber',
+        //   slot: 'subNum',
+        //   label: `可带看员工数 :`,
+        //   labelWidth: 200,
+        //   rules: [
+        //     {
+        //       required: false,
+        //       // @ts-ignore
+        //       validator: async (rule, value) => {
+        //         let { addeduser, shotNum } = getFieldsValue();
+        //         console.log('validator', value, addeduser);
+        //         if (value < addeduser - shotNum) {
+        //           return Promise.reject('可添加员工总数应大于已添加员工数');
+        //         }
+        //         return Promise.resolve();
+        //       },
+        //       trigger: 'change',
+        //     },
+        //   ],
+        //   componentProps: () => {
+        //     return {
+        //       // xxxx props schema, tableAction, formModel  checkDevice
+        //       max: 999,
+        //       min: 0,
+        //       onChange: numsOnChange,
+        //     };
+        //   },
+        // },
         {
           field: 'addeduser',
-          label: `${t('routes.devices.addeduser')}`,
+          label: ` `,
           labelWidth: 200,
           slot: 'addeduser',
           component: 'Input',
@@ -450,23 +445,18 @@
           }
         });
         console.log('look', look, shoot, 'shotNum, lookNum', shotNum, lookNum, newUser);
-        if ((newUser.roleId == 8 || newUser.roleId == 81) && !(look < lookNum)) {
-          return createMessage.error('可带看员工数不足');
-        } else if ((newUser.roleId == 8 || newUser.roleId == 82) && !(shoot < shotNum)) {
-          return createMessage.error('可拍摄员工数不足');
-        }
+        // if ((newUser.roleId == 8 || newUser.roleId == 81) && !(look < lookNum)) {
+        //   return createMessage.error('可带看员工数不足');
+        // } else if ((newUser.roleId == 8 || newUser.roleId == 82) && !(shoot < shotNum)) {
+        //   return createMessage.error('可拍摄员工数不足');
+        // }
         minNumber.lookNum = lookNum;
         minNumber.shotNum = shotNum;
-        let obj = {
-          8: '带看&拍摄员工',
-          81: '带看员工',
-          82: '拍摄员工',
-        };
         insertTableDataRecord({
           nickName: newUser.memoName,
           userName: newUser.phone,
           phone: newUser.phone,
-          roleName: obj[newUser.roleId],
+          roleName: '公司员工',
           roleId: newUser.roleId,
         });
 

+ 6 - 6
src/views/corporation/index.vue

@@ -202,12 +202,12 @@
           dataIndex: 'point',
           width: 80,
         },
-        {
-          title: t('routes.corporation.expirationTime'),
-          dataIndex: 'expirationTime',
-          slots: { customRender: 'expirationTime' },
-          width: 180,
-        },
+        // {
+        //   title: t('routes.corporation.expirationTime'),
+        //   dataIndex: 'expirationTime',
+        //   slots: { customRender: 'expirationTime' },
+        //   width: 180,
+        // },
       ];
 
       const searchForm: Partial<FormProps> = {

+ 40 - 40
src/views/devices/AddModal.vue

@@ -17,7 +17,7 @@
   import { BasicModal, useModalInner } from '/@/components/Modal';
   import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
   import { useMessage } from '/@/hooks/web/useMessage';
-  import { allCompanyApi, addCameraApi } from '/@/api/device/list';
+  import { addCameraApi } from '/@/api/device/list';
   import { useI18n } from '/@/hooks/web/useI18n';
 
   const { t } = useI18n();
@@ -77,15 +77,15 @@
             span: 24,
           },
         },
-        {
-          field: 'address',
-          required: true,
-          component: 'Input',
-          label: t('routes.devices.address'),
-          colProps: {
-            span: 24,
-          },
-        },
+        // {
+        //   field: 'address',
+        //   required: true,
+        //   component: 'Input',
+        //   label: t('routes.devices.address'),
+        //   colProps: {
+        //     span: 24,
+        //   },
+        // },
         {
           field: 'snCode',
           component: 'Input',
@@ -112,36 +112,36 @@
             span: 24,
           },
         },
-        {
-          field: 'orderSn',
-          component: 'Input',
-          label: t('routes.devices.orderSn'),
-          colProps: {
-            span: 24,
-          },
-        },
-        {
-          field: 'companyId',
-          component: 'ApiSelect',
-          label: t('routes.devices.companyId'),
-          itemProps: {
-            validateTrigger: 'blur',
-          },
-          componentProps: {
-            api: allCompanyApi,
-            numberToString: true,
-            labelField: 'name',
-            valueField: 'id',
-            immediate: true,
-            params: {
-              page: 1,
-              limit: 1000,
-            },
-          },
-          colProps: {
-            span: 24,
-          },
-        },
+        // {
+        //   field: 'orderSn',
+        //   component: 'Input',
+        //   label: t('routes.devices.orderSn'),
+        //   colProps: {
+        //     span: 24,
+        //   },
+        // },
+        // {
+        //   field: 'companyId',
+        //   component: 'ApiSelect',
+        //   label: t('routes.devices.companyId'),
+        //   itemProps: {
+        //     validateTrigger: 'blur',
+        //   },
+        //   componentProps: {
+        //     api: allCompanyApi,
+        //     numberToString: true,
+        //     labelField: 'name',
+        //     valueField: 'id',
+        //     immediate: true,
+        //     params: {
+        //       page: 1,
+        //       limit: 1000,
+        //     },
+        //   },
+        //   colProps: {
+        //     span: 24,
+        //   },
+        // },
       ];
       const [registerForm, { validate, resetFields }] = useForm({
         labelWidth: 120,

+ 12 - 12
src/views/devices/EditModal.vue

@@ -121,18 +121,18 @@
             span: 24,
           },
         },
-        {
-          field: 'address',
-          component: 'Input',
-          required: true,
-          label: t('routes.devices.address'),
-          componentProps: {
-            disabled: true,
-          },
-          colProps: {
-            span: 24,
-          },
-        },
+        // {
+        //   field: 'address',
+        //   component: 'Input',
+        //   required: true,
+        //   label: t('routes.devices.address'),
+        //   componentProps: {
+        //     disabled: true,
+        //   },
+        //   colProps: {
+        //     span: 24,
+        //   },
+        // },
         {
           field: 'snCode',
           component: 'Input',

+ 1 - 0
src/views/devices/list.vue

@@ -87,6 +87,7 @@
         {
           title: t('routes.devices.companyId'),
           dataIndex: 'companyName',
+          ifShow: false,
           width: 260,
         },
         {

+ 15 - 2
src/views/product/list.data.ts

@@ -7,7 +7,7 @@ import { useMessage } from '/@/hooks/web/useMessage';
 import { useI18n } from '/@/hooks/web/useI18n';
 import { useUserStore } from '/@/store/modules/user';
 const userStore = useUserStore();
-const { getCheckRole } = userStore;
+const { getCheckRole, getEquity } = userStore;
 export const searchForm: Partial<FormProps> = {
   labelWidth: 100,
   schemas: [
@@ -107,6 +107,7 @@ export const columns: BasicColumn[] = [
   {
     title: '上架状态',
     dataIndex: 'isOnSale',
+    ifShow: showAction,
     width: 180,
     customRender: ({ record }) => {
       if (!Reflect.has(record, 'pendingStatus')) {
@@ -140,8 +141,20 @@ export const columns: BasicColumn[] = [
     title: '操作',
     dataIndex: '',
     slots: { customRender: 'action' },
-    ifShow: !getCheckRole('tourist'),
+    ifShow: showAction,
     fixed: 'right',
     width: 120,
   },
 ];
+function showAction(): boolean {
+  if (getCheckRole(['staff']) && getEquity([1, 2])) {
+    return true;
+  }
+  if (getCheckRole(['company_admin', 'staff']) && getEquity([2])) {
+    return true;
+  }
+  if (getCheckRole(['super', 'plat_admin'])) {
+    return true;
+  }
+  return false;
+}

+ 15 - 2
src/views/product/list.vue

@@ -4,7 +4,7 @@
       @register="registerTable"
       :rowSelection="{ type: 'checkbox', onChange: onSelectChange }"
     >
-      <template #toolbar v-if="!getCheckRole('tourist')">
+      <template #toolbar v-if="!getCheckRole('tourist') && showAction()">
         <a-button type="primary" @click="handleCreate"> 新增商品</a-button>
         <PopConfirmButton
           title="是否确定批量删除?"
@@ -90,7 +90,7 @@
       const { t } = useI18n();
       const [registerDrawer, { openDrawer }] = useDrawer();
       const userStore = useUserStore();
-      const { getCheckRole } = userStore;
+      const { getCheckRole, getEquity } = userStore;
       const [registerTable, { reload, getSelectRowKeys }] = useTable({
         title: '商品列表',
         api: ListApi,
@@ -175,8 +175,21 @@
           nextTick(reload);
         }
       }
+      function showAction(): boolean {
+        if (getCheckRole(['staff']) && getEquity([1, 2])) {
+          return true;
+        }
+        if (getCheckRole(['company_admin', 'staff']) && getEquity([2])) {
+          return true;
+        }
+        if (getCheckRole(['super', 'plat_admin'])) {
+          return true;
+        }
+        return false;
+      }
       return {
         registerTable,
+        showAction,
         createMessage,
         t,
         go,

+ 214 - 0
src/views/rightsEnterprises/BindModal.vue

@@ -0,0 +1,214 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @cancel="resetFields"
+    @register="register"
+    :title="title"
+    @ok="handleOk"
+  >
+    <div class="pt-3px pr-3px">
+      <BasicForm @register="registerForm">
+        <template #permList="{ model, field }">
+          <a-select
+            :options="permListOptions"
+            mode="multiple"
+            v-model:value="model[field]"
+            allowClear
+          />
+        </template>
+        <template #text="{ model, field }">
+          {{ model[field] }}
+        </template>
+      </BasicForm>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, computed, reactive } from 'vue';
+  import { bindRights, bindStaffList } from '/@/api/rightsEnterprises/list'; //roleLIstApi
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useUserStore } from '/@/store/modules/user';
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['ok'],
+    setup(_, context) {
+      const modelRef = ref({
+        isSee: false,
+      });
+      const userStore = useUserStore();
+      const userIdList = reactive({
+        list: [],
+      });
+      const userinfo = computed(() => userStore.getUserInfo);
+      const { companyId } = userinfo.value;
+      console.log('companyId', companyId);
+      const permListOptions = computed(() => {
+        return [
+          {
+            label: '带看',
+            value: '1',
+          },
+          {
+            label: '拍摄',
+            value: '2',
+          },
+        ];
+      });
+      const schemas: FormSchema[] = [
+        {
+          field: 'permName',
+          component: 'Input',
+          label: '权益',
+          colProps: {
+            span: 18,
+          },
+          required: false,
+          slot: 'text',
+        },
+        {
+          field: 'userId',
+          label: '员工名称',
+          component: 'Select',
+          itemProps: {
+            validateTrigger: 'blur',
+          },
+          colProps: {
+            span: 22,
+          },
+          required: true,
+          // ifShow: getCheckRole('plat_admin'),
+          componentProps: {
+            options: userIdList.list,
+            onChange: userIdChange,
+          },
+        },
+        {
+          field: 'staffPhone',
+          component: 'Input',
+          label: '手机号',
+          colProps: {
+            span: 22,
+          },
+          componentProps: {
+            maxLength: 15,
+          },
+          slot: 'text',
+        },
+        {
+          field: 'activationTime',
+          component: 'Input',
+          label: '权益激活时间',
+          colProps: {
+            span: 22,
+          },
+          defaultValue: 8,
+          slot: 'text',
+        },
+        {
+          field: 'expirationTime',
+          component: 'Input',
+          label: '权益过期时间',
+          colProps: {
+            span: 22,
+          },
+          defaultValue: 8,
+          slot: 'text',
+        },
+        {
+          field: 'id',
+          component: 'Input',
+          label: 'id',
+          show: false,
+        },
+      ];
+      const title = ref('绑 定');
+      const { createMessage } = useMessage();
+      const [registerForm, { setFieldsValue, validate, updateSchema, resetFields }] = useForm({
+        labelWidth: 120,
+        schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+
+      const [register, { closeModal }] = useModalInner((data) => {
+        data && onDataReceive(data);
+      });
+      async function onDataReceive(data) {
+        // 方式1;
+        let list = await bindStaffList({
+          companyId: data.companyId,
+          staffPermId: data.id,
+        });
+        userIdList.list = list.map((ele) => {
+          return {
+            ...ele,
+            label: ele.staffName,
+            value: ele.staffId,
+            key: ele.staffPhone,
+          };
+        });
+        console.log('handleDelete', userIdList.list);
+        modelRef.value.isSee = data.userId ? true : false;
+        title.value = data.userId ? '查 看' : '绑 定';
+        setFieldsValue({
+          ...data,
+          userId: data.userId ? data.staffName : data.userId,
+        });
+        let setSchema = [
+          {
+            field: 'userId',
+            required: !data.userId,
+            slot: !!data.userId ? 'text' : false,
+          },
+          {
+            field: 'userId',
+            componentProps: {
+              options: userIdList.list,
+            },
+          },
+        ];
+        updateSchema(setSchema);
+      }
+      function userIdChange(val, item) {
+        console.log('handleDelete', val, item);
+        setFieldsValue({
+          ...item,
+        });
+      }
+      async function handleOk() {
+        if (modelRef.value.isSee) {
+          return closeModal();
+        }
+        let data = await validate();
+        let res = await bindRights({
+          userId: data.userId,
+          id: data.id,
+        });
+        context && context.emit('update', res);
+        createMessage.success(t('common.optSuccess'));
+        closeModal();
+        resetFields();
+      }
+
+      return {
+        register,
+        title,
+        schemas,
+        registerForm,
+        modelRef,
+        handleOk,
+        resetFields,
+        permListOptions,
+      };
+    },
+  });
+</script>

+ 204 - 0
src/views/rightsEnterprises/addCameraModal.vue

@@ -0,0 +1,204 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    :title="t('routes.rightsEnterprises.addcamera')"
+    @ok="handleOk"
+    width="600px"
+  >
+    <div style="padding-bottom: 90px" class="pt-3px pr-3px">
+      <BasicForm @register="registerForm">
+        <template #text="{ model, field }">
+          {{ model[field] }}
+        </template>
+      </BasicForm>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, computed } from 'vue';
+  import { addCamrea, deviceType } from '/@/api/rightsEnterprises/list'; //roleLIstApi
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { ListAllCompanyApi } from '/@/api/corporation/list';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import dayjs from 'dayjs';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useUserStore } from '/@/store/modules/user';
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['ok'],
+    setup(_, context) {
+      const modelRef = ref({
+        isSee: false,
+      });
+      const userStore = useUserStore();
+      const userinfo = computed(() => userStore.getUserInfo);
+      const { companyId } = userinfo.value;
+      console.log('companyId', companyId);
+      const schemas: FormSchema[] = [
+        {
+          field: 'companyId',
+          label: t('routes.rightsEnterprises.companyName'),
+          component: 'ApiSelect',
+          itemProps: {
+            validateTrigger: 'blur',
+          },
+          colProps: {
+            span: 22,
+          },
+          required: true,
+          componentProps: {
+            api: ListAllCompanyApi,
+            showSearch: true,
+            resultField: 'list',
+            labelField: 'name',
+            valueField: 'id',
+            immediate: true,
+            params: {
+              page: 1,
+              limit: 1000,
+            },
+            onOptionsChange: (data) => {
+              console.log('data', data, arguments);
+            },
+            onChange: (data) => {
+              console.log('data', data, arguments);
+            },
+          },
+        },
+        {
+          field: 'userIncrementTypeId',
+          label: t('routes.rightsEnterprises.cameraIncrementTypeName'),
+          component: 'ApiSelect',
+          itemProps: {
+            validateTrigger: 'blur',
+          },
+          colProps: {
+            span: 22,
+          },
+          required: true,
+          // ifShow: getCheckRole('plat_admin'),
+          componentProps: {
+            api: deviceType,
+            showSearch: true,
+            resultField: 'list',
+            labelField: 'name',
+            valueField: 'id',
+            immediate: true,
+            params: {
+              page: 1,
+              limit: 1000,
+            },
+            required: true,
+          },
+        },
+        {
+          label: t('routes.rightsEnterprises.incrementNum'),
+          field: 'incrementNum',
+          component: 'Input',
+          colProps: {
+            span: 22,
+          },
+          componentProps: {
+            maxLength: 3,
+          },
+          rules: [
+            {
+              required: true,
+              // @ts-ignore
+              validator: async (rule, value) => {
+                var regPos = /(^[1-9]\d*$)/; // 非负整数
+                // var reg = /\S+@\S+\.\S+/;
+                if (!value) {
+                  return Promise.reject('请输入权益数');
+                }
+                if (!regPos.test(value)) {
+                  /* eslint-disable-next-line */
+                  return Promise.reject('请输入正确的权益数');
+                }
+                return Promise.resolve();
+              },
+              trigger: 'change',
+            },
+          ],
+        },
+        {
+          field: 'incrementEndTime',
+          component: 'DatePicker',
+          label: t('routes.rightsEnterprises.expirationTime'),
+          colProps: {
+            span: 22,
+          },
+          componentProps: {
+            valueFormat: 'YYYY-MM-DD',
+            disabledDate: (current) => {
+              return current && current < dayjs().endOf('day');
+            },
+          },
+        },
+      ];
+      const title = ref('绑 定');
+      const { createMessage } = useMessage();
+      const [registerForm, { setFieldsValue, validate, updateSchema, resetFields }] = useForm({
+        labelWidth: 120,
+        schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+
+      const [register, { closeModal }] = useModalInner((data) => {
+        data && onDataReceive(data);
+      });
+      function onDataReceive(data) {
+        // 方式1;
+        modelRef.value.isSee = data.userId ? true : false;
+        setFieldsValue({
+          ...data,
+          userId: data.userId ? data.staffName : data.userId,
+        });
+        let setSchema = [
+          {
+            field: 'companyId',
+            componentProps: {
+              disabled: !data.modify,
+            },
+          },
+        ];
+        console.log('handleDelete', data, setSchema);
+        updateSchema(setSchema);
+      }
+
+      async function handleOk() {
+        if (modelRef.value.isSee) {
+          return closeModal();
+        }
+        let data = await validate();
+        let res = await addCamrea({
+          ...data,
+        });
+        context && context.emit('update', res);
+        createMessage.success(t('common.optSuccess'));
+        closeModal();
+        resetFields();
+      }
+
+      return {
+        register,
+        title,
+        schemas,
+        registerForm,
+        modelRef,
+        handleOk,
+        resetFields,
+        t,
+      };
+    },
+  });
+</script>

+ 328 - 0
src/views/rightsEnterprises/addModal.vue

@@ -0,0 +1,328 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    :title="t('routes.rightsEnterprises.add')"
+    @ok="saveTable"
+    width="700px"
+    @visible-change="handleVisibleChange"
+  >
+    <div class="pt-3px pr-3px">
+      <BasicForm @register="registerForm">
+        <template #text="{ model, field }">
+          {{ model[field] }}
+        </template>
+      </BasicForm>
+      <div class="table_list">
+        <BasicTable @register="registerSubtable">
+          <template #time>
+            <Time :value="new Date()" mode="date" />
+          </template>
+        </BasicTable>
+      </div>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, reactive, nextTick, unref } from 'vue';
+  import { BasicModal, useModalInner, useModal } from '/@/components/Modal';
+  import { BasicTable, useTable, BasicColumn } from '/@/components/Table';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { Time } from '/@/components/Time';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { allListType, saveRights } from '/@/api/rightsEnterprises/list';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  export default defineComponent({
+    components: {
+      BasicModal,
+      BasicForm,
+      BasicTable,
+      Time,
+    },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['addtable', 'register', 'update'],
+    setup(props, { emit }) {
+      const { t } = useI18n();
+      const { createConfirm, createMessage } = useMessage();
+
+      const [registerModal, { openModal: addopenModal }] = useModal();
+      const minNumber = reactive({
+        shotNum: 0,
+        lookNum: 0,
+      });
+      const modelRef = reactive({
+        id: 0,
+        subNum: 0,
+        companyId: 0,
+      });
+      const columns: BasicColumn[] = [
+        {
+          title: t('routes.rightsEnterprises.rightsType'),
+          width: 0,
+          ifShow: false,
+          dataIndex: 'id',
+        },
+        {
+          title: t('routes.rightsEnterprises.rightsType'),
+          width: 160,
+          dataIndex: 'permType',
+        },
+        {
+          title: t('routes.rightsEnterprises.year'),
+          width: 80,
+          dataIndex: 'useYear',
+        },
+        {
+          title: t('routes.rightsEnterprises.muber'),
+          dataIndex: 'muber',
+          edit: true,
+          // slots: { customRender: 'subNum' },
+          editRule: async (text) => {
+            var regPos = /^[0-9]\d*$/; // 整数
+            if (text > 999 || text < -1) {
+              return t('routes.rightsEnterprises.maxlength');
+            } else if (!regPos.test(text)) {
+              return t('routes.rightsEnterprises.integer');
+            }
+            return '';
+          },
+          editComponent: 'InputNumber',
+          width: 200,
+        },
+        {
+          title: t('routes.rightsEnterprises.purchaseTime'),
+          width: 150,
+          dataIndex: 'purchaseTime',
+          slots: { customRender: 'time' },
+        },
+      ];
+      const schemas: FormSchema[] = [
+        {
+          field: 'companyPhone',
+          component: 'Input',
+          label: `${t('routes.corporation.enterpriseId')} :`,
+          slot: 'text',
+          labelWidth: 200,
+        },
+        {
+          field: 'companyName',
+          label: `${t('routes.corporation.enterpriseName')} :`,
+          slot: 'text',
+          component: 'Input',
+          labelWidth: 200,
+        },
+      ];
+      const [registerForm, { setFieldsValue, resetFields, getFieldsValue, validateFields }] =
+        useForm({
+          labelWidth: 120,
+          schemas,
+          showActionButtonGroup: false,
+          actionColOptions: {
+            span: 24,
+          },
+        });
+
+      const [
+        registerSubtable,
+        { reload: reloadSubtable, deleteTableDataRecord, getDataSource, insertTableDataRecord },
+      ] = useTable({
+        // title: `${t('routes.devices.listTile')}`,
+        rowKey: 'phone',
+        api: allListType,
+        showIndexColumn: false,
+        canResize: false,
+        afterFetch: (T) => {
+          console.log('afterFetch', T);
+          return T.map((ele) => {
+            ele.muber = 1;
+            return ele;
+          });
+        },
+        columns,
+        bordered: true,
+        pagination: false,
+      });
+
+      const [register, { closeModal }] = useModalInner((data) => {
+        data && onDataReceive(unref(data));
+      });
+
+      async function onDataReceive(data) {
+        console.log('Data Received', data);
+        // 方式1;
+        resetFields();
+        reloadSubtable();
+        modelRef.companyId = data.companyId;
+        setFieldsValue({
+          ...data,
+        });
+      }
+      async function numOnChange() {
+        // await setFieldsValue({
+        //   [name]: data,
+        // });
+        let { shotNum, lookNum } = getFieldsValue();
+        modelRef.subNum = lookNum + shotNum;
+        validateFields(['lookNum', 'shotNum']);
+      }
+      async function numsOnChange(data, type) {
+        let formdata = getFieldsValue();
+        let value = formdata[type];
+        if (data) {
+          value++;
+        } else {
+          value--;
+        }
+        await setFieldsValue({
+          [type]: value,
+        });
+        let { shotNum, lookNum } = getFieldsValue();
+        modelRef.subNum = lookNum + shotNum;
+        validateFields(['lookNum', 'shotNum']);
+      }
+      async function handleDelete(item, type) {
+        if (type == 'edit') {
+          //编辑
+          const { memoName, phone } = item;
+          EditModal(true, {
+            memoName,
+            phone,
+          });
+        } else {
+          let { lookNum, shotNum } = minNumber;
+          // minNumber.shotNum = shotNum;
+          //解除
+          if (item.roleId == 8) {
+            lookNum--;
+            shotNum--;
+          } else if (item.roleId == 81) {
+            lookNum--;
+          } else if (item.roleId == 82) {
+            shotNum--;
+          }
+          createConfirm({
+            iconType: 'warning',
+            title: '提示',
+            content: t('routes.devices.unbindWarning'),
+            onOk: async () => {
+              // tableRef.value.deleteTableDataRecord(item.id);
+              deleteTableDataRecord(item.userName);
+              minNumber.lookNum = lookNum;
+              minNumber.shotNum = shotNum;
+            },
+          });
+        }
+      }
+      function handleVisibleChange(v) {
+        v && props.userData && nextTick(() => onDataReceive(props.userData));
+      }
+      function openTargetModal() {
+        console.log('openTargetModal');
+        addopenModal(true);
+      }
+      async function saveTable() {
+        // let tableData = tableRef.value.getDataSource() || [];
+        // let fromData = await validate();
+        let tableData = getDataSource();
+        let SunNum = 0,
+          permList = [];
+        tableData?.map((ele) => {
+          SunNum = SunNum + ele.muber;
+          permList.push({
+            staffPermTypeId: ele.id,
+            num: ele.muber || 0,
+            // takeLookNum:50,
+          });
+        });
+        if (SunNum == 0) {
+          return createMessage.warning('不支持两个权益都为空');
+        }
+        let res = await saveRights({
+          companyId: modelRef.companyId,
+          permList,
+        });
+        console.log('tableData', res);
+        createMessage.success(t('common.optSuccess'));
+        // reload();
+        emit('update');
+        closeModal();
+      }
+      function addTabledata(val) {
+        console.log('addTabledata', val);
+      }
+      function getTableList(callback) {
+        // let data = getFieldsValue();
+        let tableList = unref(getDataSource());
+        // setFieldsValue({
+        //   subNum: Number(data.subNum) - 1,
+        // });
+        callback(tableList);
+      }
+      // function formatRoleName(val) {
+
+      // },
+      function handleAddUser(newUser) {
+        let DataSource = getDataSource();
+        let { shotNum, lookNum } = getFieldsValue();
+        const total = DataSource?.length;
+        let look = 0,
+          shoot = 0;
+        DataSource.map((ele) => {
+          if (ele.roleId == 8) {
+            look++;
+            shoot++;
+          } else if (ele.roleId == 81) {
+            look++;
+          } else if (ele.roleId == 82) {
+            shoot++;
+          }
+        });
+        console.log('look', look, shoot, 'shotNum, lookNum', shotNum, lookNum, newUser);
+        // if ((newUser.roleId == 8 || newUser.roleId == 81) && !(look < lookNum)) {
+        //   return createMessage.error('可带看员工数不足');
+        // } else if ((newUser.roleId == 8 || newUser.roleId == 82) && !(shoot < shotNum)) {
+        //   return createMessage.error('可拍摄员工数不足');
+        // }
+        minNumber.lookNum = lookNum;
+        minNumber.shotNum = shotNum;
+        insertTableDataRecord({
+          nickName: newUser.memoName,
+          userName: newUser.phone,
+          phone: newUser.phone,
+          roleName: '公司员工',
+          roleId: newUser.roleId,
+        });
+
+        setFieldsValue({
+          addeduser: total || 0,
+        });
+        createMessage.success(t('layout.setting.operatingTitle'));
+      }
+      return {
+        register,
+        handleDelete,
+        numOnChange,
+        numsOnChange,
+        modelRef,
+        schemas,
+        registerForm,
+        minNumber,
+        handleVisibleChange,
+        registerModal,
+        openTargetModal,
+
+        addopenModal,
+        saveTable,
+        closeModal,
+        addTabledata,
+        t,
+        registerSubtable,
+        reloadSubtable,
+        handleAddUser,
+        getTableList,
+      };
+    },
+  });
+</script>

+ 296 - 0
src/views/rightsEnterprises/camera.vue

@@ -0,0 +1,296 @@
+<template>
+  <div>
+    <BasicTable @register="registerTable">
+      <template #toolbar>
+        <!-- RoleEnum.COMPANY_ADMIN, -->
+        <a-button v-power="[RoleEnum.PLAT_ADMIN]" type="primary" @click="handleOpenModal">
+          新增</a-button
+        >
+      </template>
+      <template #status="{ record }">
+        {{ renderStatus(record.state) }}
+      </template>
+      <template #createTime="{ record }">
+        <Time v-show="record.createTime" :value="record.createTime" mode="datetime" />
+      </template>
+      <template #incrementEndTime="{ record }">
+        <span v-if="record.status" style="color: #ed6f6f">已过期</span>
+        <Time v-else :value="record.incrementEndTime" mode="datetime" />
+      </template>
+      <template #action="{ record }">
+        <TableAction
+          :actions="[
+            {
+              label: '授权',
+              ifShow: !record.snCode && !record.status,
+              color: 'success',
+              onClick: handleDelete.bind(null, record),
+            },
+            {
+              label: '解绑',
+              color: 'error',
+              ifShow: !!record.snCode,
+              onClick: handleUpBind.bind(null, record),
+            },
+          ]"
+        />
+      </template>
+    </BasicTable>
+    <addCameraModal @register="register" @update="reload" />
+    <BindModal @register="registerDelList" @update="reload" />
+  </div>
+</template>
+<script lang="ts">
+  import { defineComponent, computed, onMounted, ref, watch, reactive } from 'vue';
+  import { BasicTable, useTable, BasicColumn, FormProps, TableAction } from '/@/components/Table';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useModal } from '/@/components/Modal';
+  import { uploadApi } from '/@/api/sys/upload';
+  import BindModal from './cameraBind.vue';
+  import addCameraModal from './addCameraModal.vue';
+  import { cameraDetailList, unbindCamera } from '/@/api/rightsEnterprises/list';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  // import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard';
+  import dayjs from 'dayjs';
+  import { RoleEnum } from '/@/enums/roleEnum';
+  import { useGo } from '/@/hooks/web/usePage';
+  import { Time } from '/@/components/Time';
+  import { useUserStore } from '/@/store/modules/user';
+  export default defineComponent({
+    name: 'StaffList',
+    components: {
+      BasicTable,
+      TableAction,
+      Time,
+      BindModal,
+      addCameraModal,
+    },
+    props: {
+      companyInfo: {
+        type: Object,
+        default: function () {
+          return {};
+        },
+      },
+    },
+    setup(props) {
+      const [register, { openModal }] = useModal();
+      const surplusSubNum = ref({
+        lookNum: 0,
+        shotNum: 0,
+      });
+      const [registerDetail, { openModal: openDetaileModal }] = useModal();
+      const [registerDelList, { openModal: openDelListeModal }] = useModal();
+      const { createConfirm, createMessage } = useMessage();
+      const userStore = useUserStore();
+      const { getCheckRole } = userStore;
+      const userinfo = computed(() => userStore.getUserInfo);
+      const modelRef = reactive({
+        companyId: userinfo.value.companyId,
+        companyName: '',
+        companyPhone: '',
+      });
+      const go = useGo();
+      const { t } = useI18n();
+      watch(
+        () => props.companyInfo,
+        (newProps) => {
+          modelRef.companyId = newProps.companyId;
+          modelRef.companyName = newProps.companyName;
+          modelRef.companyPhone = newProps.companyPhone;
+          console.log('companyInfo', modelRef);
+          reload();
+        },
+        {
+          deep: true,
+        },
+      );
+      onMounted(() => {});
+
+      const columns: BasicColumn[] = [
+        {
+          title: '相机权益ID',
+          dataIndex: 'id',
+          fixed: 'left',
+          width: 100,
+        },
+        {
+          title: t('routes.rightsEnterprises.snCode'),
+          dataIndex: 'snCode',
+          width: 160,
+        },
+        {
+          title: t('routes.rightsEnterprises.cameraIncrementTypeName'),
+          dataIndex: 'cameraIncrementTypeName',
+          width: 160,
+        },
+        {
+          title: t('routes.rightsEnterprises.companyName'),
+          dataIndex: 'companyName',
+          width: 160,
+        },
+        {
+          title: t('routes.rightsEnterprises.companyPhone'),
+          dataIndex: 'companyPhone',
+          width: 160,
+        },
+        {
+          title: t('routes.rightsEnterprises.purchaseTime'),
+          dataIndex: 'createTime',
+          slots: { customRender: 'createTime' },
+          width: 160,
+        },
+        {
+          title: t('routes.rightsEnterprises.expirationTime'),
+          dataIndex: 'incrementEndTime',
+          slots: { customRender: 'incrementEndTime' },
+          width: 160,
+        },
+        {
+          title: '操作',
+          dataIndex: '',
+          ifShow: !getCheckRole('tourist'),
+          slots: { customRender: 'action' },
+          fixed: 'right',
+          width: 60,
+        },
+      ];
+
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 100,
+        schemas: [
+          // {
+          //   field: 'staffName',
+          //   label: t('routes.rightsEnterprises.companyName'),
+          //   component: 'Input',
+          //   componentProps: {
+          //     maxLength: 15,
+          //   },
+          //   colProps: {
+          //     span: 6,
+          //   },
+          // },
+          // {
+          //   field: 'staffPhone',
+          //   label: t('routes.corporation.enterpriseId'),
+          //   component: 'Input',
+          //   componentProps: {
+          //     maxLength: 15,
+          //   },
+          //   colProps: {
+          //     span: 6,
+          //   },
+          // },
+          {
+            field: 'snCode',
+            label: t('routes.rightsEnterprises.snCodeText'),
+            component: 'Input',
+            componentProps: {
+              maxLength: 15,
+            },
+            colProps: {
+              span: 6,
+            },
+          },
+        ],
+      };
+
+      const [registerTable, { reload }] = useTable({
+        title: t('routes.rightsEnterprises.cameraTitle'),
+        api: cameraDetailList,
+        columns: columns,
+        useSearchForm: true,
+        formConfig: searchForm,
+        showTableSetting: true,
+        tableSetting: { fullScreen: true },
+        showIndexColumn: true,
+        rowKey: 'id',
+        immediate: userinfo.value.companyId ? true : false,
+        pagination: { pageSize: 20 },
+        searchInfo: modelRef,
+        afterFetch: (T) => {
+          let newDate = dayjs();
+          return T.map((ele) => {
+            if (ele.incrementEndTime) {
+              ele.status = dayjs(ele.incrementEndTime).isAfter(newDate) ? 0 : 1;
+            }
+            console.log('newDate', ele);
+            return ele;
+          });
+        },
+        bordered: true,
+        sortFn: (sortInfo) => {
+          let order = sortInfo.order && sortInfo.order.replace('end', '');
+          return { ...sortInfo, sidx: sortInfo.field, order: order };
+        },
+      });
+
+      function renderStatus(type: number): string {
+        switch (type) {
+          // case 0:
+          //   return t('routes.rightsEnterprises.state.0');
+          // case 1:
+          //   return t('routes.rightsEnterprises.state.1');
+          case 2:
+            return t('routes.rightsEnterprises.state.2');
+          default:
+            return t('routes.rightsEnterprises.state.9');
+        }
+      }
+      function handleOpenModal() {
+        openModal(true, modelRef);
+      }
+      function handleCreate() {
+        // if (
+        //   getCheckRole([RoleEnum.COMPANY_ADMIN]) &&
+        //   surplusSubNum.value.lookNum == 0 &&
+        //   surplusSubNum.value.shotNum == 0
+        // ) {
+        //   return createMessage.error('新增失败,可添加员工数量为0个');
+        // }
+        openDetaileModal(true, {});
+      }
+      function handleEdit(record: Recordable) {
+        openDetaileModal(true, record);
+      }
+      async function handleDelete(record) {
+        return openDelListeModal(true, {
+          ...record,
+        });
+      }
+      function handleUpBind(record) {
+        createConfirm({
+          iconType: 'warning',
+          title: '温馨提醒',
+          content: `是否确定解绑相机?`,
+          onOk: async () => {
+            await unbindCamera({ id: record.id });
+            reload();
+          },
+        });
+      }
+      return {
+        registerTable,
+        registerDetail,
+        registerDelList,
+        openDelListeModal,
+        createMessage,
+        modelRef,
+        handleUpBind,
+        t,
+        reload,
+        go,
+        renderStatus,
+        handleCreate,
+        handleOpenModal,
+        register,
+        handleEdit,
+        handleDelete,
+        uploadApi: uploadApi as any,
+        RoleEnum,
+        surplusSubNum,
+        getCheckRole,
+      };
+    },
+  });
+</script>

+ 107 - 0
src/views/rightsEnterprises/cameraBind.vue

@@ -0,0 +1,107 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @cancel="resetFields"
+    @register="register"
+    title="授权相机"
+    @ok="handleOk"
+  >
+    <div class="pt-3px pr-3px">
+      <BasicForm @register="registerForm" />
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref } from 'vue';
+  import { bindCamera } from '/@/api/rightsEnterprises/list'; //roleLIstApi
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['update'],
+    setup(_, context) {
+      const { t } = useI18n();
+      const modelRef = ref({
+        isSee: false,
+      });
+      const schemas: FormSchema[] = [
+        {
+          field: 'snCode',
+          component: 'Input',
+          label: '相机SN码',
+          colProps: {
+            span: 18,
+          },
+          required: true,
+        },
+        {
+          field: 'id',
+          component: 'Input',
+          label: 'id',
+          show: false,
+        },
+      ];
+      const title = ref('绑 定');
+      const { createMessage } = useMessage();
+      const [registerForm, { setFieldsValue, validate, updateSchema, resetFields }] = useForm({
+        labelWidth: 120,
+        schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+
+      const [register, { closeModal }] = useModalInner((data) => {
+        data && onDataReceive(data);
+      });
+      function onDataReceive(data) {
+        // 方式1;
+        console.log('handleDelete', data);
+        modelRef.value.isSee = data.userId ? true : false;
+        setFieldsValue({
+          ...data,
+          userId: data.userId ? data.staffName : data.userId,
+        });
+        let setSchema = [
+          {
+            field: 'userId',
+            required: !data.userId,
+            slot: !!data.userId ? 'text' : false,
+          },
+        ];
+        updateSchema(setSchema);
+      }
+
+      async function handleOk() {
+        if (modelRef.value.isSee) {
+          return closeModal();
+        }
+        let data = await validate();
+        let res = await bindCamera({
+          snCode: data.snCode,
+          id: data.id,
+        });
+        context && context.emit('update', res);
+        createMessage.success(t('common.optSuccess'));
+        closeModal();
+        resetFields();
+      }
+
+      return {
+        register,
+        title,
+        schemas,
+        registerForm,
+        modelRef,
+        handleOk,
+        resetFields,
+      };
+    },
+  });
+</script>

+ 17 - 0
src/views/rightsEnterprises/cameraDetail.vue

@@ -0,0 +1,17 @@
+<template>
+  <div>
+    <camera />
+  </div>
+</template>
+<script lang="ts">
+  import { defineComponent } from 'vue';
+  import camera from './camera.vue';
+  export default defineComponent({
+    components: {
+      camera,
+    },
+    setup() {
+      return {};
+    },
+  });
+</script>

+ 291 - 0
src/views/rightsEnterprises/cameraList.vue

@@ -0,0 +1,291 @@
+<template>
+  <div>
+    <BasicTable @register="registerTable">
+      <template #toolbar>
+        <a-button
+          v-power="[RoleEnum.COMPANY_ADMIN, RoleEnum.PLAT_ADMIN]"
+          type="primary"
+          @click="handleCreate"
+          >新增</a-button
+        >
+      </template>
+      <template #headerTop v-if="getCheckRole([RoleEnum.COMPANY_ADMIN])">
+        <Alert
+          :message="`带看权益为 ${surplusSubNum.lookNum} 个、拍摄权益为 ${surplusSubNum.shotNum} 个`"
+          type="info"
+        />
+      </template>
+      <template #role="{ record }">
+        {{ renderRoleType(record.role) }}
+      </template>
+      <template #status="{ record }">
+        {{ renderStatus(record.status) }}
+      </template>
+      <template #createTime="{ record }">
+        <Time :value="record.createTime" mode="datetime" />
+      </template>
+      <template #action="{ record }">
+        <TableAction
+          :actions="[
+            {
+              label: '查看',
+              onClick: handleEdit.bind(null, record),
+            },
+            {
+              color: 'warning',
+              label: t('routes.rightsEnterprises.addText'),
+              onClick: handleOpenModal.bind(null, record),
+            },
+          ]"
+        />
+      </template>
+    </BasicTable>
+    <addModal @register="register" @update="reload" />
+    <ProductDrawer @register="registerDrawer" type="camera" @reload="reload" />
+    <addCameraModal @register="register" @update="reload" />
+  </div>
+</template>
+<script lang="ts">
+  import { defineComponent, computed, onMounted, ref } from 'vue';
+  import { BasicTable, useTable, BasicColumn, FormProps, TableAction } from '/@/components/Table';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useModal } from '/@/components/Modal';
+  import { uploadApi } from '/@/api/sys/upload';
+  import { Alert } from 'ant-design-vue';
+  import { cameraListApi, delApi, getNumByStaff } from '/@/api/rightsEnterprises/list';
+  import { useDrawer } from '/@/components/Drawer';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import ProductDrawer from './productDrawer.vue';
+  import { RoleEnum } from '/@/enums/roleEnum';
+  import { useGo } from '/@/hooks/web/usePage';
+  import addCameraModal from './addCameraModal.vue';
+  import addModal from './addModal.vue';
+  import { Time } from '/@/components/Time';
+  import { useUserStore } from '/@/store/modules/user';
+  import { useTabs } from '/@/hooks/web/useTabs';
+  import { useRouter } from 'vue-router';
+  export default defineComponent({
+    components: {
+      BasicTable,
+      TableAction,
+      Time,
+      Alert,
+      addModal,
+      ProductDrawer,
+      addCameraModal,
+    },
+    setup() {
+      const router = useRouter();
+      const [register, { openModal }] = useModal();
+      const [registerDrawer, { openDrawer }] = useDrawer();
+      const surplusSubNum = ref({
+        lookNum: 0,
+        shotNum: 0,
+      });
+      const { createConfirm, createMessage } = useMessage();
+      const userStore = useUserStore();
+      const { getCheckRole } = userStore;
+      const userinfo = computed(() => userStore.getUserInfo);
+      const companyId = ref(userinfo.value.companyId);
+      const go = useGo();
+      const { closeCurrent } = useTabs();
+      const { t } = useI18n();
+      console.log('companyId', companyId);
+      if (companyId.value) {
+        closeCurrent();
+        router.push(`detail/${companyId.value}`);
+      }
+      onMounted(() => {
+        getNumByStaffData();
+      });
+
+      const columns: BasicColumn[] = [
+        {
+          title: 'ID',
+          dataIndex: 'id',
+          fixed: 'left',
+          width: 60,
+        },
+        {
+          title: t('routes.rightsEnterprises.companyName'),
+          dataIndex: 'name',
+          width: 180,
+        },
+        {
+          title: t('routes.rightsEnterprises.companyPhone'),
+          dataIndex: 'phone',
+          width: 150,
+        },
+        {
+          title: t('routes.rightsEnterprises.kk'),
+          dataIndex: 'proIncrementNum',
+          width: 80,
+        },
+
+        {
+          title: t('routes.rightsEnterprises.kj'),
+          dataIndex: 'seeIncrementNum',
+          // sorter: true,
+          width: 80,
+        },
+        {
+          title: t('routes.rightsEnterprises.ss'),
+          dataIndex: 'sensorIncrementNum',
+          // slots: { customRender: 'createTime' },
+          width: 80,
+        },
+        {
+          title: '操作',
+          dataIndex: '',
+          ifShow: !getCheckRole('tourist'),
+          slots: { customRender: 'action' },
+          fixed: 'right',
+          width: 80,
+        },
+      ];
+
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 100,
+        schemas: [
+          {
+            field: 'companyName',
+            label: t('routes.rightsEnterprises.companyName'),
+            component: 'Input',
+            componentProps: {
+              maxLength: 15,
+            },
+            colProps: {
+              span: 8,
+            },
+          },
+          // {
+          //   field: 'companyPhone',
+          //   label: t('routes.rightsEnterprises.companyPhone'),
+          //   component: 'Input',
+          //   componentProps: {
+          //     maxLength: 15,
+          //   },
+          //   colProps: {
+          //     span: 8,
+          //   },
+          // },
+        ],
+      };
+
+      const [registerTable, { reload }] = useTable({
+        title: t('routes.rightsEnterprises.menuTableList'),
+        api: cameraListApi,
+        columns: columns,
+        useSearchForm: true,
+        formConfig: searchForm,
+        showTableSetting: true,
+        tableSetting: { fullScreen: true },
+        showIndexColumn: true,
+        // searchInfo:'',
+        rowKey: 'id',
+        pagination: { pageSize: 20 },
+        beforeFetch: (T) => {
+          return {
+            ...T,
+            limit: T.limit,
+            page: T.page,
+            startTime: T.fieldTime?.[0],
+            endTime: T.fieldTime?.[1],
+          };
+        },
+        bordered: true,
+        sortFn: (sortInfo) => {
+          let order = sortInfo.order && sortInfo.order.replace('end', '');
+          return { ...sortInfo, sidx: sortInfo.field, order: order };
+        },
+      });
+
+      function renderRoleType(type: number): string {
+        switch (type) {
+          case 0:
+            return t('routes.staff.roleType.0');
+          case 1:
+            return t('routes.staff.roleType.1');
+          default:
+            return '';
+        }
+      }
+      function renderStatus(type: number): string {
+        switch (type) {
+          case 1:
+            return t('common.normal');
+          case 0:
+            return t('common.unNormal');
+          default:
+            return '';
+        }
+      }
+      function handleOpenModal(record: Recordable) {
+        openModal(true, {
+          ...record,
+          modify: true,
+          companyId: record.id,
+          companyPhone: record.phone,
+          companyName: record.name,
+        });
+      }
+      function handleCreate() {
+        openModal(true, {
+          modify: true,
+        });
+      }
+      function getNumByStaffData() {
+        getNumByStaff({}).then((res) => {
+          surplusSubNum.value.lookNum = res.lookNum;
+          surplusSubNum.value.shotNum = res.shotNum;
+        });
+      }
+      function handleEdit(record) {
+        // router.push(`detail/${record.companyId}`);
+        openDrawer(true, {
+          record: {
+            ...record,
+            companyId: record.id,
+            companyName: record.name,
+            companyPhone: record.phone,
+            userPermNum:
+              record.proIncrementNum + record.seeIncrementNum + record.sensorIncrementNum,
+          },
+          isUpdate: true,
+        });
+      }
+      function handDelconfirm(record) {
+        createConfirm({
+          iconType: 'warning',
+          title: '警告',
+          content: `此操作将对${record.userName}进行删除, 是否继续?`,
+          onOk: async () => {
+            await delApi({ userId: record.id });
+            reload();
+          },
+        });
+      }
+      return {
+        registerTable,
+        createMessage,
+        handDelconfirm,
+        t,
+        reload,
+        openModal,
+        go,
+        renderRoleType,
+        renderStatus,
+        handleOpenModal,
+        handleCreate,
+        handleEdit,
+        register,
+        uploadApi: uploadApi as any,
+        RoleEnum,
+        surplusSubNum,
+        getCheckRole,
+        getNumByStaffData,
+        registerDrawer,
+      };
+    },
+  });
+</script>

+ 235 - 0
src/views/rightsEnterprises/enterprises.vue

@@ -0,0 +1,235 @@
+<template>
+  <div>
+    <BasicTable @register="registerTable">
+      <template #toolbar>
+        <a-button
+          v-power="[RoleEnum.COMPANY_ADMIN, RoleEnum.PLAT_ADMIN]"
+          type="primary"
+          @click="handleCreate"
+          >新增</a-button
+        >
+      </template>
+      <template #headerTop v-if="getCheckRole([RoleEnum.COMPANY_ADMIN])">
+        <Alert
+          :message="`带看权益为 ${surplusSubNum.lookNum} 个、拍摄权益为 ${surplusSubNum.shotNum} 个`"
+          type="info"
+        />
+      </template>
+      <template #role="{ record }">
+        {{ renderRoleType(record.role) }}
+      </template>
+      <template #status="{ record }">
+        {{ renderStatus(record.status) }}
+      </template>
+      <template #createTime="{ record }">
+        <Time :value="record.createTime" mode="datetime" />
+      </template>
+      <template #action="{ record }">
+        <TableAction
+          :actions="[
+            {
+              label: '查看',
+              onClick: handleEdit.bind(null, record),
+            },
+            {
+              color: 'warning',
+              label: t('routes.rightsEnterprises.add'),
+              onClick: handleOpenModal.bind(null, record),
+            },
+          ]"
+        />
+      </template>
+    </BasicTable>
+    <addModal @register="register" @update="reload" />
+  </div>
+</template>
+<script lang="ts">
+  import { defineComponent, computed, onMounted, ref } from 'vue';
+  import { BasicTable, useTable, BasicColumn, FormProps, TableAction } from '/@/components/Table';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useModal } from '/@/components/Modal';
+  import { uploadApi } from '/@/api/sys/upload';
+  import { Alert } from 'ant-design-vue';
+  import { ListApi, delApi, getNumByStaff } from '/@/api/rightsEnterprises/list';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { RoleEnum } from '/@/enums/roleEnum';
+  import { useGo } from '/@/hooks/web/usePage';
+  import addModal from './addModal.vue';
+  import { Time } from '/@/components/Time';
+  import { useUserStore } from '/@/store/modules/user';
+  export default defineComponent({
+    components: {
+      BasicTable,
+      TableAction,
+      Time,
+      Alert,
+      addModal,
+    },
+    setup() {
+      const [register, { openModal }] = useModal();
+      const surplusSubNum = ref({
+        lookNum: 0,
+        shotNum: 0,
+      });
+      const { createConfirm, createMessage } = useMessage();
+      const userStore = useUserStore();
+      const { getCheckRole } = userStore;
+      const roleList = computed(() => userStore.getRoleList);
+      console.log('getRoleList', roleList);
+      const go = useGo();
+      const { t } = useI18n();
+      onMounted(() => {
+        getNumByStaffData();
+      });
+
+      const columns: BasicColumn[] = [
+        {
+          title: 'ID',
+          dataIndex: 'companyId',
+          fixed: 'left',
+          width: 60,
+        },
+        {
+          title: t('routes.staff.deptName'),
+          dataIndex: 'companyName',
+          width: 160,
+        },
+        {
+          title: t('routes.rightsEnterprises.companyPhone'),
+          dataIndex: 'companyPhone',
+          width: 80,
+        },
+        {
+          title: t('routes.rightsEnterprises.userPermNum'),
+          dataIndex: 'userPermNum',
+          width: 130,
+        },
+
+        {
+          title: t('routes.rightsEnterprises.exUserPermNum'),
+          dataIndex: 'exUserPermNum',
+          sorter: true,
+          width: 130,
+        },
+        {
+          title: t('routes.staff.createTime'),
+          dataIndex: 'createTime',
+          // slots: { customRender: 'createTime' },
+          width: 130,
+        },
+        {
+          title: '操作',
+          dataIndex: '',
+          ifShow: !getCheckRole('tourist'),
+          slots: { customRender: 'action' },
+          fixed: 'right',
+          width: 120,
+        },
+      ];
+
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 100,
+        schemas: [
+          {
+            field: 'fieldTime',
+            component: 'RangePicker',
+            label: t('routes.rightsEnterprises.timeField'),
+            colProps: {
+              span: 8,
+            },
+          },
+        ],
+      };
+
+      const [registerTable, { reload }] = useTable({
+        title: t('routes.rightsEnterprises.menuList'),
+        api: ListApi,
+        columns: columns,
+        useSearchForm: true,
+        formConfig: searchForm,
+        showTableSetting: true,
+        tableSetting: { fullScreen: true },
+        showIndexColumn: true,
+        rowKey: 'id',
+        pagination: { pageSize: 20 },
+        beforeFetch: (T) => {
+          return {
+            limit: T.limit,
+            page: T.page,
+            startTime: T.fieldTime?.[0],
+            endTime: T.fieldTime?.[1],
+          };
+        },
+        bordered: true,
+        sortFn: (sortInfo) => {
+          let order = sortInfo.order && sortInfo.order.replace('end', '');
+          return { ...sortInfo, sidx: sortInfo.field, order: order };
+        },
+      });
+
+      function renderRoleType(type: number): string {
+        switch (type) {
+          case 0:
+            return t('routes.staff.roleType.0');
+          case 1:
+            return t('routes.staff.roleType.1');
+          default:
+            return '';
+        }
+      }
+      function renderStatus(type: number): string {
+        switch (type) {
+          case 1:
+            return t('common.normal');
+          case 0:
+            return t('common.unNormal');
+          default:
+            return '';
+        }
+      }
+      function handleOpenModal(record: Recordable) {
+        console.log('Received', record);
+        openModal(true, record);
+      }
+      function getNumByStaffData() {
+        getNumByStaff({}).then((res) => {
+          surplusSubNum.value.lookNum = res.lookNum;
+          surplusSubNum.value.shotNum = res.shotNum;
+        });
+      }
+      function handleEdit(record) {
+        console.log('record', record);
+      }
+      function handDelconfirm(record) {
+        createConfirm({
+          iconType: 'warning',
+          title: '警告',
+          content: `此操作将对${record.userName}进行删除, 是否继续?`,
+          onOk: async () => {
+            await delApi({ userId: record.id });
+            reload();
+          },
+        });
+      }
+      return {
+        registerTable,
+        createMessage,
+        handDelconfirm,
+        t,
+        reload,
+        openModal,
+        go,
+        renderRoleType,
+        renderStatus,
+        handleOpenModal,
+        handleEdit,
+        register,
+        uploadApi: uploadApi as any,
+        RoleEnum,
+        surplusSubNum,
+        getCheckRole,
+        getNumByStaffData,
+      };
+    },
+  });
+</script>

+ 316 - 0
src/views/rightsEnterprises/list.vue

@@ -0,0 +1,316 @@
+<template>
+  <div>
+    <BasicTable @register="registerTable" :searchInfo="modelRef">
+      <template #toolbar>
+        <a-button v-power="[RoleEnum.PLAT_ADMIN]" type="primary" @click="handleOpenModal">
+          新增</a-button
+        >
+      </template>
+      <template #status="{ record }">
+        {{ renderStatus(record.state) }}
+      </template>
+      <template #createTime="{ record, field }">
+        <Time :value="record[field]" mode="datetime" />
+      </template>
+      <!-- onClick: handleOpenModal.bind(null, record), -->
+      <template #action="{ record }">
+        <TableAction
+          :actions="[
+            {
+              label: '查看',
+              ifShow: !!record.userId,
+              onClick: handleDelete.bind(null, record),
+            },
+            {
+              label: '绑定',
+              color: 'success',
+              ifShow: (record.state == 0 || record.state == 1) && !record.userId,
+              onClick: handleDelete.bind(null, record),
+            },
+            {
+              label: '解绑',
+              ifShow:
+                getCheckRole([RoleEnum.PLAT_ADMIN]) &&
+                (record.state == 0 || record.state == 1) &&
+                !!record.userId &&
+                dayjs(record.activationTime).isAfter(dayjs()),
+              color: 'error',
+              onClick: handleUpBind.bind(null, record),
+            },
+          ]"
+        />
+      </template>
+    </BasicTable>
+    <addModal @register="register" @update="reload" />
+    <BindModal @register="registerDelList" @update="reload" />
+  </div>
+</template>
+<script lang="ts">
+  import { defineComponent, computed, onMounted, ref, watch, reactive } from 'vue';
+  import { BasicTable, useTable, BasicColumn, FormProps, TableAction } from '/@/components/Table';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useModal } from '/@/components/Modal';
+  import { uploadApi } from '/@/api/sys/upload';
+  import BindModal from './BindModal.vue';
+  import addModal from './addModal.vue';
+  import { staffList, unbindRights } from '/@/api/rightsEnterprises/list';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  // import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard';
+  import dayjs from 'dayjs';
+  import { RoleEnum } from '/@/enums/roleEnum';
+  import { useGo } from '/@/hooks/web/usePage';
+  import { Time } from '/@/components/Time';
+  import { useUserStore } from '/@/store/modules/user';
+  export default defineComponent({
+    name: 'StaffList',
+    components: {
+      BasicTable,
+      TableAction,
+      Time,
+      BindModal,
+      addModal,
+      // DelListModal,
+    },
+    props: {
+      companyInfo: {
+        type: Object,
+        default: function () {
+          return {};
+        },
+      },
+    },
+    setup(props) {
+      const [register, { openModal }] = useModal();
+      const surplusSubNum = ref({
+        lookNum: 0,
+        shotNum: 0,
+      });
+      const [registerDetail, { openModal: openDetaileModal }] = useModal();
+      const [registerDelList, { openModal: openDelListeModal }] = useModal();
+      const { createConfirm, createMessage } = useMessage();
+      const userStore = useUserStore();
+      const { getCheckRole } = userStore;
+      const userinfo = computed(() => userStore.getUserInfo);
+      // const {companyInfo} = toRefs(props)
+      const modelRef = reactive({
+        companyId: userinfo.value.companyId,
+        companyName: userinfo.value.companyName,
+        companyPhone: userinfo.value.phone,
+      });
+      const go = useGo();
+      const { t } = useI18n();
+      watch(
+        () => props.companyInfo,
+        (newProps) => {
+          modelRef.companyId = newProps.companyId;
+          modelRef.companyName = newProps.companyName;
+          modelRef.companyPhone = newProps.companyPhone;
+          reload();
+        },
+        {
+          deep: true,
+        },
+      );
+      onMounted(() => {
+        getNumByStaffData();
+      });
+
+      const columns: BasicColumn[] = [
+        {
+          title: 'ID',
+          dataIndex: 'id',
+          fixed: 'left',
+          ifShow: false,
+          width: 0,
+        },
+        {
+          title: t('routes.rightsEnterprises.permName'),
+          dataIndex: 'permName',
+          width: 160,
+        },
+        {
+          title: t('routes.staff.userName'),
+          dataIndex: 'staffName',
+          width: 80,
+        },
+        {
+          title: '手机',
+          dataIndex: 'staffPhone',
+          width: 160,
+        },
+
+        {
+          title: t('common.roleName'),
+          dataIndex: 'staffRoleName',
+          // slots: { customRender: 'role' },
+          sorter: true,
+          width: 80,
+        },
+        {
+          title: t('routes.rightsEnterprises.createTime'),
+          dataIndex: 'createTime',
+          // slots: { customRender: 'createTime' },
+          width: 160,
+        },
+        {
+          title: t('routes.rightsEnterprises.activationTime'),
+          dataIndex: 'activationTime',
+          // slots: { customRender: 'createTime' },
+          width: 160,
+        },
+        {
+          title: t('routes.rightsEnterprises.expirationTime'),
+          dataIndex: 'expirationTime',
+          // slots: { customRender: 'createTime' },
+          width: 160,
+        },
+        {
+          title: t('common.state'),
+          dataIndex: 'status',
+          slots: { customRender: 'status' },
+          width: 80,
+        },
+        {
+          title: '操作',
+          dataIndex: '',
+          ifShow: !getCheckRole('tourist'),
+          slots: { customRender: 'action' },
+          fixed: 'right',
+          width: 100,
+        },
+      ];
+
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 100,
+        schemas: [
+          {
+            field: 'staffName',
+            label: t('routes.rightsEnterprises.staffName'),
+            component: 'Input',
+            componentProps: {
+              maxLength: 15,
+            },
+            colProps: {
+              span: 8,
+            },
+          },
+          {
+            field: 'staffPhone',
+            label: t('routes.corporation.phone'),
+            component: 'Input',
+            componentProps: {
+              maxLength: 15,
+            },
+            colProps: {
+              span: 8,
+            },
+          },
+        ],
+      };
+
+      const [registerTable, { reload }] = useTable({
+        title: t('routes.rightsEnterprises.staffList'),
+        api: staffList,
+        columns: columns,
+        useSearchForm: true,
+        formConfig: searchForm,
+        showTableSetting: true,
+        tableSetting: { fullScreen: true },
+        showIndexColumn: true,
+        rowKey: 'id',
+        immediate: userinfo.value.companyId ? true : false,
+        pagination: { pageSize: 20 },
+        searchInfo: modelRef,
+        afterFetch: (T) => {
+          getNumByStaffData();
+          return T;
+        },
+        bordered: true,
+        sortFn: (sortInfo) => {
+          let order = sortInfo.order && sortInfo.order.replace('end', '');
+          return { ...sortInfo, sidx: sortInfo.field, order: order };
+        },
+      });
+
+      function renderStatus(type: number): string {
+        switch (type) {
+          // case 0:
+          //   return t('routes.rightsEnterprises.state.0');
+          // case 1:
+          //   return t('routes.rightsEnterprises.state.1');
+          case 2:
+            return t('routes.rightsEnterprises.state.2');
+          default:
+            return t('routes.rightsEnterprises.state.9');
+        }
+      }
+      function handleOpenModal(record: Recordable) {
+        console.log('userinfo', userinfo);
+        openModal(true, {
+          ...record,
+          ...modelRef,
+        });
+      }
+      function handleCreate() {
+        // if (
+        //   getCheckRole([RoleEnum.COMPANY_ADMIN]) &&
+        //   surplusSubNum.value.lookNum == 0 &&
+        //   surplusSubNum.value.shotNum == 0
+        // ) {
+        //   return createMessage.error('新增失败,可添加员工数量为0个');
+        // }
+        openDetaileModal(true, {});
+      }
+      function handleEdit(record: Recordable) {
+        openDetaileModal(true, record);
+      }
+      function getNumByStaffData() {
+        // getNumByStaff({}).then((res) => {
+        //   surplusSubNum.value.lookNum = res.lookNum;
+        //   surplusSubNum.value.shotNum = res.shotNum;
+        // });
+      }
+      async function handleDelete(record) {
+        return openDelListeModal(true, {
+          ...record,
+          ...modelRef,
+        });
+      }
+      function handleUpBind(record) {
+        createConfirm({
+          iconType: 'warning',
+          title: '解绑权益',
+          content: `解绑权益后,公司员工的权益时间将缩减,是否继续解绑?`,
+          onOk: async () => {
+            await unbindRights({ id: record.id });
+            reload();
+          },
+        });
+      }
+      return {
+        registerTable,
+        registerDetail,
+        registerDelList,
+        openDelListeModal,
+        createMessage,
+        modelRef,
+        handleUpBind,
+        t,
+        reload,
+        go,
+        renderStatus,
+        handleCreate,
+        handleOpenModal,
+        register,
+        handleEdit,
+        handleDelete,
+        uploadApi: uploadApi as any,
+        RoleEnum,
+        surplusSubNum,
+        getCheckRole,
+        getNumByStaffData,
+        dayjs,
+      };
+    },
+  });
+</script>

+ 88 - 0
src/views/rightsEnterprises/productDrawer.vue

@@ -0,0 +1,88 @@
+<template>
+  <BasicDrawer
+    v-bind="$attrs"
+    @register="registerDrawer"
+    :isDetail="true"
+    :showDetailBack="false"
+    :showFooter="false"
+    @ok="handleSubmit"
+  >
+    <list v-if="typeIf == 'rights'" :companyInfo="modelRef" />
+    <camera v-else :companyInfo="modelRef" />
+  </BasicDrawer>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, toRefs, reactive } from 'vue';
+  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
+  import camera from './camera.vue';
+  import list from './list.vue';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  // import { useUserStore } from '/@/store/modules/user';
+
+  export default defineComponent({
+    name: 'ProductDrawer',
+    components: { BasicDrawer, camera, list },
+    props: {
+      type: {
+        type: String,
+        default: 'rights',
+      },
+    },
+    emits: ['reload', 'register'],
+    setup(props) {
+      const isUpdate = ref(true);
+      const modelRef = reactive({
+        companyId: 0,
+        companyName: '0',
+        companyPhone: '0',
+        userPermNum: 0,
+      });
+      // const userStore = useUserStore();
+      // const userinfo = computed(() => userStore.getUserInfo); computed
+      const { t } = useI18n();
+      // const {type} = toRefs(props)
+      const [registerDrawer, { setDrawerProps }] = useDrawerInner(async (data) => {
+        setDrawerProps({ confirmLoading: false });
+        isUpdate.value = !!data?.isUpdate;
+        modelRef.companyId = data?.record?.companyId;
+        modelRef.companyName = data?.record?.companyName;
+        modelRef.companyPhone = data?.record?.companyPhone;
+        modelRef.userPermNum = data?.record?.userPermNum;
+        console.log('handleSubmit', t, modelRef, data);
+      });
+      function handleSubmit() {
+        // console.log('handleSubmit')
+      }
+      return {
+        modelRef,
+        typeIf: toRefs(props).type,
+        registerDrawer,
+        handleSubmit,
+      };
+    },
+  });
+</script>
+
+<style scoped lang="less">
+  :deep(.detailed) {
+    .title {
+      display: flex;
+      span,
+      input,
+      div {
+        flex-grow: 1;
+      }
+      input {
+        display: inline-block;
+      }
+      .name {
+        flex-grow: 2;
+      }
+    }
+    tr {
+      th {
+        font-weight: 500;
+      }
+    }
+  }
+</style>

+ 17 - 0
src/views/rightsEnterprises/rightsDetail.vue

@@ -0,0 +1,17 @@
+<template>
+  <div>
+    <list />
+  </div>
+</template>
+<script lang="ts">
+  import { defineComponent } from 'vue';
+  import list from './list.vue';
+  export default defineComponent({
+    components: {
+      list,
+    },
+    setup() {
+      return {};
+    },
+  });
+</script>

+ 265 - 0
src/views/rightsEnterprises/rightsList.vue

@@ -0,0 +1,265 @@
+<template>
+  <div>
+    <BasicTable @register="registerTable">
+      <template #toolbar>
+        <!-- <a-button
+          v-power="[RoleEnum.COMPANY_ADMIN, RoleEnum.PLAT_ADMIN]"
+          type="primary"
+          @click="handleCreate"
+          >新增</a-button
+        > -->
+      </template>
+      <template #headerTop v-if="getCheckRole([RoleEnum.COMPANY_ADMIN])">
+        <Alert
+          :message="`带看权益为 ${surplusSubNum.lookNum} 个、拍摄权益为 ${surplusSubNum.shotNum} 个`"
+          type="info"
+        />
+      </template>
+      <template #role="{ record }">
+        {{ renderRoleType(record.role) }}
+      </template>
+      <template #status="{ record }">
+        {{ renderStatus(record.status) }}
+      </template>
+      <template #createTime="{ record }">
+        <Time :value="record.createTime" mode="datetime" />
+      </template>
+      <template #action="{ record }">
+        <TableAction
+          :actions="[
+            {
+              label: '查看',
+              onClick: handleEdit.bind(null, record),
+            },
+            {
+              color: 'success',
+              label: t('routes.rightsEnterprises.add'),
+              onClick: handleOpenModal.bind(null, record),
+            },
+          ]"
+        />
+      </template>
+    </BasicTable>
+    <addModal @register="register" @update="reload" />
+    <ProductDrawer @register="registerDrawer" type="rights" @reload="reload" />
+  </div>
+</template>
+<script lang="ts">
+  import { defineComponent, computed, onMounted, ref } from 'vue';
+  import { BasicTable, useTable, BasicColumn, FormProps, TableAction } from '/@/components/Table';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useModal } from '/@/components/Modal';
+  import { uploadApi } from '/@/api/sys/upload';
+  import { Alert } from 'ant-design-vue';
+  import { ListApi, delApi, getNumByStaff } from '/@/api/rightsEnterprises/list';
+  import { useDrawer } from '/@/components/Drawer';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import ProductDrawer from './productDrawer.vue';
+  import { RoleEnum } from '/@/enums/roleEnum';
+  import { useGo } from '/@/hooks/web/usePage';
+  import addModal from './addModal.vue';
+  import { Time } from '/@/components/Time';
+  import { useUserStore } from '/@/store/modules/user';
+  import { useTabs } from '/@/hooks/web/useTabs';
+  import { useRouter } from 'vue-router';
+  export default defineComponent({
+    components: {
+      BasicTable,
+      TableAction,
+      Time,
+      Alert,
+      addModal,
+      ProductDrawer,
+    },
+    setup() {
+      const router = useRouter();
+      const [register, { openModal }] = useModal();
+      const [registerDrawer, { openDrawer }] = useDrawer();
+      const surplusSubNum = ref({
+        lookNum: 0,
+        shotNum: 0,
+      });
+      const { createConfirm, createMessage } = useMessage();
+      const { closeCurrent } = useTabs();
+      const userStore = useUserStore();
+      const { getCheckRole } = userStore;
+      const userinfo = computed(() => userStore.getUserInfo);
+      const companyId = ref(userinfo.value.companyId);
+      const go = useGo();
+      const { t } = useI18n();
+      console.log('companyId', companyId);
+      if (companyId.value) {
+        closeCurrent();
+        router.replace(`detail/${companyId.value}`);
+      }
+      onMounted(() => {
+        getNumByStaffData();
+      });
+
+      const columns: BasicColumn[] = [
+        {
+          title: 'ID',
+          dataIndex: 'companyId',
+          ifShow: false,
+          fixed: 'left',
+          width: 60,
+        },
+        {
+          title: t('routes.rightsEnterprises.companyName'),
+          dataIndex: 'companyName',
+          width: 160,
+        },
+        {
+          title: t('routes.rightsEnterprises.companyPhone'),
+          dataIndex: 'companyPhone',
+          width: 120,
+        },
+        {
+          title: t('routes.rightsEnterprises.userPermNum'),
+          dataIndex: 'userPermNum',
+          width: 130,
+        },
+
+        {
+          title: t('routes.rightsEnterprises.exUserPermNum'),
+          dataIndex: 'exUserPermNum',
+          // sorter: true,
+          width: 120,
+        },
+        // {
+        //   title: t('routes.staff.createTime'),
+        //   dataIndex: 'createTime',
+        //   // slots: { customRender: 'createTime' },
+        //   width: 130,
+        // },
+        {
+          title: '操作',
+          dataIndex: '',
+          ifShow: !getCheckRole('tourist'),
+          slots: { customRender: 'action' },
+          fixed: 'right',
+          width: 80,
+        },
+      ];
+
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 100,
+        schemas: [
+          {
+            field: 'fieldTime',
+            component: 'RangePicker',
+            label: t('routes.rightsEnterprises.timeField'),
+            ifShow: !getCheckRole('plat_admin'),
+            colProps: {
+              span: 8,
+            },
+          },
+          {
+            field: 'companyName',
+            component: 'Input',
+            label: t('routes.rightsEnterprises.companyName'),
+            colProps: {
+              span: 8,
+            },
+          },
+        ],
+      };
+      const [registerTable, { reload }] = useTable({
+        title: t('routes.rightsEnterprises.menuList'),
+        api: ListApi,
+        columns: columns,
+        useSearchForm: true,
+        formConfig: searchForm,
+        showTableSetting: true,
+        tableSetting: { fullScreen: true },
+        showIndexColumn: true,
+        pagination: { pageSize: 20 },
+        rowKey: 'companyId',
+        fetchSetting: {
+          pageField: 'page',
+          sizeField: 'limit',
+          listField: 'list',
+          totalField: 'totalCount',
+        },
+        beforeFetch: (T) => {
+          return {
+            ...T,
+            limit: T.limit,
+            page: T.page,
+            startTime: T.fieldTime?.[0],
+            endTime: T.fieldTime?.[1],
+          };
+        },
+      });
+
+      function renderRoleType(type: number): string {
+        switch (type) {
+          case 0:
+            return t('routes.staff.roleType.0');
+          case 1:
+            return t('routes.staff.roleType.1');
+          default:
+            return '';
+        }
+      }
+      function renderStatus(type: number): string {
+        switch (type) {
+          case 1:
+            return t('common.normal');
+          case 0:
+            return t('common.unNormal');
+          default:
+            return '';
+        }
+      }
+      function handleOpenModal(record: Recordable) {
+        console.log('Received', record);
+        openModal(true, record);
+      }
+      function getNumByStaffData() {
+        getNumByStaff({}).then((res) => {
+          surplusSubNum.value.lookNum = res.lookNum;
+          surplusSubNum.value.shotNum = res.shotNum;
+        });
+      }
+      function handleEdit(record) {
+        // router.push(`detail/${record.companyId}`);
+        openDrawer(true, {
+          record,
+          isUpdate: true,
+        });
+      }
+      function handDelconfirm(record) {
+        createConfirm({
+          iconType: 'warning',
+          title: '警告',
+          content: `此操作将对${record.userName}进行删除, 是否继续?`,
+          onOk: async () => {
+            await delApi({ userId: record.id });
+            reload();
+          },
+        });
+      }
+      return {
+        registerTable,
+        createMessage,
+        handDelconfirm,
+        t,
+        reload,
+        openModal,
+        go,
+        renderRoleType,
+        renderStatus,
+        handleOpenModal,
+        handleEdit,
+        register,
+        uploadApi: uploadApi as any,
+        RoleEnum,
+        surplusSubNum,
+        getCheckRole,
+        getNumByStaffData,
+        registerDrawer,
+      };
+    },
+  });
+</script>

+ 287 - 0
src/views/rightsEnterprises/staff.vue

@@ -0,0 +1,287 @@
+<template>
+  <div>
+    <BasicTable @register="registerTable">
+      <template #toolbar>
+        <a-button
+          v-power="[RoleEnum.COMPANY_ADMIN, RoleEnum.PLAT_ADMIN]"
+          type="primary"
+          @click="handleOpenModal"
+          >新增</a-button
+        >
+      </template>
+      <template #status="{ record }">
+        {{ renderStatus(record.state) }}
+      </template>
+      <template #createTime="{ record, field }">
+        <Time :value="record[field]" mode="datetime" />
+      </template>
+      <!-- onClick: handleOpenModal.bind(null, record), -->
+      <template #action="{ record }">
+        <TableAction
+          :actions="[
+            {
+              label: '查看',
+              ifShow: !!record.userId,
+              onClick: handleDelete.bind(null, record),
+            },
+            {
+              label: '绑定',
+              color: 'success',
+              ifShow: record.state == 0 && !record.userId,
+              onClick: handleDelete.bind(null, record),
+            },
+            {
+              label: '解绑',
+              ifShow: record.state == 0 && !!record.userId,
+              color: 'error',
+              onClick: handleUpBind.bind(null, record),
+            },
+          ]"
+        />
+      </template>
+    </BasicTable>
+    <addModal @register="register" @update="reload" />
+    <BindModal @register="registerDelList" @update="reload" />
+  </div>
+</template>
+<script lang="ts">
+  import { defineComponent, computed, onMounted, ref } from 'vue';
+  import { BasicTable, useTable, BasicColumn, FormProps, TableAction } from '/@/components/Table';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useModal } from '/@/components/Modal';
+  import { uploadApi } from '/@/api/sys/upload';
+  import BindModal from './BindModal.vue';
+  import addModal from './addModal.vue';
+  import { staffList, unbindRights } from '/@/api/rightsEnterprises/list';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  // import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard';
+  import { RoleEnum } from '/@/enums/roleEnum';
+  import { useGo } from '/@/hooks/web/usePage';
+  import { Time } from '/@/components/Time';
+  import { useUserStore } from '/@/store/modules/user';
+  export default defineComponent({
+    components: {
+      BasicTable,
+      TableAction,
+      Time,
+      BindModal,
+      addModal,
+      // DelListModal,
+    },
+    setup() {
+      const [register, { openModal }] = useModal();
+      const surplusSubNum = ref({
+        lookNum: 0,
+        shotNum: 0,
+      });
+      const [registerDetail, { openModal: openDetaileModal }] = useModal();
+      const [registerDelList, { openModal: openDelListeModal }] = useModal();
+      const { createConfirm, createMessage } = useMessage();
+      const userStore = useUserStore();
+      const { getCheckRole } = userStore;
+      const userinfo = computed(() => userStore.getUserInfo);
+      const { companyId } = userinfo.value;
+      const roleList = computed(() => userStore.getRoleList);
+      console.log('getRoleList', roleList, companyId);
+      const go = useGo();
+      const { t } = useI18n();
+      onMounted(() => {
+        getNumByStaffData();
+      });
+
+      const columns: BasicColumn[] = [
+        {
+          title: 'ID',
+          dataIndex: 'id',
+          fixed: 'left',
+          ifShow: false,
+          width: 0,
+        },
+        {
+          title: t('routes.rightsEnterprises.permName'),
+          dataIndex: 'permName',
+          width: 160,
+        },
+        {
+          title: t('routes.staff.userName'),
+          dataIndex: 'staffName',
+          width: 80,
+        },
+        {
+          title: '手机',
+          dataIndex: 'staffPhone',
+          width: 160,
+        },
+
+        {
+          title: t('common.roleName'),
+          dataIndex: 'staffRoleName',
+          // slots: { customRender: 'role' },
+          sorter: true,
+          width: 80,
+        },
+        {
+          title: t('routes.rightsEnterprises.createTime'),
+          dataIndex: 'createTime',
+          // slots: { customRender: 'createTime' },
+          width: 160,
+        },
+        {
+          title: t('routes.rightsEnterprises.activationTime'),
+          dataIndex: 'activationTime',
+          // slots: { customRender: 'createTime' },
+          width: 160,
+        },
+        {
+          title: t('routes.rightsEnterprises.expirationTime'),
+          dataIndex: 'expirationTime',
+          // slots: { customRender: 'createTime' },
+          width: 160,
+        },
+        {
+          title: t('common.state'),
+          dataIndex: 'status',
+          slots: { customRender: 'status' },
+          width: 80,
+        },
+        {
+          title: '操作',
+          dataIndex: '',
+          ifShow: !getCheckRole('tourist'),
+          slots: { customRender: 'action' },
+          fixed: 'right',
+          width: 100,
+        },
+      ];
+
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 100,
+        schemas: [
+          {
+            field: 'staffName',
+            label: t('routes.rightsEnterprises.staffName'),
+            component: 'Input',
+            componentProps: {
+              maxLength: 15,
+            },
+            colProps: {
+              xl: 5,
+              xxl: 5,
+            },
+          },
+          {
+            field: 'staffPhone',
+            label: t('routes.corporation.phone'),
+            component: 'Input',
+            componentProps: {
+              maxLength: 15,
+            },
+            colProps: {
+              xl: 5,
+              xxl: 5,
+            },
+          },
+        ],
+      };
+
+      const [registerTable, { reload }] = useTable({
+        title: t('routes.rightsEnterprises.staffList'),
+        api: staffList,
+        columns: columns,
+        useSearchForm: true,
+        formConfig: searchForm,
+        showTableSetting: true,
+        tableSetting: { fullScreen: true },
+        showIndexColumn: true,
+        rowKey: 'id',
+        pagination: { pageSize: 20 },
+        searchInfo: {
+          companyId,
+        },
+        afterFetch: (T) => {
+          getNumByStaffData();
+          return T;
+        },
+        bordered: true,
+        sortFn: (sortInfo) => {
+          let order = sortInfo.order && sortInfo.order.replace('end', '');
+          return { ...sortInfo, sidx: sortInfo.field, order: order };
+        },
+      });
+
+      function renderStatus(type: number): string {
+        console.log('renderStatus', type);
+        switch (type) {
+          // case 0:
+          //   return t('routes.rightsEnterprises.state.0');
+          // case 1:
+          //   return t('routes.rightsEnterprises.state.1');
+          case 2:
+            return t('routes.rightsEnterprises.state.2');
+          default:
+            return t('routes.rightsEnterprises.state.9');
+        }
+      }
+      function handleOpenModal(record: Recordable) {
+        openModal(true, record);
+      }
+      function handleCreate() {
+        // if (
+        //   getCheckRole([RoleEnum.COMPANY_ADMIN]) &&
+        //   surplusSubNum.value.lookNum == 0 &&
+        //   surplusSubNum.value.shotNum == 0
+        // ) {
+        //   return createMessage.error('新增失败,可添加员工数量为0个');
+        // }
+        openDetaileModal(true, {});
+      }
+      function handleEdit(record: Recordable) {
+        openDetaileModal(true, record);
+      }
+      function getNumByStaffData() {
+        // getNumByStaff({}).then((res) => {
+        //   surplusSubNum.value.lookNum = res.lookNum;
+        //   surplusSubNum.value.shotNum = res.shotNum;
+        // });
+      }
+      async function handleDelete(record) {
+        return openDelListeModal(true, {
+          ...record,
+        });
+      }
+      function handleUpBind(record) {
+        createConfirm({
+          iconType: 'warning',
+          title: '解绑权益',
+          content: `解绑权益后,公司员工的权益时间将缩减,是否继续解绑?`,
+          onOk: async () => {
+            await unbindRights({ id: record.id });
+            reload();
+          },
+        });
+      }
+      return {
+        registerTable,
+        registerDetail,
+        registerDelList,
+        openDelListeModal,
+        createMessage,
+        handleUpBind,
+        t,
+        reload,
+        go,
+        renderStatus,
+        handleCreate,
+        handleOpenModal,
+        register,
+        handleEdit,
+        handleDelete,
+        uploadApi: uploadApi as any,
+        RoleEnum,
+        surplusSubNum,
+        getCheckRole,
+        getNumByStaffData,
+      };
+    },
+  });
+</script>

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

@@ -19,31 +19,37 @@
       </template>
       <template #action="{ record }">
         <TableAction
-          :actions="[
-            {
-              // icon: 'mdi:briefcase-download',
-              label: t('routes.scenes.downloadScene'),
-              popConfirm: {
-                title: t('routes.scenes.downloadSceneConfirm'),
-                confirm: handleDownloadScene.bind(null, record),
-              },
-            },
-            {
-              color: 'error',
-              label: t('routes.scenes.editor'),
-              onClick: openSceneEditor.bind(null, record),
-            },
-            {
-              label: '编辑场景',
-              onClick: openSceneEditorModal.bind(null, record),
-            },
-            {
-              color: 'error',
-              label: t('routes.scenes.makeLiveCover'),
-              ifShow: record.lived !== true,
-              onClick: generateDefaultLiveRoom.bind(null, record),
-            },
-          ]"
+          :actions="
+            record.payStatus == 1
+              ? [
+                  {
+                    // icon: 'mdi:briefcase-download',
+                    label: t('routes.scenes.downloadScene'),
+                    popConfirm: {
+                      title: t('routes.scenes.downloadSceneConfirm'),
+                      confirm: handleDownloadScene.bind(null, record),
+                    },
+                  },
+                  {
+                    color: 'error',
+                    label: t('routes.scenes.editor'),
+                    onClick: openSceneEditor.bind(null, record),
+                  },
+                  {
+                    label: '编辑场景',
+                    onClick: openSceneEditorModal.bind(null, record),
+                  },
+                  {
+                    color: 'error',
+                    label: t('routes.scenes.makeLiveCover'),
+                    ifShow:
+                      (record.lived !== true && getEquity([1, 2])) ||
+                      (record.lived !== true && getCheckRole(['super', 'plat_admin'])),
+                    onClick: generateDefaultLiveRoom.bind(null, record),
+                  },
+                ]
+              : []
+          "
         />
       </template>
     </BasicTable>
@@ -92,7 +98,7 @@
       const [registerEditorModal, { openModal: openEditorModal }] = useModal();
       const { t } = useI18n();
       const userStore = useUserStore();
-      const { getCheckRole } = userStore;
+      const { getCheckRole, getEquity } = userStore;
       const columns: BasicColumn[] = [
         {
           title: 'ID',
@@ -151,6 +157,16 @@
           },
         },
         {
+          title: t('routes.scenes.status'),
+          dataIndex: 'payStatus',
+          width: 180,
+          customRender: ({ record }) => {
+            const enable = record.payStatus == 1;
+            const text = enable ? t('routes.scenes.statusText.1') : t('routes.scenes.statusText.0');
+            return text;
+          },
+        },
+        {
           title: t('routes.scenes.num'),
           dataIndex: 'num',
           width: 180,
@@ -168,7 +184,8 @@
           title: t('common.operation'),
           dataIndex: '',
           slots: { customRender: 'action' },
-          ifShow: !getCheckRole('tourist'),
+          ifShow:
+            (!getCheckRole('tourist') && getEquity(1)) || getCheckRole(['super', 'plat_admin']),
           width: 330,
           fixed: 'right',
         },
@@ -304,6 +321,8 @@
         registerDownloadModal,
         generateDefaultLiveRoom,
         openSceneEditorModal,
+        getEquity,
+        getCheckRole,
       };
     },
   });

+ 22 - 6
src/views/scenes/live.vue

@@ -4,7 +4,10 @@
       <template #toolbar>
         <a-button
           type="primary"
-          v-show="!getCheckRole(['host', 'tourist', 'company_viewer'])"
+          v-show="
+            getCheckRole(['super', 'plat_admin']) ||
+            (!getCheckRole(['host', 'tourist', 'company_viewer']) && getEquity([1, 2]))
+          "
           @click="handleAddLiveScene"
         >
           新增</a-button
@@ -54,7 +57,7 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
+  import { defineComponent, computed } from 'vue';
   import {
     BasicTable,
     useTable,
@@ -81,12 +84,12 @@
     setup() {
       const { createMessage } = useMessage();
       const userStore = useUserStore();
-      const { getCheckRole } = userStore;
+      const { getCheckRole, getEquity } = userStore;
       const { t } = useI18n();
       const [registerBindModal, { openModal: openBindModal }] = useModal();
 
       const [registerLiveDrawer, { openDrawer: openLiveDrawer }] = useDrawer();
-
+      const permList = computed(() => userStore.getPermList);
       const columns: BasicColumn[] = [
         {
           title: 'ID',
@@ -138,6 +141,16 @@
         },
 
         {
+          title: t('routes.scenes.status'),
+          dataIndex: 'payStatus',
+          width: 180,
+          customRender: ({ record }) => {
+            const enable = record.payStatus == 1;
+            const text = enable ? t('routes.scenes.statusText.1') : t('routes.scenes.statusText.0');
+            return text;
+          },
+        },
+        {
           title: t('routes.scenes.livestreamStatus'),
           dataIndex: 'livestreamStatus',
           width: 180,
@@ -153,7 +166,9 @@
           title: t('common.operation'),
           dataIndex: '',
           slots: { customRender: 'action' },
-          ifShow: !getCheckRole(['host', 'tourist']),
+          ifShow:
+            (!getCheckRole(['host', 'tourist']) && getEquity(2)) ||
+            getCheckRole(['super', 'plat_admin']),
           width: 220,
           fixed: 'right',
         },
@@ -298,13 +313,14 @@
         t,
         registerBindModal,
         handleBindAnchor,
-
+        permList,
         reload,
         registerLiveDrawer,
         handleAddLiveScene,
         handleDeleteLiveScene,
         handleEditLiveScene,
         getCheckRole,
+        getEquity,
       };
     },
   });

+ 1 - 0
src/views/scenes/liveDrawer.vue

@@ -167,6 +167,7 @@
           componentProps: {
             accept: ['jpg', 'jpeg', 'gif', 'png'],
             maxSize: 5,
+            maxNumber: 1,
             api: uploadLiveApi,
             onChange: async () => {
               await validateFields(['appListPicUrl']);

+ 78 - 0
src/views/staff/clean.vue

@@ -0,0 +1,78 @@
+<template>
+  <div class="p-4">
+    <BasicForm @register="register" @submit="handleSubmit" />
+  </div>
+</template>
+<script lang="ts">
+  import { defineComponent } from 'vue';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { clean } from '/@/api/staff/list';
+  // import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard';
+  export default defineComponent({
+    components: {
+      BasicForm,
+    },
+    setup() {
+      const { t } = useI18n();
+      const { createMessage } = useMessage();
+      const schemas: FormSchema[] = [
+        {
+          field: 'userName',
+          component: 'Input',
+          label: '手机号',
+          colProps: {
+            span: 8,
+          },
+          componentProps: {
+            // type:"number"
+          },
+          rules: [
+            {
+              required: true,
+              // @ts-ignore
+              validator: async (rule, value) => {
+                var reg_tel =
+                  /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/;
+                // var reg = /\S+@\S+\.\S+/;
+                if (!value) {
+                  /* eslint-disable-next-line */
+
+                  return Promise.reject(t('common.phone'));
+                }
+                if (!reg_tel.test(value)) {
+                  /* eslint-disable-next-line */
+                  return Promise.reject(t('common.phoneError'));
+                }
+                return Promise.resolve();
+              },
+              trigger: 'change',
+            },
+          ],
+        },
+      ];
+      const [register, { setProps, validate, resetFields }] = useForm({
+        labelWidth: 120,
+        schemas,
+        actionColOptions: {
+          span: 4,
+        },
+        submitButtonOptions: {
+          text: '清除状态',
+        },
+      });
+      async function handleSubmit() {
+        let data = await validate();
+        await clean({ userName: data.userName }); //
+        createMessage.success(t('common.optSuccess'));
+        setTimeout(() => resetFields(), 500);
+      }
+      return {
+        handleSubmit,
+        setProps,
+        register,
+      };
+    },
+  });
+</script>

+ 1 - 1
src/views/staff/delListModal.vue

@@ -9,7 +9,7 @@
     <div class="pt-3px pr-3px">
       <BasicForm @register="registerForm">
         <template #tips>
-          <div>请将当前员工的直播间数据进行迁移后,再删除员工</div>
+          <div>请将员工的数据迁移后,再删除员工(删除员工后,权益将进行解绑)</div>
         </template>
       </BasicForm>
     </div>

+ 87 - 6
src/views/staff/detailsModal.vue

@@ -7,13 +7,14 @@
     @ok="handleOk"
   >
     <div class="pt-3px pr-3px">
-      <BasicForm @register="registerForm" :model="model" />
+      <BasicForm @register="registerForm" :model="modelRef" />
     </div>
   </BasicModal>
 </template>
 <script lang="ts">
-  import { defineComponent, ref } from 'vue';
+  import { defineComponent, ref, computed } from 'vue';
   import { checkUserApi, saveApi, updateApi, getRoleListByParam } from '/@/api/staff/list'; //roleLIstApi
+  import { getAllList } from '/@/api/rightsEnterprises/list';
   import { BasicModal, useModalInner } from '/@/components/Modal';
   import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
   import { ListAllCompanyApi } from '/@/api/corporation/list';
@@ -31,6 +32,21 @@
       const modelRef = ref({});
       const userStore = useUserStore();
       const { getCheckRole } = userStore;
+      const userinfo = computed(() => userStore.getUserInfo);
+      const { companyId } = userinfo.value;
+      console.log('companyId', companyId);
+      const permListOptions = computed(() => {
+        return [
+          {
+            label: '带看',
+            value: '1',
+          },
+          {
+            label: '拍摄',
+            value: '2',
+          },
+        ];
+      });
       const schemas: FormSchema[] = [
         {
           field: 'phone',
@@ -126,6 +142,7 @@
               limit: 1000,
             },
             required: true,
+            onChange: companyIdChange,
           },
         },
         {
@@ -150,6 +167,37 @@
             ],
           },
         },
+        {
+          field: 'permList',
+          component: 'ApiSelect',
+          label: '权益',
+          colProps: {
+            span: 22,
+          },
+          componentProps: {
+            api: async function (params) {
+              const res = await getAllList(params);
+              console.log('params', params, res);
+              // const treeData = makeTree(res);
+              return res.map((i) => {
+                return {
+                  ...i,
+                  permName: i.permName + '  ' + i.createTime,
+                };
+              });
+            },
+            labelField: 'permName',
+            valueField: 'id',
+            immediate: true,
+            mode: 'multiple',
+            params: {
+              page: 1,
+              limit: 100,
+              // companyId:
+            },
+            required: true,
+          },
+        },
         // {
         //   field: 'status',
         //   label: '状态',
@@ -199,7 +247,7 @@
             field: 'roleId',
             component: 'ApiSelect',
             componentProps: {
-              disabled: false,
+              disabled: data.roleId == 2 ? false : data.id ? true : false,
               api: getRoleListByParam,
               labelField: 'roleName',
               valueField: 'roleId',
@@ -212,7 +260,7 @@
           {
             field: 'phone',
             componentProps: {
-              disabled: data.id ? true : false,
+              disabled: getCheckRole('plat_admin') ? false : data.id ? true : false,
             },
           },
           {
@@ -221,11 +269,35 @@
               disabled: data.id ? (data.roleId != 2 ? true : false) : false,
             },
           },
+          {
+            field: 'permList',
+            componentProps: {
+              disabled: data.roleId == 2 ? false : data.id ? true : false,
+              params: {
+                companyId: data.companyId || companyId,
+              },
+            },
+          },
         ];
         title.value = data.id ? '编辑' : '新增';
         updateSchema(setSchema);
       }
-
+      function companyIdChange(companyId) {
+        // resetFields(['permList'])
+        updateSchema([
+          {
+            field: 'permList',
+            componentProps: {
+              params: {
+                companyId: companyId,
+              },
+            },
+          },
+        ]);
+        setFieldsValue({
+          permList: [],
+        });
+      }
       async function handleOk() {
         let data = await validate();
         const requestApi = data.id ? updateApi : saveApi;
@@ -244,7 +316,16 @@
         resetFields();
       }
 
-      return { register, title, schemas, registerForm, model: modelRef, handleOk, resetFields };
+      return {
+        register,
+        title,
+        schemas,
+        registerForm,
+        modelRef,
+        handleOk,
+        resetFields,
+        permListOptions,
+      };
     },
   });
 </script>

+ 30 - 15
src/views/staff/list.vue

@@ -11,7 +11,7 @@
       </template>
       <template #headerTop v-if="getCheckRole([RoleEnum.COMPANY_ADMIN])">
         <Alert
-          :message="`可新增带看员工为 ${surplusSubNum.lookNum} 个、拍摄员工为 ${surplusSubNum.shotNum} 个`"
+          :message="`剩余带看权益为 ${surplusSubNum.lookNum} 个、拍摄权益为 ${surplusSubNum.shotNum} 个`"
           type="info"
         />
       </template>
@@ -136,13 +136,16 @@
           sorter: true,
           width: 80,
         },
-        // {
-        //   title: t('common.state'),
-        //   dataIndex: 'status',
-        //   slots: { customRender: 'status' },
-        //   // sorter: true,
-        //   width: 80,
-        // },
+        {
+          title: t('routes.staff.permList'),
+          dataIndex: 'permList',
+          // slots: { customRender: 'status' },
+          // sorter: true,
+          width: 80,
+          customRender: ({ record }) => {
+            return record.permList && record.permList.join();
+          },
+        },
 
         {
           title: t('routes.staff.createTime'),
@@ -165,6 +168,18 @@
         schemas: [
           {
             field: 'staffName',
+            label: t('routes.staff.userName'),
+            component: 'Input',
+            componentProps: {
+              maxLength: 15,
+            },
+            colProps: {
+              xl: 5,
+              xxl: 5,
+            },
+          },
+          {
+            field: 'staffPhone',
             label: t('routes.corporation.phone'),
             component: 'Input',
             componentProps: {
@@ -224,13 +239,13 @@
         openModal(true, record);
       }
       function handleCreate() {
-        if (
-          getCheckRole([RoleEnum.COMPANY_ADMIN]) &&
-          surplusSubNum.value.lookNum == 0 &&
-          surplusSubNum.value.shotNum == 0
-        ) {
-          return createMessage.error('新增失败,可添加员工数量为0个');
-        }
+        // if (
+        //   getCheckRole([RoleEnum.COMPANY_ADMIN]) &&
+        //   surplusSubNum.value.lookNum == 0 &&
+        //   surplusSubNum.value.shotNum == 0
+        // ) {
+        //   return createMessage.error('新增失败,可添加员工数量为0个');
+        // }
         openDetaileModal(true, {});
       }
       function handleEdit(record: Recordable) {

+ 1 - 0
types/store.d.ts

@@ -53,6 +53,7 @@ export interface UserInfo {
   nickName: string;
   phone: string;
   roleIdList: number[];
+  permList: number[];
   roleList: string;
   roleName: string;
   state: string;