zhengyiming
2025-11-12 f1ff27e72013b5c89de241d4d3ab11244aa91e15
fix: 四流
21个文件已修改
4个文件已添加
2211 ■■■■■ 已修改文件
src/constants/app.ts 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constants/enum.ts 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constants/regExp.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/hooks/useUser.ts 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.ts 244 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/BaseModuleNew.ts 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/ElectronSign.ts 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/EnterpriseApplyFile.ts 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/ParkBountyApply.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/UserRole.ts 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/typings.d.ts 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/EnterpriseInfo/EnterpriseInfo.vue 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/MaterialReview/MaterialReReviewList.vue 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/MaterialReview/MaterialReview.vue 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Permission/ExternalAccountManage.vue 223 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Permission/RoleManage.vue 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Permission/components/AddOrEditExternalAccountDialog.vue 210 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Permission/components/ResetPasswordDialog.vue 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Permission/components/dialogAuthorize.vue 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Permission/components/dialogMember.vue 286 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Reward/FinancialApproval.vue 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Reward/RewardApplyTradeCheck.vue 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Reward/RewardGrant.vue 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Reward/WithdrawalApproval.vue 74 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/StatisticalReport/RewardStatistics.vue 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constants/app.ts
@@ -1 +1,7 @@
import { EnumMenuScene } from './module';
export const AppType = import.meta.env.VITE_AppType || 'one';
export const AppLocalConfig = {
  menuScene: EnumMenuScene.Goverment,
};
src/constants/enum.ts
@@ -51,3 +51,50 @@
};
export const TempFolderPath = 'https://parkmanagement.oss-cn-hangzhou.aliyuncs.com/12333/temp';
export enum DepartmentType {
  /**
   * 市场部
   */
  Market = 1,
  /**
   * 销售部
   */
  Sale,
  /**
   * 客户部
   */
  Customer,
  /**
   * 招商部
   */
  Merchants,
}
export const DepartmentTypeText = {
  [DepartmentType.Market]: '市场部',
  [DepartmentType.Sale]: '销售部',
  [DepartmentType.Customer]: '客户部',
  [DepartmentType.Merchants]: '招商部',
};
export enum ExternalSystem {
  /**
   * 四流政务端
   */
  Goverend = 'goverend-admin-app-client',
  /**
   * 江佑共保运营端
   */
  JYB = 'jyb-admin-app-client',
  /**
   * 灵工系统运营端
   */
  flexjob = 'flexjob-admin-app-client',
}
export const ExternalSystemText = {
  [ExternalSystem.Goverend]: '四流政务端',
  [ExternalSystem.JYB]: '江佑共保运营端',
  [ExternalSystem.flexjob]: '灵工系统运营端',
};
src/constants/regExp.ts
@@ -9,4 +9,7 @@
  static PasswordRegexNoSymbol =
    // eslint-disable-next-line no-useless-escape
    /^(?![\d]+$)(?![a-z]+$)(?![A-Z]+$)[a-zA-Z\d]{6,16}$/;
  static PasswordRegexOnlyLetterNumber =
    // eslint-disable-next-line no-useless-escape
    /^[a-zA-Z0-9]+$/;
}
src/hooks/useUser.ts
@@ -1,9 +1,10 @@
import { useUserStore } from '@/store/modules/user';
import { UserUtils } from '@bole-core/core';
// import * as userRoleServices from '@/services/api/UserRole';
import * as userRoleServices from '@/services/api/UserRole';
import * as userServices from '@/services/api/User';
import { useQuery, useQueryClient } from '@tanstack/vue-query';
import { formatRoleName } from '@/utils';
import { EnumMenuScene } from '@/constants';
export function useIsSystemAdmin() {
  const userStore = useUserStore();
@@ -23,14 +24,18 @@
  };
}
export function useAllRoleList() {
  const { data: allRoleList, refetch } = useQuery({
    queryKey: ['userServices/getAllRoles'],
type UseAllRoleListOptions = {
  menuScene?: EnumMenuScene;
};
export function useAllRoleList(options: UseAllRoleListOptions = {}) {
  const { menuScene = EnumMenuScene.Goverment } = options;
  const { data: allRoleList } = useQuery({
    queryKey: ['userRoleServices/getRoles', menuScene],
    queryFn: async () => {
      let res = await userServices.getAllRoles({ showLoading: false });
      return res;
      let res = await userRoleServices.getRoles({ menuScene }, { showLoading: false });
      return res.data;
    },
    placeholderData: () => [] as API.RoleInfo[],
    select(data) {
      return data.map((x) => ({
        ...x,
@@ -40,8 +45,12 @@
    },
  });
  const enableRoleList = computed(() => {
    return allRoleList.value.filter((x) => x.isEnable);
  });
  return {
    allRoleList,
    refetch,
    enableRoleList,
  };
}
src/router/index.ts
@@ -94,46 +94,6 @@
      rootMenu: true,
    },
  },
  {
    path: '/EnterpriseInfo',
    redirect: 'noRedirect',
    component: Layout,
    hidden: false,
    alwaysShow: true,
    meta: {
      rank: 10010,
      title: '企业信息',
      rootMenu: true,
      icon: 'home',
    },
    children: [
      {
        path: '/EnterpriseInfoList',
        name: 'EnterpriseInfoList',
        hidden: false,
        alwaysShow: true,
        component: () => import('@/views/EnterpriseInfo/EnterpriseInfo.vue'),
        meta: {
          rank: 10011,
          title: '企业信息',
          // rootMenu: true,
          icon: 'home',
        },
      },
      {
        path: '/EnterpriseInfoDetail/:id',
        name: 'EnterpriseInfoDetail',
        hidden: true,
        component: () => import('@/views/EnterpriseInfo/EnterpriseInfoDetail.vue'),
        meta: {
          rank: 10012,
          title: '企业信息详情',
          // rootMenu: true,
          icon: 'home',
        },
      },
    ],
  },
  // {
  //   path: '/MaterialReview',
  //   redirect: 'noRedirect',
@@ -210,123 +170,95 @@
  //   ],
  // },
  {
    path: '/Reward',
    redirect: 'noRedirect',
    component: Layout,
    hidden: false,
    alwaysShow: true,
    meta: {
      rank: 10030,
      title: '平台奖励',
      rootMenu: true,
      icon: 'home',
    },
    children: [
      {
        path: '/RewardGrant',
        name: 'RewardGrant',
        hidden: false,
        alwaysShow: true,
        component: () => import('@/views/Reward/RewardGrant.vue'),
        meta: {
          rank: 10031,
          title: '奖励发放登记',
  // {
  //   path: '/Reward',
  //   redirect: 'noRedirect',
  //   component: Layout,
  //   hidden: false,
  //   alwaysShow: true,
  //   meta: {
  //     rank: 10030,
  //     title: '平台奖励',
          // rootMenu: true,
          icon: 'home',
        },
      },
      {
        path: '/RewardDeclareDetail/:id',
        name: 'RewardDeclareDetail',
        hidden: true,
        component: () => import('@/views/Reward/RewardDeclareDetail.vue'),
        meta: {
          rank: 10032,
          title: '申报详情',
          rootMenu: false,
        },
      },
      {
        path: '/RewardGrantRegister/:id',
        name: 'RewardGrantRegister',
        hidden: true,
        component: () => import('@/views/Reward/RewardGrantRegister.vue'),
        meta: {
          rank: 10033,
          title: '奖励金登记',
          rootMenu: false,
        },
      },
      {
        path: '/WithdrawalApproval',
        name: 'WithdrawalApproval',
        hidden: false,
        alwaysShow: true,
        component: () => import('@/views/Reward/WithdrawalApproval.vue'),
        meta: {
          rank: 10040,
          title: '提现审批',
          // rootMenu: true,
          icon: 'home',
        },
      },
      {
        path: '/RewardApplyTradeCheck',
        name: 'RewardApplyTradeCheck',
        hidden: false,
        alwaysShow: true,
        component: () => import('@/views/Reward/RewardApplyTradeCheck.vue'),
        meta: {
          rank: 10050,
          title: '出账审批',
          // rootMenu: true,
          icon: 'home',
        },
      },
      {
        path: '/FinancialApproval',
        name: 'FinancialApproval',
        hidden: false,
        alwaysShow: true,
        component: () => import('@/views/Reward/FinancialApproval.vue'),
        meta: {
          rank: 10060,
          title: '财务审批',
          // rootMenu: true,
          icon: 'home',
        },
      },
    ],
  },
  {
    path: '/StatisticalReport',
    redirect: 'noRedirect',
    component: Layout,
    hidden: false,
    alwaysShow: true,
    meta: {
      rank: 10040,
      title: '统计报表',
      rootMenu: true,
      icon: 'home',
    },
    children: [
      {
        path: '/RewardStatistics',
        name: 'RewardStatistics',
        hidden: false,
        alwaysShow: true,
        component: () => import('@/views/StatisticalReport/RewardStatistics.vue'),
        meta: {
          rank: 10041,
          title: '奖励金统计',
          // rootMenu: true,
          icon: 'home',
        },
      },
    ],
  },
  //     icon: 'home',
  //   },
  //   children: [
  //     {
  //       path: '/RewardGrant',
  //       name: 'RewardGrant',
  //       hidden: false,
  //       alwaysShow: true,
  //       component: () => import('@/views/Reward/RewardGrant.vue'),
  //       meta: {
  //         rank: 10031,
  //         title: '奖励发放登记',
  //         // rootMenu: true,
  //         icon: 'home',
  //       },
  //     },
  //     {
  //       path: '/RewardDeclareDetail/:id',
  //       name: 'RewardDeclareDetail',
  //       hidden: true,
  //       component: () => import('@/views/Reward/RewardDeclareDetail.vue'),
  //       meta: {
  //         rank: 10032,
  //         title: '申报详情',
  //         rootMenu: false,
  //       },
  //     },
  //     {
  //       path: '/RewardGrantRegister/:id',
  //       name: 'RewardGrantRegister',
  //       hidden: true,
  //       component: () => import('@/views/Reward/RewardGrantRegister.vue'),
  //       meta: {
  //         rank: 10033,
  //         title: '奖励金登记',
  //         rootMenu: false,
  //       },
  //     },
  //     {
  //       path: '/WithdrawalApproval',
  //       name: 'WithdrawalApproval',
  //       hidden: false,
  //       alwaysShow: true,
  //       component: () => import('@/views/Reward/WithdrawalApproval.vue'),
  //       meta: {
  //         rank: 10040,
  //         title: '提现审批',
  //         // rootMenu: true,
  //         icon: 'home',
  //       },
  //     },
  //     {
  //       path: '/RewardApplyTradeCheck',
  //       name: 'RewardApplyTradeCheck',
  //       hidden: false,
  //       alwaysShow: true,
  //       component: () => import('@/views/Reward/RewardApplyTradeCheck.vue'),
  //       meta: {
  //         rank: 10050,
  //         title: '出账审批',
  //         // rootMenu: true,
  //         icon: 'home',
  //       },
  //     },
  //     {
  //       path: '/FinancialApproval',
  //       name: 'FinancialApproval',
  //       hidden: false,
  //       alwaysShow: true,
  //       component: () => import('@/views/Reward/FinancialApproval.vue'),
  //       meta: {
  //         rank: 10060,
  //         title: '财务审批',
  //         // rootMenu: true,
  //         icon: 'home',
  //       },
  //     },
  //   ],
  // },
  // {
  //   path: '/Syatem',
  //   redirect: 'noRedirect',
src/services/api/BaseModuleNew.ts
@@ -2,6 +2,18 @@
// @ts-ignore
import { request } from '@/utils/request';
/** 此处后端没有提供注释 POST /api/BaseModuleNew/AddOrEditModuleV2 */
export async function addOrEditModuleV2(body: API.ModuleDtoV2, options?: API.RequestConfig) {
  return request<string>('/api/BaseModuleNew/AddOrEditModuleV2', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 查询所有模块 GET /api/BaseModuleNew/GetAllModuleList */
export async function getAllModuleList(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
@@ -17,6 +29,21 @@
  });
}
/** 此处后端没有提供注释 GET /api/BaseModuleNew/GetCurrentUserModuleListV2 */
export async function getCurrentUserModuleListV2(
  body: API.ModuleDtoV2,
  options?: API.RequestConfig
) {
  return request<number>('/api/BaseModuleNew/GetCurrentUserModuleListV2', {
    method: 'GET',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 此处后端没有提供注释 GET /api/BaseModuleNew/GetUserOrRoleModuleList */
export async function getUserOrRoleModuleList(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
src/services/api/ElectronSign.ts
@@ -44,6 +44,21 @@
  });
}
/** 批量更新客户合同参数状态 POST /api/ElectronSign/BatchUpdateCustomContractParamterStatus */
export async function batchUpdateCustomContractParamterStatus(
  body: API.BatchUpdateCustomContractParamterStatusInput,
  options?: API.RequestConfig
) {
  return request<number>('/api/ElectronSign/BatchUpdateCustomContractParamterStatus', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 创建或更新模板 POST /api/ElectronSign/CreateOrUpdateContractTemplate */
export async function createOrUpdateContractTemplate(
  body: API.CreateOrUpdateContractTemplateInput,
@@ -175,6 +190,42 @@
  });
}
/** 获取客户合同参数列表 POST /api/ElectronSign/GetCustomContractParamterList */
export async function getCustomContractParamterList(
  body: API.GetCustomContractParamterListInput,
  options?: API.RequestConfig
) {
  return request<API.GetCustomContractParamterListItemPageOutput>(
    '/api/ElectronSign/GetCustomContractParamterList',
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      data: body,
      ...(options || {}),
    }
  );
}
/** 获取客户合同参数选择器 GET /api/ElectronSign/GetCustomContractParamterSelect */
export async function getCustomContractParamterSelect(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
  params: API.APIgetCustomContractParamterSelectParams,
  options?: API.RequestConfig
) {
  return request<API.GetCustomContractParamterListItem[]>(
    '/api/ElectronSign/GetCustomContractParamterSelect',
    {
      method: 'GET',
      params: {
        ...params,
      },
      ...(options || {}),
    }
  );
}
/** 获取客户列表 POST /api/ElectronSign/GetCustomerList */
export async function getCustomerList(body: API.GetCustomerInput, options?: API.RequestConfig) {
  return request<API.GetCustomerDtoPageOutput>('/api/ElectronSign/GetCustomerList', {
@@ -280,6 +331,21 @@
  });
}
/** 保存客户合同参数 POST /api/ElectronSign/SaveCustomContractParamter */
export async function saveCustomContractParamter(
  body: API.SaveCustomContractTemplateParamterInput,
  options?: API.RequestConfig
) {
  return request<string>('/api/ElectronSign/SaveCustomContractParamter', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 发起签约 POST /api/ElectronSign/SendContract */
export async function sendContract(body: API.SendContractInput, options?: API.RequestConfig) {
  return request<API.SendContractOutput>('/api/ElectronSign/SendContract', {
src/services/api/EnterpriseApplyFile.ts
@@ -32,6 +32,21 @@
  });
}
/** 确认提交材料上传V2 POST /api/EnterpriseApplyFile/CustomerUploadMonthApplyFileV2 */
export async function customerUploadMonthApplyFileV2(
  body: API.CustomerUploadMonthApplyFileInput,
  options?: API.RequestConfig
) {
  return request<number>('/api/EnterpriseApplyFile/CustomerUploadMonthApplyFileV2', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 删除客户四流材料 POST /api/EnterpriseApplyFile/DeleteEnterpriseApplyUploadFile */
export async function deleteEnterpriseApplyUploadFile(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
@@ -116,6 +131,24 @@
  );
}
/** 获取月份上传文件详情V2 POST /api/EnterpriseApplyFile/GetCustomerUploadApplyFilesV2 */
export async function getCustomerUploadApplyFilesV2(
  body: API.GetCustomerUploadApplyFilesInput,
  options?: API.RequestConfig
) {
  return request<API.GetCustomerUploadApplyFilesResponse>(
    '/api/EnterpriseApplyFile/GetCustomerUploadApplyFilesV2',
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      data: body,
      ...(options || {}),
    }
  );
}
/** 根据月份查询是否存在提交记录 POST /api/EnterpriseApplyFile/GetCustomerUploadFileRecord */
export async function getCustomerUploadFileRecord(
  body: API.GetCustomerUploadFileRecordInput,
@@ -134,6 +167,24 @@
  );
}
/** 根据月份查询是否存在提交记录V2 POST /api/EnterpriseApplyFile/GetCustomerUploadFileRecordV2 */
export async function getCustomerUploadFileRecordV2(
  body: API.GetCustomerUploadFileRecordInput,
  options?: API.RequestConfig
) {
  return request<API.GetCustomerUploadFileRecordOutput>(
    '/api/EnterpriseApplyFile/GetCustomerUploadFileRecordV2',
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      data: body,
      ...(options || {}),
    }
  );
}
/** 按月份查询企业上传材料列表 POST /api/EnterpriseApplyFile/GetEnterpriseApplyUploadFile */
export async function getEnterpriseApplyUploadFile(
  body: API.PageInput,
src/services/api/ParkBountyApply.ts
@@ -790,6 +790,21 @@
  );
}
/** 导出园区客户管理列表 POST /api/ParkBountyApply/GetParkCustomerManagePageNewExport */
export async function getParkCustomerManagePageNewExport(
  body: API.QueryParkCustomerManageInput,
  options?: API.RequestConfig
) {
  return request<any>('/api/ParkBountyApply/GetParkCustomerManagePageNewExport', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 查询奖励金统计报表 POST /api/ParkBountyApply/GetRewardStatistics */
export async function getRewardStatistics(
  body: API.GetRewardStatisticsInput,
src/services/api/UserRole.ts
@@ -32,6 +32,21 @@
  });
}
/** 创建政务端管理子账户 POST /api/UserRole/CreateGovermentSubAccounts */
export async function createGovermentSubAccounts(
  body: API.CreateGovermentSubAccounts,
  options?: API.RequestConfig
) {
  return request<string>('/api/UserRole/CreateGovermentSubAccounts', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 新增角色 POST /api/UserRole/CreateRole */
export async function createRole(body: API.CreateBaseRoleInput, options?: API.RequestConfig) {
  return request<string>('/api/UserRole/CreateRole', {
@@ -104,6 +119,21 @@
  });
}
/** 政务端管理子账户列表 POST /api/UserRole/GetGovermentSubAccounts */
export async function getGovermentSubAccounts(
  body: API.GetBackClientUsersInput,
  options?: API.RequestConfig
) {
  return request<API.UserDtoPageOutput>('/api/UserRole/GetGovermentSubAccounts', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 角色列表 POST /api/UserRole/GetRoles */
export async function getRoles(body: API.GetRolesInput, options?: API.RequestConfig) {
  return request<API.RoleInfoPageOutput>('/api/UserRole/GetRoles', {
@@ -161,6 +191,21 @@
  });
}
/** 编辑政务端管理子账户 POST /api/UserRole/UpdateGovermentSubAccounts */
export async function updateGovermentSubAccounts(
  body: API.UpdateGovermentClientUserInput,
  options?: API.RequestConfig
) {
  return request<number>('/api/UserRole/UpdateGovermentSubAccounts', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 角色编辑 POST /api/UserRole/UpdateRole */
export async function updateRole(body: API.CreateOrUpdateRoleInput, options?: API.RequestConfig) {
  return request<number>('/api/UserRole/UpdateRole', {
src/services/api/typings.d.ts
@@ -1381,6 +1381,15 @@
    moduleId?: string;
  }
  interface APIgetCustomContractParamterSelectParams {
    /** 客户Id */
    customerId?: string;
    /** 是否默认 */
    isDefault?: boolean;
    /** 合同模板Id */
    templateId?: string;
  }
  interface APIgetCustomerFileTypeHeadParams {
    enterpriseId?: string;
  }
@@ -2869,6 +2878,14 @@
    status?: EnumElectronSignContractParameterStatus;
  }
  interface BatchUpdateCustomContractParamterStatusInput {
    /** 客户Id */
    customerId?: string;
    /** 参数Id */
    ids?: string[];
    status?: EnumElectronSignContractParameterStatus;
  }
  interface BestSignDownloadImageDataResponse {
    /** 图片文件流 */
    data?: any[];
@@ -4194,6 +4211,37 @@
    status?: CooperationApplyStatusEnum;
  }
  interface CreateGovermentSubAccounts {
    /** 名称 */
    name?: string;
    /** 用户名 */
    userName?: string;
    /** 备注 */
    remark?: string;
    /** 手机号 */
    phoneNumber?: string;
    /** 用户端Id */
    clientId?: string;
    /** 园区Ids */
    industrialParkIds?: string[];
    /** 角色 */
    roleNames?: string[];
    /** 是否理赔提醒 */
    sendClaimMessage?: boolean;
    /** 是否保单到期提醒 */
    sendBillExpireMessage?: boolean;
    /** 是否短信提醒 */
    isSendMessage?: boolean;
    /** 是否人员变更提醒 */
    staffChangeMessage?: boolean;
    /** 是否批改提醒 */
    batchUpdateMessage?: boolean;
    /** 密码 */
    password?: string;
    /** 主账号用户账号 */
    subAccountCreator?: string;
  }
  interface CreateGoverUserInput {
    /** 名称 */
    name?: string;
@@ -5046,6 +5094,8 @@
    isAutoSign?: boolean;
    /** 自动签授权书 */
    autoSignPowerAttorneyUrl?: string;
    /** 自定义内容 */
    customContents?: string[];
    /** 模板变量 */
    values: CreateOrUpdateContractTemplateValueInput[];
  }
@@ -5781,6 +5831,8 @@
    applyAmount?: number;
    fileTypes?: CustomerUploadMonthApplyFileType[];
    enterpriseId?: string;
    /** 是否是运营端代上传 */
    isAdminFileUpload?: boolean;
  }
  interface CustomerUploadMonthApplyFileType {
@@ -7283,6 +7335,17 @@
    data?: GetContractParamterListItem[];
  }
  interface GetContractTemplateCustomContentDto {
    /** 合同模板Id */
    templateId?: string;
    /** 变量名称 */
    label?: string;
    /** 变量代码 */
    name?: string;
    /** 值 */
    value?: string;
  }
  interface GetContractTemplateDto {
    /** Id */
    id?: string;
@@ -7299,6 +7362,8 @@
    isAutoSign?: boolean;
    /** 自动签授权书 */
    autoSignPowerAttorneyUrl?: string;
    /** 模板变量 */
    customContents?: GetContractTemplateCustomContentDto[];
    /** 模板变量 */
    values?: GetContractTemplateValueDto[];
  }
@@ -7381,6 +7446,33 @@
    startDate?: string;
    /** 截止日期 */
    endDate?: string;
  }
  interface GetCustomContractParamterListInput {
    pageModel?: Pagination;
    /** 客户Id */
    customerId?: string;
    /** 关键字 */
    keywords?: string;
    status?: EnumElectronSignContractParameterStatus;
  }
  interface GetCustomContractParamterListItem {
    /** 参数Id */
    id?: string;
    /** 变量名称 */
    label?: string;
    /** 变量代码 */
    name?: string;
    /** 是否默认 */
    isDefault?: boolean;
    status?: EnumElectronSignContractParameterStatus;
  }
  interface GetCustomContractParamterListItemPageOutput {
    pageModel?: Pagination;
    objectData?: any;
    data?: GetCustomContractParamterListItem[];
  }
  interface GetCustomerDto {
@@ -9580,6 +9672,7 @@
    bankBranchName?: string;
    /** 银行卡号 */
    bankCardNumber?: string;
    userCertificationStatus?: UserCertificationStatusEnum;
  }
  interface GetParkCustomerManageOutput {
@@ -15256,6 +15349,25 @@
    parentModuleName?: string;
  }
  interface ModuleDtoV2 {
    id?: string;
    description?: string;
    sortCode?: number;
    enabledMark?: number;
    parentId?: string;
    name?: string;
    isCache?: boolean;
    path?: string;
    viewAddress?: string;
    levelNum?: number;
    enCode?: string;
    menuSource?: EnumMenuScene;
    icon?: string;
    hasCheck?: boolean;
    isMenu?: number;
    parentModuleName?: string;
  }
  interface ModuleExtensionDto {
    entities?: Record<string, any>;
    configuration?: Record<string, any>;
@@ -20392,6 +20504,18 @@
    status?: EnumElectronSignContractParameterStatus;
  }
  interface SaveCustomContractTemplateParamterInput {
    /** 客户Id */
    customerId?: string;
    /** 参数Id */
    id?: string;
    /** 变量名称 */
    label?: string;
    /** 变量代码 */
    name?: string;
    status?: EnumElectronSignContractParameterStatus;
  }
  interface SaveCustomerTemplateParamInput {
    /** 模板id */
    lgGigWorkerCustomerTemplateId?: string;
src/views/EnterpriseInfo/EnterpriseInfo.vue
@@ -72,109 +72,19 @@
import _ from 'lodash';
import { ModelValueType } from 'element-plus';
import { EnterpriseTypeText } from '@/constants';
import { useAccess } from '@/hooks';
defineOptions({
  name: 'EnterpriseInfo',
});
const column: API.CustomModuleColumnDto[] = [
  {
    id: '1',
    enCode: 'enterpriseName',
    name: '企业名',
    width: 250,
  },
  {
    id: '2',
    enCode: 'societyCreditCode',
    name: '统一社会信用代码',
    width: 200,
  },
  {
    id: '3',
    enCode: 'enterpriseType',
    name: '企业类型',
    width: 150,
  },
  {
    id: '4',
    enCode: 'industrialParkName',
    name: '所属园区',
    width: 200,
  },
  {
    id: '5',
    enCode: 'parkTypName',
    name: '园区类型',
    width: 150,
  },
  {
    id: '6',
    enCode: 'applyCount',
    name: '申报次数',
    width: 150,
  },
  {
    id: '7',
    enCode: 'lastApplyTime',
    name: '最近申报日期',
    width: 180,
  },
  {
    id: '8',
    enCode: 'financeCount',
    name: '财政拨付次数',
    width: 150,
  },
  {
    id: '9',
    enCode: 'lastFinanceTime',
    name: '最近财政拨付日期',
    width: 180,
  },
  {
    id: '10',
    enCode: 'financeSumAmount',
    name: '财政拨付总额',
    width: 150,
  },
  {
    id: '11',
    enCode: 'settleCount',
    name: '平台拨付次数',
    width: 150,
  },
  {
    id: '12',
    enCode: 'lastSettleTime',
    name: '最近平台拨付日期',
    width: 180,
  },
  {
    id: '13',
    enCode: 'settleSumAmount',
    name: '平台拨付总额',
    width: 150,
  },
  {
    id: '14',
    enCode: 'bountyAmount',
    name: '平台拨付余额',
    width: 150,
  },
];
const operationBtnMap: Record<string, OperationBtnType> = {
  detailBtn: { emits: { onClick: (role) => goDetail(role) } },
};
const operationBtns = defineOperationBtns([
  {
    data: {
      enCode: 'detailBtn',
      name: '详情',
    },
    emits: {
      onClick: (role) => goDetail(role),
    },
  },
]);
const { checkSubModuleItemShow, column, operationBtns } = useAccess({
  operationBtnMap,
});
const router = useRouter();
const BaseState = {
src/views/MaterialReview/MaterialReReviewList.vue
@@ -71,90 +71,19 @@
import * as parkBountyApplyServices from '@/services/api/ParkBountyApply';
import _ from 'lodash';
import { ModelValueType } from 'element-plus';
import { useGlobalEventContext } from '@/hooks';
import { useAccess, useGlobalEventContext } from '@/hooks';
defineOptions({
  name: 'MaterialReviewList',
});
const column: API.CustomModuleColumnDto[] = [
  {
    id: '1',
    enCode: 'batchNo',
    name: '申请批次号',
  },
  {
    id: '2',
    enCode: 'parkName',
    name: '申请园区',
  },
  {
    id: '3',
    enCode: 'parkTypeName',
    name: '园区类型',
  },
  {
    id: '4',
    enCode: 'applyMonth',
    name: '申请奖励金月份',
  },
  {
    id: '5',
    enCode: 'applySumAmount',
    name: '奖励金汇总金额(元)',
  },
  {
    id: '6',
    enCode: 'creationTime',
    name: '申报日期',
  },
  {
    id: '6-1',
    enCode: 'outCheckAuditOperator',
    name: '初审人',
  },
  {
    id: '6-2',
    enCode: 'outCheckTime',
    name: '初审日期',
  },
  {
    id: '6-3',
    enCode: 'outCheckStatus',
    name: '初审状态',
  },
  {
    id: '7',
    enCode: 'outReCheckAuditOperator',
    name: '复审人',
  },
  {
    id: '8',
    enCode: 'outReCheckTime',
    name: '复审日期',
  },
  {
    id: '9',
    enCode: 'outReCheckStatus',
    name: '复审状态',
  },
];
const operationBtns = defineOperationBtns([
  {
    data: {
      enCode: 'detailBtn',
      name: '详情',
    },
const operationBtnMap: Record<string, OperationBtnType> = {
  detailBtn: {
    emits: {
      onClick: (role) => goDetail(role),
    },
  },
  {
    data: {
      enCode: 'auditBtn',
      name: '审核',
    },
  auditBtn: {
    emits: {
      onClick: (role) => goAudit(role),
    },
@@ -163,7 +92,11 @@
        row.outReCheckStatus !== BountyCheckStatusEnum.WaitCheck,
    },
  },
]);
};
const { checkSubModuleItemShow, column, operationBtns } = useAccess({
  operationBtnMap,
});
const router = useRouter();
const BaseState = {
src/views/MaterialReview/MaterialReview.vue
@@ -71,75 +71,19 @@
import * as parkBountyApplyServices from '@/services/api/ParkBountyApply';
import _ from 'lodash';
import { ModelValueType } from 'element-plus';
import { useGlobalEventContext } from '@/hooks';
import { useAccess, useGlobalEventContext } from '@/hooks';
defineOptions({
  name: 'MaterialReviewList',
});
const column: API.CustomModuleColumnDto[] = [
  {
    id: '1',
    enCode: 'batchNo',
    name: '申请批次号',
  },
  {
    id: '2',
    enCode: 'parkName',
    name: '申请园区',
  },
  {
    id: '3',
    enCode: 'parkTypeName',
    name: '园区类型',
  },
  {
    id: '4',
    enCode: 'applyMonth',
    name: '申请奖励金月份',
  },
  {
    id: '5',
    enCode: 'applySumAmount',
    name: '奖励金汇总金额(元)',
  },
  {
    id: '6',
    enCode: 'creationTime',
    name: '申报日期',
  },
  {
    id: '7',
    enCode: 'outCheckAuditOperator',
    name: '审核人',
  },
  {
    id: '8',
    enCode: 'outCheckTime',
    name: '审核日期',
  },
  {
    id: '9',
    enCode: 'outCheckStatus',
    name: '审核状态',
  },
];
const operationBtns = defineOperationBtns([
  {
    data: {
      enCode: 'detailBtn',
      name: '详情',
    },
const operationBtnMap: Record<string, OperationBtnType> = {
  detailBtn: {
    emits: {
      onClick: (role) => goDetail(role),
    },
  },
  {
    data: {
      enCode: 'auditBtn',
      name: '审核',
    },
  auditBtn: {
    emits: {
      onClick: (role) => goAudit(role),
    },
@@ -148,7 +92,11 @@
        row.outCheckStatus !== BountyCheckStatusEnum.WaitCheck,
    },
  },
]);
};
const { checkSubModuleItemShow, column, operationBtns } = useAccess({
  operationBtnMap,
});
const router = useRouter();
const BaseState = {
src/views/Permission/ExternalAccountManage.vue
New file
@@ -0,0 +1,223 @@
<template>
  <LoadingLayout :loading="state.loading">
    <AppContainer>
      <ProTableQueryFilterBar @on-reset="reset">
        <template #query>
          <QueryFilterItem>
            <SearchInput
              v-model="extraParamState.queryCondition"
              style="width: 200px"
              placeholder="账号/姓名/手机号"
              @on-click-search="getList"
            >
            </SearchInput>
          </QueryFilterItem>
        </template>
        <template #btn>
          <el-button
            v-if="checkSubModuleItemShow('pageButton', 'addBtn')"
            @click="openDialog()"
            icon="Plus"
            type="primary"
            >新增</el-button
          >
        </template>
      </ProTableQueryFilterBar>
      <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns">
      </ProTableV2>
    </AppContainer>
    <AddOrEditExternalAccountDialog v-bind="dialogProps" />
    <ResetPasswordDialog v-bind="resetPasswordDialogProps"></ResetPasswordDialog>
  </LoadingLayout>
</template>
<script setup lang="ts">
import {
  ProTableQueryFilterBar,
  ProTableV2,
  SearchInput,
  LoadingLayout,
  AppContainer,
  QueryFilterItem,
  useTable,
  useFormDialog,
  defineOperationBtns,
} from '@bole-core/components';
import * as userRoleServices from '@/services/api/UserRole';
import * as accountServices from '@/services/api/Account';
import { Message, OrderInputType } from '@bole-core/core';
import AddOrEditExternalAccountDialog from './components/AddOrEditExternalAccountDialog.vue';
import ResetPasswordDialog from './components/ResetPasswordDialog.vue';
import { useAccess } from '@/hooks';
import { ExternalSystem, ExternalSystemText } from '@/constants';
defineOptions({
  name: 'ExternalAccountManage',
});
const operationBtnMap: Record<string, OperationBtnType> = {
  editBtn: { emits: { onClick: (role) => openDialog(role) } },
  resetPasswordBtn: { emits: { onClick: (role) => openResetPasswordDialog(role) } },
};
const { checkSubModuleItemShow, column, operationBtns } = useAccess({
  operationBtnMap,
});
const BaseState = {
  loading: true,
};
const state = reactive({ ...BaseState });
onMounted(async () => {
  await getList();
  state.loading = false;
});
const {
  getDataSource: getList,
  proTableProps,
  paginationState,
  extraParamState,
  reset,
} = useTable(
  async ({ pageIndex, pageSize }, extraParamState) => {
    try {
      let params: API.GetBackClientUsersInput = {
        pageModel: {
          rows: pageSize,
          page: pageIndex,
          orderInput: extraParamState.orderInput,
        },
        queryCondition: extraParamState.queryCondition,
      };
      let res = await userRoleServices.getGovermentSubAccounts(params, {
        showLoading: !state.loading,
      });
      return res;
    } catch (error) {}
  },
  {
    defaultExtraParams: {
      orderInput: [{ property: 'id', order: OrderInputType.Desc }],
      queryCondition: '',
    },
    columnsRenderProps: {
      clientId: { type: 'enum', valueEnum: ExternalSystemText },
    },
  }
);
function openDialog(row?: API.UserDto) {
  if (row) {
    handleEdit({
      id: row.id,
      userName: row.userName,
      name: row.name,
      phoneNumber: row.phoneNumber,
      password: '',
      clientId: row.clientId,
      industrialParkIds: row.industrialParkIds?.length > 0 ? row.industrialParkIds : [],
      remark: row.remark,
      isSendMessage: row.isSendMessage,
      sendClaimMessage: row.sendClaimMessage,
      sendBillExpireMessage: row.sendBillExpireMessage,
      staffChangeMessage: row.staffChangeMessage,
      batchUpdateMessage: row.batchUpdateMessage,
      roleNames: row.roles.map((x) => x.name),
    });
  } else {
    handleAdd();
  }
}
const { dialogProps, handleAdd, handleEdit, editForm } = useFormDialog({
  onConfirm: handleAddOrEdit,
  defaultFormParams: {
    id: '',
    userName: '',
    name: '',
    phoneNumber: '',
    clientId: '',
    industrialParkIds: [] as string[],
    password: '',
    remark: '',
    isSendMessage: false,
    sendClaimMessage: false,
    sendBillExpireMessage: false,
    staffChangeMessage: false,
    batchUpdateMessage: false,
    roleNames: [] as string[],
  },
});
async function handleAddOrEdit() {
  try {
    let isEdit = !!editForm.id;
    let params: API.CreateGovermentSubAccounts = {
      name: editForm.name,
      userName: editForm.userName,
      remark: editForm.remark,
      phoneNumber: editForm.phoneNumber,
      clientId: ExternalSystem.Goverend,
      industrialParkIds: editForm.industrialParkIds,
      roleNames: editForm.roleNames,
      sendClaimMessage: editForm.sendClaimMessage,
      sendBillExpireMessage: editForm.sendBillExpireMessage,
      isSendMessage: editForm.isSendMessage,
      staffChangeMessage: editForm.staffChangeMessage,
      batchUpdateMessage: editForm.batchUpdateMessage,
    };
    let res;
    if (isEdit) {
      (params as API.UpdateGovermentClientUserInput).id = editForm.id;
      res = await userRoleServices.updateGovermentSubAccounts(params);
    } else {
      (params as API.CreateGoverUserInput).password = editForm.password;
      res = await userRoleServices.createGovermentSubAccounts(params);
    }
    if (res) {
      Message.successMessage('操作成功');
      getList(isEdit ? paginationState.pageIndex : 1);
    }
  } catch (error) {}
}
const {
  dialogProps: resetPasswordDialogProps,
  handleAdd: handleResetPasswordAdd,
  editForm: resetPasswordEditForm,
} = useFormDialog({
  onConfirm: resetPassword,
  defaultFormParams: {
    userId: '',
    password: '',
  },
});
function openResetPasswordDialog(row: API.UserDto) {
  handleResetPasswordAdd({
    userId: row.id,
    password: '',
  });
}
async function resetPassword() {
  try {
    let params: API.ResetPasswordBaseInput = {
      userId: resetPasswordEditForm.userId,
      password: resetPasswordEditForm.password,
    };
    let res = await accountServices.resetPassword(params);
    if (res) {
      Message.successMessage('操作成功');
      getList(paginationState.pageIndex);
    }
  } catch (error) {}
}
</script>
src/views/Permission/RoleManage.vue
@@ -25,11 +25,31 @@
        </template>
      </ProTableQueryFilterBar>
      <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns">
        <template #columns="{ row, column }">
          <template v-if="column.property === 'departmentId'">
            {{ DepartmentTypeText[row[column.property]] }}
          </template>
          <template v-else-if="column.property === 'dataRange'">
            {{ DataRangeEnumText[row[column.property]] }}
          </template>
          <!-- <template v-else-if="column.property === 'isEnable'">
            <FieldSwitch
              active-text="启用"
              inactive-text="禁用"
              v-model="row.isEnable"
              :before-change="() => roleEnableOrForbid(row)"
            />
          </template> -->
        </template>
      </ProTableV2>
    </AppContainer>
    <AddOrEditRoleDialog v-bind="dialogProps" />
    <DialogAuthorize v-model:authorizeId="rowState.authorizeId" authorizeType="Role" />
    <!-- <DialogMember v-model:visibleId="rowState.setMemberRoleId" /> -->
    <DialogAuthorize
      v-model:authorizeId="rowState.authorizeId"
      authorizeType="Role"
      :menuScene="AppLocalConfig.menuScene"
    />
    <DialogMember v-model:visibleId="rowState.setMemberRoleId" />
  </LoadingLayout>
</template>
@@ -44,13 +64,23 @@
  QueryFilterItem,
  useTable,
  useFormDialog,
  FieldRadio,
} from '@bole-core/components';
import { useAccess, useAllRoleList } from '@/hooks';
import * as userServices from '@/services/api/User';
import { useAccess } from '@/hooks';
import * as userRoleServices from '@/services/api/UserRole';
import { Message, OrderInputType } from '@bole-core/core';
import AddOrEditRoleDialog from './components/AddOrEditRoleDialog.vue';
import { DataRangeEnum, DataRangeEnumText } from '@/constants';
import DialogAuthorize from './components/dialogAuthorize.vue';
import DialogMember from './components/dialogMember.vue';
import {
  DepartmentType,
  DepartmentTypeText,
  DataRangeEnum,
  DataRangeEnumText,
  EnumMenuSceneText,
  EnumMenuScene,
  AppLocalConfig,
} from '@/constants';
import { formatRoleName } from '@/utils';
defineOptions({
@@ -61,17 +91,17 @@
  editBtn: { emits: { onClick: (role) => openDialog(role) } },
  delBtn: { emits: { onClick: (role) => handleDeleteRole(role) }, props: { type: 'danger' } },
  authorize: { emits: { onClick: (role) => openAuthorizeDialog(role) } },
  // member: { emits: { onClick: (role) => openMemberDialog(role) } },
  disabledBtn: {
    emits: { onClick: (role) => roleEnableOrForbid(role) },
    extraProps: {
      hide: (row) => row.isEnable,
    },
  },
  member: { emits: { onClick: (role) => openMemberDialog(role) } },
  enableBtn: {
    emits: { onClick: (role) => roleEnableOrForbid(role) },
    extraProps: {
      hide: (row) => !row.isEnable,
      hide: (row: API.RoleInfo) => row.isEnable,
    },
  },
  disabledBtn: {
    emits: { onClick: (role) => roleEnableOrForbid(role) },
    extraProps: {
      hide: (row: API.RoleInfo) => !row.isEnable,
    },
  },
};
@@ -79,8 +109,6 @@
const { checkSubModuleItemShow, column, operationBtns } = useAccess({
  operationBtnMap,
});
const { refetch } = useAllRoleList();
const BaseState = {
  loading: true,
@@ -109,8 +137,9 @@
          orderInput: [{ property: 'sequence', order: OrderInputType.Asc }],
        },
        queryCondition: extraParamState.queryCondition,
        menuScene: AppLocalConfig.menuScene,
      };
      let res = await userServices.getRoles(params, {
      let res = await userRoleServices.getRoles(params, {
        showLoading: !state.loading,
      });
      return {
@@ -140,6 +169,7 @@
      id: row.id,
      name: formatRoleName(row.name),
      remark: row.remark,
      // departmentId: row.departmentId,
      dataRange: row.dataRange,
    });
  } else {
@@ -153,6 +183,7 @@
    id: '',
    name: '',
    remark: '',
    // departmentId: DepartmentType.Market,
    dataRange: DataRangeEnum.All,
  },
});
@@ -160,22 +191,24 @@
async function handleAddOrEdit() {
  try {
    const isEdit = editForm.id;
    let params: API.CreateOrUpdateRoleInput = {
    let params: API.CreateBaseRoleInput = {
      name: editForm.name,
      remark: editForm.remark,
      // departmentId: editForm.departmentId,
      dataRange: editForm.dataRange,
      menuScene: AppLocalConfig.menuScene,
    };
    let res;
    if (isEdit) {
      params.id = editForm.id;
      res = await userServices.updateRole(params);
      (params as API.CreateOrUpdateRoleInput).id = editForm.id;
      res = await userRoleServices.updateRole(params);
    } else {
      res = await userServices.createRole(params);
      res = await userRoleServices.createRole(params);
    }
    if (res) {
      Message.successMessage('操作成功');
      getList(isEdit ? paginationState.pageIndex : 1);
      refetch({ type: 'inactive' });
      dialogState.dialogVisible = false;
    }
  } catch (error) {}
}
@@ -186,26 +219,24 @@
    let params = {
      id: row.id,
    };
    let res = await userServices.deleteRole(params);
    let res = await userRoleServices.deleteRole(params);
    if (res) {
      Message.successMessage('操作成功');
      getList(paginationState.pageIndex);
      refetch({ type: 'inactive' });
    }
  } catch (error) {}
}
async function roleEnableOrForbid(row: API.RoleInfo) {
  try {
    await Message.tipMessage(`是否${!row.isEnable ? '启用' : '禁用'}角色`);
    let res = await userServices.roleEnableOrForbid({
    await Message.tipMessage(`是否${!row.isEnable ? '启用' : '禁用'}用户`);
    let res = await userRoleServices.roleEnableOrForbid({
      id: row.id,
      isEnable: !row.isEnable,
    });
    if (res) {
      Message.successMessage('操作成功');
      getList(paginationState.pageIndex);
      refetch({ type: 'inactive' });
      return !!res;
    }
  } catch (error) {}
@@ -220,7 +251,7 @@
  rowState.authorizeId = row.id;
}
// function openMemberDialog(row: API.IdentityRoleDto) {
//   rowState.setMemberRoleId = row.id;
// }
function openMemberDialog(row: API.IdentityRoleDto) {
  rowState.setMemberRoleId = row.id;
}
</script>
src/views/Permission/components/AddOrEditExternalAccountDialog.vue
New file
@@ -0,0 +1,210 @@
<template>
  <ProDialog
    :title="form.title"
    v-model="visible"
    @close="onDialogClose"
    destroy-on-close
    draggable
    :width="800"
  >
    <ProForm :model="form" ref="dialogForm" label-width="120px">
      <ProFormItemV2
        label="账号:"
        prop="userName"
        :check-rules="[
          { message: '请输入账号' },
          { message: '账号仅支持字母和数字', pattern: MyRegExp.PasswordRegexOnlyLetterNumber },
        ]"
      >
        <ProFormText
          placeholder="请输入账号"
          v-model.trim="form.userName"
          :maxlength="30"
        ></ProFormText>
      </ProFormItemV2>
      <ProFormItemV2 label="姓名:" prop="name" :check-rules="[{ message: '请输入姓名' }]">
        <ProFormText
          placeholder="请输入姓名"
          v-model.trim="form.name"
          :maxlength="30"
        ></ProFormText>
      </ProFormItemV2>
      <ProFormItemV2
        label="手机号:"
        prop="phoneNumber"
        :check-rules="[{ message: '请输入手机号', type: 'phone' }]"
      >
        <ProFormText placeholder="请输入手机号" v-model.trim="form.phoneNumber"></ProFormText>
      </ProFormItemV2>
      <!-- <ProFormItemV2
        label="外部系统:"
        prop="clientId"
        :check-rules="[{ message: '请选择外部系统' }]"
      >
        <ProFormSelect
          placeholder="请选择外部系统"
          v-model="form.clientId"
          :value-enum="ExternalSystemText"
        ></ProFormSelect>
      </ProFormItemV2> -->
      <ProFormItemV2
        v-if="!isEdit"
        label="密码:"
        prop="password"
        :check-rules="[{ message: '请输入密码', required: !form.id }]"
      >
        <ProFormText
          placeholder="请输入密码"
          v-model.trim="form.password"
          :maxlength="30"
        ></ProFormText>
      </ProFormItemV2>
      <ProFormItemV2 label="角色" prop="roleNames" :check-rules="[{ message: '请选择角色' }]">
        <ProFormCheckbox
          v-model="form.roleNames"
          :value-enum="enableRoleList"
          enumLabelKey="name"
          enum-value-key="realName"
        ></ProFormCheckbox>
      </ProFormItemV2>
      <ProFormItemV2
        v-if="form.clientId !== ExternalSystem.flexjob"
        label="负责园区:"
        prop="industrialParkIds"
        :check-rules="[{ message: '请选择负责园区' }]"
      >
        <ProFormSelect
          placeholder="请选择负责园区"
          v-model="form.industrialParkIds"
          :value-enum="industrialParkList"
          enum-label-key="parkName"
          enum-value-key="id"
          multiple
        ></ProFormSelect>
      </ProFormItemV2>
      <template v-if="form.clientId === ExternalSystem.JYB">
        <ProFormItemV2 label="短信提醒:" prop="isSendMessage">
          <ProFormRadio v-model="form.isSendMessage" :value-enum="BooleanOptions" />
        </ProFormItemV2>
        <ProFormItemV2
          label="提醒内容:"
          prop="remind"
          :check-rules="[
            {
              required: form.isSendMessage,
              message: '请选择提醒内容',
              validator: (rule, value, callback) => {
                if (form.isSendMessage && !form.sendClaimMessage && !form.sendBillExpireMessage) {
                  callback(new Error('请选择提醒内容'));
                }
                callback();
              },
            },
          ]"
        >
          <el-checkbox v-model="form.sendClaimMessage" label="理赔提醒" size="large" />
          <el-checkbox v-model="form.sendBillExpireMessage" label="保单到期提醒" size="large" />
          <el-checkbox v-model="form.staffChangeMessage" label="人员变更提醒" size="large" />
          <el-checkbox v-model="form.batchUpdateMessage" label="批改提醒" size="large" />
        </ProFormItemV2>
      </template>
      <ProFormItemV2 label="备注:" prop="remark">
        <ProFormTextArea
          v-model="form.remark"
          placeholder="请输入备注"
          :maxlength="2000"
        ></ProFormTextArea>
      </ProFormItemV2>
    </ProForm>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="emit('onCancel')">取 消</el-button>
        <el-button type="primary" @click="handleConfirm">确 定</el-button>
      </span>
    </template>
  </ProDialog>
</template>
<script setup lang="ts">
import { FormInstance } from 'element-plus';
import {
  ProDialog,
  ProForm,
  ProFormItemV2,
  ProFormText,
  ProFormTextArea,
  ProFormSelect,
  ProFormRadio,
  ProFormCheckbox,
} from '@bole-core/components';
import {
  ExternalSystemText,
  BooleanOptions,
  ExternalSystem,
  MyRegExp,
  EnumMenuScene,
} from '@/constants';
import { useAllRoleList, useIndustrialParkDropDownList } from '@/hooks';
import { BoleRegExp } from '@bole-core/core';
defineOptions({
  name: 'AddOrEditExternalAccountDialog',
});
// type Props = {};
// const props = withDefaults(defineProps<Props>(), {});
const visible = defineModel({ type: Boolean });
const { industrialParkList } = useIndustrialParkDropDownList();
type Form = {
  title?: string;
  id: string;
  userName: string;
  name: string;
  phoneNumber: string;
  clientId: string;
  industrialParkIds: string[];
  password: string;
  remark: string;
  isSendMessage?: boolean;
  sendClaimMessage?: boolean;
  sendBillExpireMessage?: boolean;
  staffChangeMessage?: boolean;
  batchUpdateMessage?: boolean;
  roleNames: string[];
};
const { enableRoleList } = useAllRoleList({ menuScene: EnumMenuScene.Goverment });
const form = defineModel<Form>('form');
const isEdit = computed(() => !!form.value?.id);
const emit = defineEmits<{
  (e: 'onConfirm'): void;
  (e: 'onCancel'): void;
}>();
const dialogForm = ref<FormInstance>();
function onDialogClose() {
  if (!dialogForm.value) return;
  dialogForm.value.resetFields();
}
function handleConfirm() {
  if (!dialogForm.value) return;
  dialogForm.value.validate((valid) => {
    if (valid) {
      emit('onConfirm');
    } else {
      return;
    }
  });
}
</script>
src/views/Permission/components/ResetPasswordDialog.vue
New file
@@ -0,0 +1,71 @@
<template>
  <ProDialog
    :title="form.title"
    v-model="visible"
    @close="onDialogClose"
    destroy-on-close
    draggable
    :width="800"
  >
    <ProForm :model="form" ref="dialogForm" label-width="120px">
      <ProFormItemV2 label="密码:" prop="password" :check-rules="[{ message: '请输入密码' }]">
        <ProFormText
          placeholder="请输入密码"
          v-model.trim="form.password"
          :maxlength="30"
        ></ProFormText>
      </ProFormItemV2>
    </ProForm>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="emit('onCancel')">取 消</el-button>
        <el-button type="primary" @click="handleConfirm">确 定</el-button>
      </span>
    </template>
  </ProDialog>
</template>
<script setup lang="ts">
import { FormInstance } from 'element-plus';
import { ProDialog, ProForm, ProFormItemV2, ProFormText } from '@bole-core/components';
defineOptions({
  name: 'ResetPasswordDialog',
});
// type Props = {};
// const props = withDefaults(defineProps<Props>(), {});
const visible = defineModel({ type: Boolean });
type Form = {
  title?: string;
  userId: string;
  password: string;
};
const form = defineModel<Form>('form');
const emit = defineEmits<{
  (e: 'onConfirm'): void;
  (e: 'onCancel'): void;
}>();
const dialogForm = ref<FormInstance>();
function onDialogClose() {
  if (!dialogForm.value) return;
  dialogForm.value.resetFields();
}
function handleConfirm() {
  if (!dialogForm.value) return;
  dialogForm.value.validate((valid) => {
    if (valid) {
      emit('onConfirm');
    } else {
      return;
    }
  });
}
</script>
src/views/Permission/components/dialogAuthorize.vue
@@ -156,10 +156,18 @@
<script setup lang="ts">
import { computed, reactive, watch } from 'vue';
import * as baseModuleServices from '@/services/api/BaseModule';
import * as baseModuleNewServices from '@/services/api/BaseModuleNew';
import { Message } from '@bole-core/core';
import { AuthorizeType, SubModuleType, SubModuleTitle } from '@/constants';
import {
  AuthorizeType,
  SubModuleType,
  SubModuleTitle,
  EnumMenuSceneText,
  EnumMenuScene,
} from '@/constants';
import { getTree } from '@/utils';
import { templateRef } from '@vueuse/core';
import { PropType } from 'vue';
const TypeTip = defineComponent({
  name: 'TypeTip',
@@ -167,7 +175,6 @@
  render() {
    const { typeTip, isMenu } = this;
    const tipText = isMenu ? `菜单` : '页面';
    console.log(typeTip);
    return h(
      'span',
      {
@@ -189,6 +196,10 @@
  authorizeType: {
    type: String,
    default: 'Role',
  },
  menuScene: {
    type: Number as PropType<EnumMenuScene>,
    default: EnumMenuScene.Back,
  },
});
const emit = defineEmits<{
@@ -333,12 +344,13 @@
async function getModulesByUserOrRoleId(id) {
  const { authorizeType } = props;
  const data = {
  const data: API.APIgetUserOrRoleModuleListParams = {
    objectType: AuthorizeType[authorizeType],
    id,
    menuScene: props.menuScene,
  };
  const result = await baseModuleServices.getUserOrRoleModuleList(data);
  const result = await baseModuleNewServices.getUserOrRoleModuleList(data);
  state.sysModules = getTree(result, null);
  elModuleTree.value.setCheckedKeys(result.filter((x) => x.hasCheck).map((x) => x.id));
src/views/Permission/components/dialogMember.vue
New file
@@ -0,0 +1,286 @@
<template>
  <el-dialog :modelValue="visibleId != ''" width="1080px" title="成员管理" @close="handleClose">
    <div class="setting-wrapper">
      <div class="setting-wrapper-left">
        <section class="table-wrapper">
          <el-table :data="state.originAccountList" size="mini" stripe :max-height="400">
            <el-table-column type="index" label="序号" width="100"> </el-table-column>
            <el-table-column prop="userName" label="登录账号"> </el-table-column>
            <el-table-column prop="name" label="姓名"> </el-table-column>
            <el-table-column label="" width="60">
              <template #default="scope">
                <el-button
                  :icon="!scope.row.isCheck ? 'plus' : 'delete'"
                  class="fa"
                  link
                  type="primary"
                  @click="handleAddOrNot(scope.row.id)"
                ></el-button>
              </template>
            </el-table-column>
          </el-table>
          <div v-if="state.pagination.total !== 0" class="pagination-wrapper">
            <el-pagination
              layout=" prev, pager, next, jumper"
              :page-sizes="[20, 50, 100, 200, 400, 500]"
              :current-page="state.pagination.page"
              :page-size="50"
              :total="state.pagination.total"
              @current-change="getAccountList"
              @size-change="handleSizeChange"
            >
            </el-pagination>
          </div>
        </section>
      </div>
      <div class="setting-wrapper-right">
        <el-scrollbar>
          <el-table :data="state.checkedList" size="mini" stripe>
            <el-table-column type="index" label="序号" width="55"> </el-table-column>
            <el-table-column prop="userName" label="登录账号"> </el-table-column>
            <el-table-column prop="name" label="姓名"> </el-table-column>
            <el-table-column label="" width="60">
              <template #default="scope">
                <el-button icon="delete" link type="primary" @click="handleAddOrNot(scope.row.id)">
                </el-button>
              </template>
            </el-table-column>
          </el-table>
        </el-scrollbar>
      </div>
    </div>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="handleClose"> 取消 </el-button>
        <el-button type="primary" @click="changeRoleAccount" class="btn-submit"> 保存 </el-button>
      </span>
    </template>
  </el-dialog>
</template>
<script setup lang="ts">
import * as identityUserServices from '@/services/api/IdentityUser';
import * as userRoleServices from '@/services/api/UserRole';
import { Message } from '@bole-core/core';
const props = defineProps({
  visibleId: {
    type: String,
    default: '',
  },
});
const emit = defineEmits<{
  (e: 'update:visibleId', params: string): void;
}>();
watch(
  () => props.visibleId,
  async (newValue) => {
    if (newValue) {
      const result = await identityUserServices.getRoleUserList({
        id: newValue,
        pageModel: { rows: 100, page: 1 },
      });
      const { data } = result;
      const list = data.map((item) => {
        return {
          id: item.id,
          userName: item.userName,
          name: item.name,
        };
      });
      state.checkedList = list;
      getAccountList();
    }
  }
);
const state = reactive({
  checkedList: [],
  originAccountList: [],
  pagination: {
    rows: 20,
    page: 1,
    orderInput: [{ property: 'Id', order: 'asc' }],
    total: -1,
  },
});
function handleClose() {
  emit('update:visibleId', '');
}
function handleAddOrNot(id) {
  const hitIndex = state.checkedList.findIndex((x) => x.id === id);
  const isExistOrigin = state.originAccountList.findIndex((x) => x.id === id);
  // 已选
  if (hitIndex !== -1) {
    //如果 当前account 只有一个role且是当前的roleId visibleId的话就不能删除
    if (isExistOrigin !== -1) {
      const roles = state.originAccountList[isExistOrigin].roles;
      const roleIndex = roles.findIndex((role) => role.id === props.visibleId);
      if (roles.length === 1 && roleIndex !== -1) {
        Message.warnMessage('账号有且只有该角色,不能删除');
        return;
      }
    }
    state.checkedList.splice(hitIndex, 1);
  }
  //未选
  if (isExistOrigin !== -1) {
    state.originAccountList[isExistOrigin]['isCheck'] = hitIndex === -1;
    if (hitIndex === -1) {
      const current = state.originAccountList[isExistOrigin];
      state.checkedList.push({
        id: current.id,
        userName: current.userName,
        name: current.name,
        phone: current.phone,
        isCheck: true,
      });
    }
  }
}
async function getAccountList(pageIndex = 1) {
  try {
    state.pagination.page = pageIndex;
    let params = {
      pageModel: { rows: 100, page: 1 },
    };
    const result = await userRoleServices.getBackClientUsers(params);
    const { data, pageModel } = result;
    const { checkedList } = state;
    data.forEach((x) => {
      const isExistIndex = checkedList.findIndex((item) => x.id === item.id);
      if (isExistIndex !== -1) {
        //@ts-ignore
        x.isCheck = true;
      }
    });
    state.originAccountList = data;
    state.pagination.total = pageModel.totalCount;
  } catch (error) {
    console.log(error);
  }
}
function handleSizeChange(val) {
  state.pagination.rows = val;
  getAccountList();
}
async function changeRoleAccount() {
  try {
    const params = {
      userId: state.checkedList.map((x) => x.id),
      roleId: props.visibleId,
    };
    await identityUserServices.setRoleUser(params);
    Message.successMessage('设置成功!');
    handleClose();
  } catch (error) {
    Message.errorMessage(error.message || '设置失败!');
  }
}
</script>
<style lang="scss" scoped>
@use '@/style/common.scss' as *;
.setting-wrapper {
  display: flex;
  justify-content: space-between;
  // position: relative;
  width: 100%;
  height: 440px;
  border-bottom: 1px solid #e8e8e8;
  background-color: #f5f5f5;
  &-left {
    position: relative;
    display: flex;
    width: 55%;
    background-color: #ffffff;
    box-shadow: 0px 2px 5px 0px rgba(112, 114, 117, 0.3);
    .el-scrollbar {
      height: 360px;
      .el-scrollbar__bar.is-vertical {
        padding-bottom: 18px;
      }
    }
    .table-wrapper {
      display: flex;
      width: 100%;
      flex-direction: column;
      .pagination-wrapper {
        display: flex;
        justify-content: center;
        margin: 6px 0;
      }
    }
  }
  &-right {
    // width: 40%;
    margin-left: 12px;
    background-color: #ffffff;
    box-shadow: 0px 2px 5px 0px rgba(112, 114, 117, 0.3);
    flex: 1;
    ul.selected-wrapper {
      li {
        position: relative;
        padding-left: 30px;
        width: 100%;
        height: 47px;
        font-size: 14px;
        border-bottom: 1px solid #efefef;
        color: #999999;
        transition: all 0.45s ease;
        line-height: 47px;
        &:hover {
          color: #ffffff;
          background-color: boleGetCssVar('color', 'primary');
          .el-icon-delete {
            position: absolute;
            display: inline-block;
          }
        }
      }
    }
  }
}
.btn-wrapper {
  justify-content: center;
  padding: 4% 40px 4%;
}
:deep(.el-scrollbar) {
  height: 100%;
  .el-scrollbar__wrap {
    overflow-x: hidden;
  }
}
</style>
src/views/Reward/FinancialApproval.vue
@@ -45,11 +45,7 @@
          </QueryFilterItem>
        </template>
      </ProTableQueryFilterBar>
      <ProTableV2
        v-bind="proTableProps"
        :columns="FinancialApprovalColumns"
        :operationBtns="operationBtns"
      >
      <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns">
      </ProTableV2>
      <RewardApplyTradeCheckDialog v-bind="dialogProps"></RewardApplyTradeCheckDialog>
    </AppContainer>
@@ -85,19 +81,15 @@
import { ModelValueType } from 'element-plus';
import RewardApplyTradeCheckDialog from './components/RewardApplyTradeCheckDialog.vue';
import { convertApi2FormUrlObjectBySeparator, convertApi2FormUrlOnlyOne, format } from '@/utils';
import { FinancialApprovalColumns } from './constants';
import { useIndustrialParkDropDownList } from '@/hooks/industrialPark';
import { useAccess } from '@/hooks';
defineOptions({
  name: 'FinancialApproval',
});
const operationBtns = defineOperationBtns([
  {
    data: {
      enCode: 'detailBtn',
      name: '详情',
    },
const operationBtnMap: Record<string, OperationBtnType> = {
  detailBtn: {
    emits: {
      onClick: (role) => openDialog(role, true),
    },
@@ -106,11 +98,7 @@
        row.financeAuditStatus === EnumParkBountyTradeDetailAuditStatus.Wait,
    },
  },
  {
    data: {
      enCode: 'checkBtn',
      name: '审批',
    },
  checkBtn: {
    emits: {
      onClick: (row) => openDialog(row),
    },
@@ -119,7 +107,11 @@
        row.financeAuditStatus !== EnumParkBountyTradeDetailAuditStatus.Wait,
    },
  },
]);
};
const { checkSubModuleItemShow, column, operationBtns } = useAccess({
  operationBtnMap,
});
const BaseState = {
  loading: true,
src/views/Reward/RewardApplyTradeCheck.vue
@@ -45,11 +45,7 @@
          </QueryFilterItem>
        </template>
      </ProTableQueryFilterBar>
      <ProTableV2
        v-bind="proTableProps"
        :columns="RewardApplyTradeCheckColumns"
        :operationBtns="operationBtns"
      >
      <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns">
      </ProTableV2>
      <RewardApplyTradeCheckDialog isApplyTrade v-bind="dialogProps"></RewardApplyTradeCheckDialog>
    </AppContainer>
@@ -85,19 +81,15 @@
import { ModelValueType } from 'element-plus';
import RewardApplyTradeCheckDialog from './components/RewardApplyTradeCheckDialog.vue';
import { convertApi2FormUrlObjectBySeparator, convertApi2FormUrlOnlyOne, format } from '@/utils';
import { RewardApplyTradeCheckColumns } from './constants';
import { useIndustrialParkDropDownList } from '@/hooks/industrialPark';
import { useAccess } from '@/hooks';
defineOptions({
  name: 'RewardApplyTradeCheck',
});
const operationBtns = defineOperationBtns([
  {
    data: {
      enCode: 'detailBtn',
      name: '详情',
    },
const operationBtnMap: Record<string, OperationBtnType> = {
  detailBtn: {
    emits: {
      onClick: (role) => openDialog(role, true),
    },
@@ -106,11 +98,7 @@
        row.auditStatus === EnumParkBountyTradeDetailAuditStatus.Wait,
    },
  },
  {
    data: {
      enCode: 'checkBtn',
      name: '审批',
    },
  checkBtn: {
    emits: {
      onClick: (row) => openDialog(row),
    },
@@ -119,7 +107,11 @@
        row.auditStatus !== EnumParkBountyTradeDetailAuditStatus.Wait,
    },
  },
]);
};
const { checkSubModuleItemShow, column, operationBtns } = useAccess({
  operationBtnMap,
});
const BaseState = {
  loading: true,
src/views/Reward/RewardGrant.vue
@@ -121,123 +121,16 @@
import { useQueryClient } from '@tanstack/vue-query';
import { TransferFileEnumInRewardGrandTableItem } from '@/components/commonView/types';
import { FourStreamsMaterialUtils } from '@/components/commonView/utils';
import { useAccess } from '@/hooks';
defineOptions({
  name: 'RewardGrant',
});
const column: API.CustomModuleColumnDto[] = [
  {
    id: '1',
    enCode: 'batchNo',
    name: '申请批次号',
    width: 160,
  },
  {
    id: '2',
    enCode: 'parkName',
    name: '申请园区',
    width: 250,
  },
  {
    id: '3',
    enCode: 'parkTypeName',
    name: '园区类型',
    width: 160,
  },
  {
    id: '4',
    enCode: 'applyMonth',
    name: '申请平台奖励月份',
    width: 160,
  },
  {
    id: '5',
    enCode: 'applySumAmount',
    name: '平台奖励汇总金额(元)',
    width: 180,
  },
  {
    id: '6',
    enCode: 'creationTime',
    name: '申报日期',
    width: 180,
  },
  {
    id: '7',
    enCode: 'financeStatus',
    name: '财政拨付登记状态',
    width: 160,
  },
  {
    id: '8',
    enCode: 'financeTime',
    name: '财政拨付登记日期',
    width: 180,
  },
  {
    id: '9',
    enCode: 'settleStatus',
    name: '平台拨付登记状态',
    width: 160,
  },
  {
    id: '10',
    enCode: 'settleTime',
    name: '平台拨付登记日期',
    width: 180,
  },
  {
    id: '11',
    enCode: 'settleAndFinanceOperator',
    name: '登记人',
  },
];
const operationBtns = defineOperationBtns([
  {
    data: {
      enCode: 'detailBtn',
      name: '申报详情',
    },
    emits: {
      onClick: (role) => goDetail(role),
    },
  },
  // {
  //   data: {
  //     enCode: 'financialBtn',
  //     name: '财政拨付',
  //   },
  //   emits: {
  //     onClick: (role) => openFinancialDialog(role),
  //   },
  //   extraProps: {
  //     hide: (row: API.GetParkBountyApplyListOutput) =>
  //       row.financeStatus === FinanceStatusEnum.HasIncome,
  //   },
  // },
  // {
  //   data: {
  //     enCode: 'plateformBtn',
  //     name: '平台充值',
  //   },
  //   emits: {
  //     onClick: (role) => openPlateformDialog(role),
  //   },
  //   extraProps: {
  //     hide: (row: API.GetParkBountyApplyListOutput) =>
  //       row.settleStatus !== SettleStatusEnum.WaitForSettle,
  //   },
  // },
  {
    data: {
      enCode: 'registerBtn',
      name: '登记',
    },
    emits: {
      onClick: (role) => goRewardGrantRegister(role),
    },
const operationBtnMap: Record<string, OperationBtnType> = {
  detailBtn: { emits: { onClick: (role) => goDetail(role) } },
  registerBtn: {
    emits: { onClick: (role) => goRewardGrantRegister(role) },
    extraProps: {
      hide: (row: API.GetParkBountyApplyListOutput) =>
        !(
@@ -246,27 +139,7 @@
        ),
    },
  },
  // {
  //   data: {
  //     enCode: 'uploadCertBtn',
  //     name: '上传凭证',
  //   },
  //   emits: {
  //     onClick: (role) => openCertRewardDialog(role),
  //   },
  //   extraProps: {
  //     hide: (row: API.GetParkBountyApplyListOutput) =>
  //       !(
  //         row.settleStatus === SettleStatusEnum.HasSettle ||
  //         row.financeStatus === FinanceStatusEnum.HasIncome
  //       ),
  //   },
  // },
  {
    data: {
      enCode: 'checkBtn',
      name: '查看凭证',
    },
  checkBtn: {
    emits: {
      onClick: (row) => openMaterialFileDialog(row),
    },
@@ -278,7 +151,11 @@
        ),
    },
  },
]);
};
const { checkSubModuleItemShow, column, operationBtns } = useAccess({
  operationBtnMap,
});
const router = useRouter();
const BaseState = {
src/views/Reward/WithdrawalApproval.vue
@@ -64,70 +64,14 @@
import WithdrawalApprovalAuditDialog from './components/WithdrawalApprovalAuditDialog.vue';
import _ from 'lodash';
import { ModelValueType } from 'element-plus';
import { useAccess } from '@/hooks';
defineOptions({
  name: 'WithdrawalApproval',
});
const column: API.CustomModuleColumnDto[] = [
  {
    id: '1',
    enCode: 'enterpriseName',
    name: '企业名称',
  },
  {
    id: '2',
    enCode: 'societyCreditCode',
    name: '统一社会信用代码',
  },
  {
    id: '3',
    enCode: 'enterpriseType',
    name: '企业类型',
  },
  {
    id: '4',
    enCode: 'parkName',
    name: '所属园区',
  },
  {
    id: '5',
    enCode: 'parkType',
    name: '园区类型',
  },
  {
    id: '6',
    enCode: 'creationTime',
    name: '申请时间',
  },
  {
    id: '7',
    enCode: 'amount',
    name: '申请提现金额(元)',
  },
  {
    id: '8',
    enCode: 'checkStatus',
    name: '审核状态',
  },
  {
    id: '8',
    enCode: 'checkOperator',
    name: '审核人',
  },
  {
    id: '9',
    enCode: 'checkTime',
    name: '审核时间',
  },
];
const operationBtns = defineOperationBtns([
  {
    data: {
      enCode: 'detailBtn',
      name: '详情',
    },
const operationBtnMap: Record<string, OperationBtnType> = {
  detailBtn: {
    emits: {
      onClick: (role) => openDialog(role, true),
    },
@@ -136,11 +80,7 @@
        row.checkStatus === EnterpriseRechargeStatusEnum.WaitCheck,
    },
  },
  {
    data: {
      enCode: 'auditBtn',
      name: '审核',
    },
  auditBtn: {
    emits: {
      onClick: (role) => openDialog(role),
    },
@@ -149,7 +89,11 @@
        row.checkStatus !== EnterpriseRechargeStatusEnum.WaitCheck,
    },
  },
]);
};
const { checkSubModuleItemShow, column, operationBtns } = useAccess({
  operationBtnMap,
});
const router = useRouter();
const BaseState = {
src/views/StatisticalReport/RewardStatistics.vue
@@ -54,7 +54,13 @@
          </QueryFilterItem>
        </template>
        <template #btn>
          <el-button @click="handleExport()" icon="Download" type="primary">导出</el-button>
          <el-button
            v-if="checkSubModuleItemShow('pageButton', 'exportBtn')"
            @click="handleExport()"
            icon="Download"
            type="primary"
            >导出</el-button
          >
        </template>
      </ProTableQueryFilterBar>
      <ProTableV2 v-bind="proTableProps" :columns="column" :show-operation-column="false">
@@ -140,122 +146,7 @@
  name: 'RewardStatistics',
});
const column = defineColumns([
  {
    id: '1',
    enCode: 'enterpriseName',
    name: '企业名称',
    width: 250,
  },
  {
    id: '2',
    enCode: 'societyCreditCode',
    name: '信用代码',
    width: 200,
  },
  {
    id: '3',
    enCode: 'industrialParkName',
    name: '所属园区',
    width: 200,
  },
  {
    id: '4',
    enCode: 'contact',
    name: '联系人',
    width: 150,
  },
  {
    id: '5',
    enCode: 'contactPhone',
    name: '联系方式',
    width: 120,
  },
  {
    id: '6',
    enCode: 'month',
    name: '申报月份',
    width: 120,
  },
  {
    id: '7',
    enCode: 'batchNo',
    name: '申报批次号',
    width: 150,
  },
  {
    id: '8',
    enCode: 'sumFinanceAmount',
    name: '财政拨付金额',
    width: 120,
  },
  {
    id: '9',
    enCode: 'sumFinanceAmountBtn',
    name: '财政拨付明细',
    width: 120,
  },
  {
    id: '10',
    enCode: 'sumTransferAmount',
    name: '平台拨付金额',
    width: 120,
  },
  {
    id: '11',
    enCode: 'sumTransferAmountBtn',
    name: '平台拨付明细',
    width: 120,
  },
  {
    id: '12',
    enCode: 'sumRechargeAmount',
    name: '企业充值总额',
    width: 120,
  },
  {
    id: '13',
    enCode: 'sumRechargeAmountBtn',
    name: '企业充值明细',
    width: 120,
  },
  {
    id: '14',
    enCode: 'sumTradeAmount',
    name: '企业消费总额',
    width: 120,
  },
  {
    id: '15',
    enCode: 'sumTradeAmountBtn',
    name: '企业消费明细',
    width: 120,
  },
  {
    id: '16',
    enCode: 'sumDrawWithAmount',
    name: '企业提现总额',
    width: 120,
  },
  {
    id: '17',
    enCode: 'sumDrawWithAmountBtn',
    name: '企业提现明细',
    width: 120,
  },
  {
    id: '18',
    enCode: 'amount',
    name: '账户余额',
    width: 120,
  },
  {
    id: '19',
    enCode: 'amountBtn',
    name: '余额明细',
    width: 120,
  },
]);
const { checkSubModuleItemShow, column, operationBtns } = useAccess({});
const BaseState = {
  loading: true,