ソースを参照

添加基础设置/月度信息采集等界面

code4eat 1 年間 前
コミット
220fd701a0

+ 87 - 33
.umirc.ts

@@ -2,7 +2,7 @@
  * @Author: code4eat awesomedema@gmail.com
  * @Date: 2022-12-14 14:14:32
  * @LastEditors: code4eat awesomedema@gmail.com
- * @LastEditTime: 2023-10-23 09:59:34
+ * @LastEditTime: 2023-10-26 13:19:15
  * @FilePath: /BudgetManaSystem/.umirc.ts
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -15,7 +15,7 @@ const { REACT_APP_ENV } = process.env;
 export default defineConfig({
   antd: {
     configProvider: {
-      prefixCls: 'pfm-ant',
+      prefixCls: 'cost-ant',
     },
   },
   qiankun: {
@@ -24,7 +24,7 @@ export default defineConfig({
   mfsu:false,
   lessLoader: {
     modifyVars: { 
-      '@ant-prefix': 'pfm-ant',
+      '@ant-prefix': 'cost-ant',
       '@primary-color': '#3377FF',
       '@border-color-base':'#dae2f2'
     },  
@@ -35,11 +35,11 @@ export default defineConfig({
 
   access: {},
   model: {},
-
+  
   initialState: {},
   request: {},
   layout: {
-    title: '追踪方法学后台管理',
+    title: '成本核算系统',
     layout: 'side',
     menuProps: {
       theme: 'light',
@@ -48,7 +48,7 @@ export default defineConfig({
   manifest: {
     basePath: '/',
   },
-  publicPath: REACT_APP_ENV == 'dev' ? '/' : '/pfmManager/',
+  publicPath: REACT_APP_ENV == 'dev' ? '/' : '/costAccount/',
   proxy: {
 
     '/gateway': {
@@ -62,7 +62,30 @@ export default defineConfig({
   routes: [
     {
       path: '/',
-      redirect: '/setting/fenyeTemplate',
+      redirect: '/baseSetting/otherItemSet',
+    },
+    {
+      path: '/home',
+      component: './Home/index',
+    },
+    {
+      path: '/baseSetting',
+      name: '基础设置',
+      icon: 'tool',
+      routes: [
+        {
+          path: '/baseSetting/otherItemSet',
+          name: '其它设置',
+          icon: 'tool',
+          routes: [
+            {
+              path: '/baseSetting/otherItemSet/reportItemSet',
+              name: '报表项目设置',
+              component: './baseSetting/otherItemSet/reportItemSet/index',
+            },
+          ],
+        },
+      ],
     },
     {
       path: '/monthlyInfoSearch',
@@ -86,41 +109,72 @@ export default defineConfig({
       ],
     },
     {
-      name: '基础信息管理',
-      path: '/baseInfoMana',
-      routes:[
+      path: '/costAccounting',
+      name: '成本核算',
+      routes: [
+       
+      ],
+    },
+    {
+      path: '/reportExport',
+      name: '报表输出',
+      routes: [
         {
-          name: '人员管理',
-          path: '/baseInfoMana/empMana',
-          component:'./baseInfoMana/empMana'
+          path: '/reportExport/costAnalysisReport',
+          name: '成本分析报表',
+          routes: [
+            
+          ],
         },
+      ],
+    },
+    {
+      path: '/operationalAnalysis',
+      name: '运营分析',
+      routes: [
+        
+      ],
+    },
+    {
+      path: '/costLibraryManagement',
+      name: '成本库管理',
+      routes: [
         {
-          name: '单位管理',
-          path: '/baseInfoMana/unitMana',
-          component:'./baseInfoMana/unitMana'
+          path: '/costLibraryManagement/basicCostManagement',
+          name: '基础成本管理',
+          routes: [
+            
+          ],
         },
         {
-          name: '查核组管理',
-          path: '/baseInfoMana/checkGroupMana',
-          component:'./baseInfoMana/checkGroupMana'
+          path: '/costLibraryManagement/projectCostManagement',
+          name: '项目成本管理',
+          routes: [
+            
+          ],
         },
-      ]
-    },
-    {
-      name: '通用设置',
-      path: '/setting',
-      routes:[
         {
-          name: '定性选项管理',
-          path: '/setting/qualitativeOptionsMana',
-          component:'./setting/qualitativeOptionsMana'
+          path: '/costLibraryManagement/diseaseCostManagement',
+          name: '病种成本管理',
+          routes: [
+            
+          ],
         },
         {
-          name: '分页模板管理',
-          path: '/setting/fenyeTemplate',
-          component:'./setting/fenyeTemplate'
-        }
-      ]
+          path: '/costLibraryManagement/clinicalPathwayCostManagement',
+          name: '临床路径成本管理',
+          routes: [
+            
+          ],
+        },
+      ],
+    },
+    {
+      path: '/reportMana',
+      name: '报表管理',
+      routes: [
+        
+      ],
     },
   ],
   npmClient: 'yarn',

+ 134 - 88
src/app.tsx

@@ -2,7 +2,7 @@
  * @Author: code4eat awesomedema@gmail.com
  * @Date: 2022-12-14 14:14:32
  * @LastEditors: code4eat awesomedema@gmail.com
- * @LastEditTime: 2023-10-12 09:38:06
+ * @LastEditTime: 2023-10-26 10:59:52
  * @FilePath: /BudgetManaSystem/src/app.ts
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -15,13 +15,13 @@
 
 
 import { AxiosResponse, history } from '@umijs/max';
-import { message, notification } from 'antd';
+import { message, notification, Modal } from 'antd';
 import type { RequestConfig } from 'umi';
 
 import iconEnum from './menuIcons.js';
 
 // import Report from './pages/reports/index';
-// import Static from './pages/static/index';
+import Static from './pages/static/index';
 
 
 import DevicePixelRatio from './utils/devicePixelRatio.js';
@@ -95,7 +95,7 @@ export const request: RequestConfig = {
     // 错误抛出
     errorThrower: (res: ResponseStructure) => {
       const { success, data, errorCode, errorMessage, showType } = res;
-      //console.log({success, data, errorCode, errorMessage, showType});
+      console.log({ success, data, errorCode, errorMessage, showType });
       if (!success) {
         const error: any = new Error(errorMessage);
         error.name = 'BizError';
@@ -106,47 +106,7 @@ export const request: RequestConfig = {
     // 错误接收及处理
     errorHandler: (error: any, opts: any) => {
       if (opts?.skipErrorHandler) throw error;
-      // 我们的 errorThrower 抛出的错误。
-      if (error.name === 'BizError') {
-        const errorInfo: ResponseStructure | undefined = error.info;
-        if (errorInfo) {
-          const { errorMessage, errorCode } = errorInfo;
-          switch (errorInfo.showType) {
-            case ErrorShowType.SILENT:
-              // do nothing
-              break;
-            case ErrorShowType.WARN_MESSAGE:
-              message.warning(errorMessage);
-              break;
-            case ErrorShowType.ERROR_MESSAGE:
-              message.error(errorMessage);
-              break;
-            case ErrorShowType.NOTIFICATION:
-              notification.open({
-                description: errorMessage,
-                message: errorCode,
-              });
-              break;
-            case ErrorShowType.REDIRECT:
-              // TODO: redirect
-              break;
-            default:
-              message.error(errorMessage);
-          }
-        }
-      } else if (error.response) {
-        // Axios 的错误
-        // 请求成功发出且服务器也响应了状态码,但状态代码超出了 2xx 的范围
-        message.error(`Response status:${error.response.status}`);
-      } else if (error.request) {
-        // 请求已经成功发起,但没有收到响应
-        // \`error.request\` 在浏览器中是 XMLHttpRequest 的实例,
-        // 而在node.js中是 http.ClientRequest 的实例
-        message.error('None response! Please retry.');
-      } else {
-        // 发送请求时出了点问题
-        message.error('Request error, please retry.');
-      }
+
     },
 
   },
@@ -166,14 +126,26 @@ export const request: RequestConfig = {
   responseInterceptors: [
     (response: AxiosResponse) => {
       // 拦截响应数据,进行个性化处理
-
-      const { status, data: { status: code, errorMessage,msg }, config: { method } } = response;
+      const { status, data: { status: code, errorMessage, msg }, config: { method } } = response;
 
       try {
 
         if (status == 200) {
           // 网络请求成功
 
+          if (errorMessage && errorMessage.indexOf('Token') != -1) {
+            Modal.error({
+              title: '登陆已过期,请重新登录!',
+              okText: '确定',
+              onOk(...args) {
+                localStorage.removeItem('userData');
+              },
+            });
+
+            return false;
+          }
+
+
           if (method == 'post') {
 
             if (code == 200) {
@@ -186,7 +158,7 @@ export const request: RequestConfig = {
             } else {
               notification.error({
                 message: '',
-                description: errorMessage||msg,
+                description: errorMessage || msg,
                 placement: 'topRight',
                 icon: <></>
               })
@@ -204,7 +176,7 @@ export const request: RequestConfig = {
 
                 notification.error({
                   message: '',
-                  description: errorMessage||msg,
+                  description: errorMessage || msg,
                   placement: 'topRight',
                   icon: <></>
                 })
@@ -280,6 +252,45 @@ const reportCheck = () => {
 
 
 
+export function patchClientRoutes({ routes }: { routes: any }) {
+  console.log({routes});
+  const treeLoop = (treeData: any) => {
+
+    if (treeData.routes) {
+      // const paths = [...new Array(100).keys()].map((a, index) => ({
+      //   path: `${treeData.path == '/' ? '' : treeData.path}/reports/${index}`,
+      //   exact: true,
+      //   component: require('@/pages/platform/setting/reports/index.tsx').default,
+      // }));
+
+      const lanhuPagePaths = [...new Array(5).keys()].map((a, index) => ({
+        path: `${treeData.path == '/' ? '' : treeData.path}/static`,
+        exact: true,
+        element: <Static />,
+      }));
+
+      //console.log({paths});
+
+      // paths.forEach((a: any) => {
+      //   treeData.routes.push(a);
+      // });
+
+      lanhuPagePaths.forEach((a: any) => {
+        treeData.routes.push(a);
+      });
+      console.log({treeData});
+    }
+    if (treeData.routes && treeData.routes.length > 0) {
+      treeData.routes.forEach((a: any) => {
+        treeLoop(a);
+      })
+    }
+
+  }
+
+  treeLoop(routes[0]);
+}
+
 
 //布局配置
 
@@ -336,12 +347,10 @@ export const layout = ({ initialState, setInitialState }: { initialState: any, s
           const { menuId } = JSON.parse(currentSelectedTab);
           const systemId = menuId;
           const data: any[] = await getPlatformMenu(systemId);
-
           if (data) {
 
             const selectedKeys = localStorage.getItem('selectedKeys');
             const openKeys = localStorage.getItem('openKeys');
-
             if (selectedKeys && openKeys) {
               const _selectedKeys = JSON.parse(selectedKeys);
               const _openKeys = JSON.parse(openKeys);
@@ -369,42 +378,78 @@ export const layout = ({ initialState, setInitialState }: { initialState: any, s
             }
 
 
+            function processMenuItem(item: any) {
+              if (!item) return null;
+
+              let newItem = { ...item };  // 深拷贝当前节点
+
+              // 如果是叶子节点
+              if (!item.children || item.children.length === 0) {
+                let queryParams = [];
+
+                if (newItem.softUrl) {
+                  queryParams.push(`softUrl=${newItem.softUrl}`);
+                }
+
+                if (newItem.youshuUrl) {
+                  queryParams.push(`youshuUrl=${newItem.youshuUrl}`);
+                }
 
-            const getVFromTree = (data: any[], key: string) => {
-              let result: any[] = [];
-              function looper(data: any[], key: string) {
-                data.forEach((t) => {
-                  if (t[key] && t[key] != 0) {
-                    //非一般页面
-                    if (t[key] == 1 || t[key] == 2 || t[key] == 3) {
-                      //网易有数页面
-                      result.push({
-                        contentType: t[key],
-                        path: t['path'],
-                        reportId: t['reportId'],
-                        url: t['youshuUrl'],
-                      });
-                    }
-                    if (t[key] == 5) {
-                      result.push({
-                        contentType: t[key],
-                        path: t['path'],
-                        reportId: t['reportId'],
-                        url: t['softUrl'],
-                      });
-                    }
-
-                  }
-                  if (t.children && t.children.length > 0) {
-                    looper(t.children, key);
-                  }
-                });
+                if (queryParams.length > 0) {
+                  newItem.path = `${newItem.path}?${queryParams.join('&')}`;
+                }
+
+                return newItem; // 返回新的叶子节点
               }
-              looper(data, key);
-              return result;
-            };
 
-            const _menu = getVFromTree(data, 'contentType');
+              // 否则,递归处理子节点
+              newItem.children = newItem.children.map(processMenuItem);
+              return newItem;
+            }
+
+            function processMenu(menuArray: any[]) {
+              if (!menuArray) return [];
+              return menuArray.map(processMenuItem);
+            }
+
+            const _menu = processMenu(data);
+
+            console.log({ _menu });
+            // const getVFromTree = (data: any[], key: string) => {
+            //   let result: any[] = [];
+            //   function looper(data: any[], key: string) {
+            //     data.forEach((t) => {
+            //       if (t[key] && t[key] != 0) {
+            //         //非一般页面
+            //         if (t[key] == 1 || t[key] == 2 || t[key] == 3) {
+            //           //网易有数页面
+            //           result.push({
+            //             contentType: t[key],
+            //             path: t['path'],
+            //             reportId: t['reportId'],
+            //             url: t['youshuUrl'],
+            //           });
+            //         }
+            //         if (t[key] == 5) {
+            //           result.push({
+            //             contentType: t[key],
+            //             path: t['path'],
+            //             reportId: t['reportId'],
+            //             url: t['softUrl'],
+            //           });
+            //         }
+
+            //       }
+            //       if (t.children && t.children.length > 0) {
+            //         looper(t.children, key);
+            //       }
+            //     });
+            //   }
+            //   looper(data, key);
+            //   return result;
+            // };
+
+            // const _menu = getVFromTree(data, 'contentType');
 
 
             setInitialState((t: any) => ({ ...t, spacicalPageParamsType: _menu, memuData: data, userData: JSON.parse(userData as string) }));
@@ -421,26 +466,26 @@ export const layout = ({ initialState, setInitialState }: { initialState: any, s
                 if (node.path == '/setting') {
                   node.icon = <Icon component={setting} />;
                 }
-                
+
               }
               if (node.children) {
                 node.children.forEach((child: any) => addIconToPath(child, paths));
               }
             }
 
-            data.forEach((item: any) => {
+            _menu.forEach((item: any) => {
               addIconToPath(item, ['/home', '/baseInfoMana', '/setting',]);
             });
 
 
 
-            return data
+            return _menu
           }
         }
 
       },
     },
-    onPageChange: () => {},
+    onPageChange: () => { },
     collapsedButtonRender: () => {
       return (
         <div style={{
@@ -455,6 +500,7 @@ export const layout = ({ initialState, setInitialState }: { initialState: any, s
       )
     },
     collapsed: isCollapsed,
+    // fixSiderbar:false,
     contentStyle: {
       border: '16px solid #F7F9FC',
       //height: '94.5vh',  //以去除顶部导航高度

+ 141 - 141
src/global.less

@@ -26,7 +26,7 @@ body {
 
 
 
-.pfm-ant-space-item {
+.cost-ant-space-item {
     &>a {
         color: #3377FF !important;
     }
@@ -39,22 +39,22 @@ textarea {
     border: 1px solid #CFD7E6 !important;
 }
 
-.pfm-ant-btn-primary {
+.cost-ant-btn-primary {
     background: #3377FF;
 }
-.pfm-ant-btn-primary[disabled]{
+.cost-ant-btn-primary[disabled]{
     background:#f5f5f5 ;
 }
 
-.pfm-ant-checkbox {
-    &.pfm-ant-checkbox-checked {
-          .pfm-ant-checkbox-inner {
+.cost-ant-checkbox {
+    &.cost-ant-checkbox-checked {
+          .cost-ant-checkbox-inner {
             background-color:#3377FF;
             background: #3377FF;
           }
     }
-    // &.pfm-ant-checkbox-indeterminate {
-    //     &.pfm-ant-checkbox-inner {
+    // &.cost-ant-checkbox-indeterminate {
+    //     &.cost-ant-checkbox-inner {
     //         &::after {
     //             background-color:#3377FF !important;
     //         }
@@ -62,15 +62,15 @@ textarea {
     // }
 }
 
-.pfm-ant-checkbox-indeterminate .pfm-ant-checkbox-inner::after {
+.cost-ant-checkbox-indeterminate .cost-ant-checkbox-inner::after {
     background-color:#3377FF;
 }
 
-.pfm-ant-input-affix-wrapper {
+.cost-ant-input-affix-wrapper {
     border-radius: 4px !important;
 }
 
-.pfm-ant-input {
+.cost-ant-input {
     border-radius: 4px;
     // border: 1px solid #CFD7E6 !important;
     &::placeholder {
@@ -78,13 +78,13 @@ textarea {
     }
 }
 
-.pfm-ant-table-cell {
+.cost-ant-table-cell {
     a {
         color: #3376FE !important;
     }
 }
 
-.pfm-ant-input-number {
+.cost-ant-input-number {
     border-radius: 4px !important;
 }
 
@@ -95,29 +95,29 @@ textarea {
 
 //Modal
 
-.pfm-ant-modal {
-    .pfm-ant-modal-content {
+.cost-ant-modal {
+    .cost-ant-modal-content {
         padding: 16px !important;
         border-radius: 4px !important;
-        .pfm-ant-modal-header {
+        .cost-ant-modal-header {
              padding: 0 ;
              margin-bottom: 16px;
              border-bottom: none;
         }
-        .pfm-ant-modal-body {
+        .cost-ant-modal-body {
             max-height: 570px;
             // overflow-y: scroll;
             // overflow-x: hidden;
             padding: 0;
 
-            .pfm-ant-modal-confirm-body-wrapper {
-                .pfm-ant-modal-confirm-body {
-                    .pfm-ant-modal-confirm-title {
+            .cost-ant-modal-confirm-body-wrapper {
+                .cost-ant-modal-confirm-body {
+                    .cost-ant-modal-confirm-title {
                         font-size: 16px;
                         height:18px;
                       
                     }
-                    .pfm-ant-modal-confirm-content {
+                    .cost-ant-modal-confirm-content {
                         max-width: 100% !important;
                         max-height: 498px;
                         overflow-y: scroll;
@@ -125,7 +125,7 @@ textarea {
                         margin-block-start:16px;
 
                         .TableTransfer {
-                            .pfm-ant-transfer-operation {
+                            .cost-ant-transfer-operation {
                                 //   align-self: self-end;
                                 //   margin-bottom: 30px;
 
@@ -139,11 +139,11 @@ textarea {
                                 }
                             }
 
-                            .pfm-ant-transfer-list {
+                            .cost-ant-transfer-list {
                                 overflow: hidden;
                                 border: 1px solid #DAE2F2;
 
-                                .pfm-ant-transfer-list-header {
+                                .cost-ant-transfer-list-header {
                                     height: 32px;
                                     font-size: 12px;
                                     border-bottom: 1px solid #DAE2F2;
@@ -152,24 +152,24 @@ textarea {
                                         color: #99A6BF;
                                     }
 
-                                    .pfm-ant-transfer-list-header-selected {
+                                    .cost-ant-transfer-list-header-selected {
                                         color: #515866;
                                     }
                                 }
 
-                                .pfm-ant-transfer-list-body {
-                                    .pfm-ant-transfer-list-body-search-wrapper {
+                                .cost-ant-transfer-list-body {
+                                    .cost-ant-transfer-list-body-search-wrapper {
                                         padding: 8px;
 
-                                        .pfm-ant-input-prefix {
+                                        .cost-ant-input-prefix {
                                             .anticon-search {
                                                 color: #99A6BF;
                                             }
                                         }
                                     }
 
-                                    .pfm-ant-transfer-list-body-customize-wrapper {
-                                        .pfmTable {
+                                    .cost-ant-transfer-list-body-customize-wrapper {
+                                        .costTable {
                                             border: none !important;
                                             border-radius: 0 !important;
                                         }
@@ -179,10 +179,10 @@ textarea {
 
 
 
-                            .pfm-ant-table {
-                                .pfm-ant-table-container {
-                                    .pfm-ant-table-content {
-                                        .pfm-ant-table-thead {
+                            .cost-ant-table {
+                                .cost-ant-table-container {
+                                    .cost-ant-table-content {
+                                        .cost-ant-table-thead {
 
                                             &>tr>th {
                                                 font-size: 14px;
@@ -197,7 +197,7 @@ textarea {
 
                                         }
 
-                                        .pfm-ant-table-tbody {
+                                        .cost-ant-table-tbody {
                                             &>tr>td {
                                                 padding-left: 8px !important;
                                                 padding-right: 8px !important;
@@ -210,7 +210,7 @@ textarea {
                     }
                 }
 
-                .pfm-ant-modal-confirm-btns {
+                .cost-ant-modal-confirm-btns {
                     display: flex;
                     flex-direction: row;
                     align-items: center;
@@ -225,23 +225,23 @@ textarea {
                         height: 24px;
                         border-radius: 4px;
 
-                        &.pfm-ant-btn-default {
+                        &.cost-ant-btn-default {
                             border: 1px solid #DAE2F2;
                             background-color: #FAFCFF;
                         }
 
-                        &.pfm-ant-btn-primary {
+                        &.cost-ant-btn-primary {
                             background-color: #3376FE;
                         }
                     }
                 }
             }
         }
-        .pfm-ant-modal-footer {
+        .cost-ant-modal-footer {
             border-top: none;
             padding: 0;
             margin-top: 16px;
-            .pfm-ant-btn {
+            .cost-ant-btn {
                  border-radius: 4px !important;
                  height: 24px !important;
                  padding: 0 14px !important;
@@ -249,10 +249,10 @@ textarea {
         }
     }
 
-    .pfm-ant-modal-footer {
+    .cost-ant-modal-footer {
         margin-top: 0;
 
-        .pfm-ant-space-item {
+        .cost-ant-space-item {
             &>button {
                 display: flex;
                 justify-content: center;
@@ -264,12 +264,12 @@ textarea {
 
                 &>span {}
 
-                &.pfm-ant-btn-default {
+                &.cost-ant-btn-default {
                     border: 1px solid #DAE2F2;
                     background-color: #FAFCFF;
                 }
 
-                &.pfm-ant-btn-primary {
+                &.cost-ant-btn-primary {
                     background-color: #3376FE;
                 }
             }
@@ -281,9 +281,9 @@ textarea {
 
 //message
 
-.pfm-ant-message {
+.cost-ant-message {
     .ant-message-notice-success {
-        .pfm-ant-message-notice-content {
+        .cost-ant-message-notice-content {
             .anticon-check-circle {
                 &>svg {
                     color: #52c41a;
@@ -295,19 +295,19 @@ textarea {
 
 //Form
 
-.pfm-ant-form {
-    &.pfm-ant-form-vertical {
-        .pfm-ant-form-item {
+.cost-ant-form {
+    &.cost-ant-form-vertical {
+        .cost-ant-form-item {
             margin-bottom: 16px;
 
-            .pfm-ant-form-item-label {
+            .cost-ant-form-item-label {
                 padding: 0 !important;
                 height: 15px;
                 margin-bottom: 8px;
                 line-height: 15px;
             }
 
-            .pfm-ant-form-item-control-input {
+            .cost-ant-form-item-control-input {
                 min-height: 24px;
             }
         }
@@ -317,20 +317,20 @@ textarea {
 
 
 
-// .pfm-ant-form-item-label {
+// .cost-ant-form-item-label {
 //     padding: 0;
 //     //height: 15px;
 //     line-height: 15px;
 //     margin-bottom: 5px;
 
-//     .pfm-ant-form-item-required {
+//     .cost-ant-form-item-required {
 //       &::before {
 //         margin-right: 0 !important;
 //       }
 //     }
 // }
 
-.pfm-ant-input-affix-wrapper {
+.cost-ant-input-affix-wrapper {
     padding: 0px 8px !important;
     border-radius: 4px;
     border: 1px solid #CFD7E6 !important;
@@ -345,84 +345,84 @@ textarea {
     }
 }
 
-.pfm-ant-input-disabled {
+.cost-ant-input-disabled {
     &::placeholder {
         color: #7A8599 !important;
     }
 }
 
-.pfm-ant-input-affix-wrapper-disabled {
+.cost-ant-input-affix-wrapper-disabled {
     background: #F0F2F5 !important;
 }
 
 
 // //proContsiner 标题样式覆盖
-// .pfm-ant-page-header .pfm-ant-page-header-heading-title {
+// .cost-ant-page-header .cost-ant-page-header-heading-title {
 //      height: 17px !important;
 //      font-size: 16px !important;
 //      line-height: 17px !important;
 // }
 
-.pfm-ant-page-header {
-    .pfm-ant-page-header-heading-title {
+.cost-ant-page-header {
+    .cost-ant-page-header-heading-title {
          font-size: 16px !important;
     }
 }
 
-.pfm-ant-page-header .pfm-ant-page-header-heading-left {
+.cost-ant-page-header .cost-ant-page-header-heading-left {
     margin-block: 0 !important;
 }
 
 
-.pfm-ant-pro .pfm-ant-pro-layout .pfm-ant-pro-sider-fixed {
+.cost-ant-pro .cost-ant-pro-layout .cost-ant-pro-sider-fixed {
     position: absolute !important;
     // min-width:230px !important;
     // width: 230px !important;
 }
 
 //避免logo区域的层级过高,影响父容器
-.pfm-ant-pro .pfm-ant-pro-layout .pfm-ant-pro-sider-fixed {
+.cost-ant-pro .cost-ant-pro-layout .cost-ant-pro-sider-fixed {
     height: calc(100vh - 48px) !important;
     z-index: 0 !important;
 }
 
 
-.pfm-ant-pro-base-menu .pfm-ant-pro-base-menu-submenu-has-icon >.pfm-ant-menu-sub {
+.cost-ant-pro-base-menu .cost-ant-pro-base-menu-submenu-has-icon >.cost-ant-menu-sub {
     padding-inline-start:0 !important;
 }
 
 
 
-.pfm-ant-menu-item-selected {
+.cost-ant-menu-item-selected {
     background-color:#F2F6FF !important;
     &:hover {
          color: #3376FE !important; 
     }
 }
-.pfm-ant-menu-light:not(.pfm-ant-menu-horizontal) .pfm-ant-menu-item:not(.pfm-ant-menu-item-selected):hover {
+.cost-ant-menu-light:not(.cost-ant-menu-horizontal) .cost-ant-menu-item:not(.cost-ant-menu-item-selected):hover {
     background-color: #f0f2f5 !important;
 }
 
-.pfm-ant-menu-light:not(.pfm-ant-menu-horizontal) .pfm-ant-menu-submenu-title:hover {
+.cost-ant-menu-light:not(.cost-ant-menu-horizontal) .cost-ant-menu-submenu-title:hover {
     background-color: #f0f2f5 !important;
 }
 
-.pfm-ant-tree.pfm-ant-tree-directory .pfm-ant-tree-treenode:hover::before {
+.cost-ant-tree.cost-ant-tree-directory .cost-ant-tree-treenode:hover::before {
     background: #f0f2f5 !important;
     border-radius: 4px;
 }
 
-.pfm-EditableProTable {
-    .pfm-ant-pro-card-body {
+.cost-EditableProTable {
+    .cost-ant-pro-card-body {
         padding-inline: 0 !important;
         padding-block: 0 !important;
 
-        .pfm-ant-table {
+        .cost-ant-table {
             border: 1px solid #CFD7E6 !important;
             overflow: hidden;
 
-            .pfm-ant-table-content {
-                .pfm-ant-table-thead {
+            .cost-ant-table-content {
+                .cost-ant-table-thead {
                     &>tr>th {
 
                         height: 15px;
@@ -442,9 +442,9 @@ textarea {
                     }
                 }
 
-                .pfm-ant-table-tbody {
-                    .pfm-ant-table-row {
-                        .pfm-ant-table-cell {
+                .cost-ant-table-tbody {
+                    .cost-ant-table-row {
+                        .cost-ant-table-cell {
 
                             height: 15px;
                             line-height: 15px;
@@ -470,16 +470,16 @@ textarea {
     }
 }
 
-.pfm-ant-table-wrapper {
-    .pfm-ant-table:not(.pfm-ant-table-bordered) .pfm-ant-table-tbody>tr.pfm-ant-table-row.pfm-ant-table-row-selected>td:first-child {
+.cost-ant-table-wrapper {
+    .cost-ant-table:not(.cost-ant-table-bordered) .cost-ant-table-tbody>tr.cost-ant-table-row.cost-ant-table-row-selected>td:first-child {
         border-radius: 0 !important;
     }
 
-    .pfm-ant-table-content {
-        .pfm-ant-table-thead {
+    .cost-ant-table-content {
+        .cost-ant-table-thead {
             tr {
                 &:last-child {
-                    .pfm-ant-table-cell {
+                    .cost-ant-table-cell {
                         // border-top: 1px solid #dae2f2;
                     }
                 }
@@ -488,31 +488,31 @@ textarea {
     }
 }
 
-.pfm-ant-table-wrapper .pfm-ant-table:not(.pfm-ant-table-bordered) .pfm-ant-table-tbody>tr.pfm-ant-table-row:hover>td:first-child {
+.cost-ant-table-wrapper .cost-ant-table:not(.cost-ant-table-bordered) .cost-ant-table-tbody>tr.cost-ant-table-row:hover>td:first-child {
     border-start-start-radius: 0 !important;
     border-end-start-radius: 0 !important;
 }
 
-.pfm-ant-table-wrapper .pfm-ant-table:not(.pfm-ant-table-bordered) .pfm-ant-table-tbody>tr.pfm-ant-table-row:last-child:hover>td {
+.cost-ant-table-wrapper .cost-ant-table:not(.cost-ant-table-bordered) .cost-ant-table-tbody>tr.cost-ant-table-row:last-child:hover>td {
     border-bottom-color: #dae2f2 !important;
 }
 
-.pfm-ant-table-wrapper .pfm-ant-table:not(.pfm-ant-table-bordered) .pfm-ant-table-tbody>tr.pfm-ant-table-row:last-child>td {
+.cost-ant-table-wrapper .cost-ant-table:not(.cost-ant-table-bordered) .cost-ant-table-tbody>tr.cost-ant-table-row:last-child>td {
     border-bottom-color: #dae2f2 !important;
 }
 
 
-.pfm-ant-table-wrapper .pfm-ant-table:not(.pfm-ant-table-bordered) .pfm-ant-table-tbody>tr.pfm-ant-table-row:hover>td:last-child {
+.cost-ant-table-wrapper .cost-ant-table:not(.cost-ant-table-bordered) .cost-ant-table-tbody>tr.cost-ant-table-row:hover>td:last-child {
     border-end-end-radius: 0 !important;
     border-start-end-radius: 0 !important;
 }
 
 
-.pfm-ant-pro .pfm-ant-pro-layout .pfm-ant-pro-layout-bg-list {
+.cost-ant-pro .cost-ant-pro-layout .cost-ant-pro-layout-bg-list {
     background: #F7F9FC !important;
 }
 
-// .pfm-ant-message-notice .pfm-ant-message-success .anticon {
+// .cost-ant-message-notice .cost-ant-message-success .anticon {
 //     color: #52c41a !important;
 // }
 .ant-message-success {
@@ -525,22 +525,22 @@ textarea {
 /**
     Select
 **/
-.pfm-ant-select {
-    .pfm-ant-select-selector {
+.cost-ant-select {
+    .cost-ant-select-selector {
         height: 24px !important;
         padding: 0 8px !important;
         border-radius: 4px !important;
         border: 1px solid #CFD7E6 !important;
 
-        .pfm-ant-select-selection-item {
+        .cost-ant-select-selection-item {
             line-height: 24px !important;
         }
 
-        .pfm-ant-select-selection-search-input {
+        .cost-ant-select-selection-search-input {
             height: 24px !important;
         }
 
-        .pfm-ant-select-selection-placeholder {
+        .cost-ant-select-selection-placeholder {
             line-height: 22px !important;
             font-size: 14px;
             font-family: SourceHanSansCN-Normal, SourceHanSansCN;
@@ -548,9 +548,9 @@ textarea {
             color: #99A6BF;
         }
 
-        .pfm-ant-select-selection-overflow {
-            .pfm-ant-select-selection-overflow-item {
-                .pfm-ant-select-selection-item {
+        .cost-ant-select-selection-overflow {
+            .cost-ant-select-selection-overflow-item {
+                .cost-ant-select-selection-item {
                     height: 22px !important;
                     line-height: 22px !important;
                     margin-top: 0 !important;
@@ -560,20 +560,20 @@ textarea {
         }
     }
 
-    .pfm-ant-select-arrow {
+    .cost-ant-select-arrow {
         color: #CFD7E6;
     }
 
-    &.pfm-ant-select-disabled {
-        .pfm-ant-select-selector {
+    &.cost-ant-select-disabled {
+        .cost-ant-select-selector {
             border: 1px solid #DADEE6 !important;
 
-            .pfm-ant-select-selection-placeholder {
+            .cost-ant-select-selection-placeholder {
                 color: #7A8599;
             }
         }
 
-        .pfm-ant-select-arrow {
+        .cost-ant-select-arrow {
             color: #7A8599;
         }
     }
@@ -583,12 +583,12 @@ textarea {
 
 
 
-.pfm-ant-tabs {
-    .pfm-ant-tabs-tab {
+.cost-ant-tabs {
+    .cost-ant-tabs-tab {
         padding: 5px 0 !important;
         padding-top: 12px !important;
     }
-    .pfm-ant-tabs-nav {
+    .cost-ant-tabs-nav {
         &::before {
             border-bottom: none !important;
         }
@@ -598,58 +598,58 @@ textarea {
 
 
 
-.pfm-ant-table-wrapper {
+.cost-ant-table-wrapper {
     overflow: hidden;
 }
 
 
 
-.pfm-ant-pro-layout .pfm-ant-pro-layout-container {
+.cost-ant-pro-layout .cost-ant-pro-layout-container {
     flex: 1;
     background: #F7F9FC !important;
 }
 
 //页面全局底色
-.pfm-ant-pro .pfm-ant-pro-layout .pfm-ant-pro-layout-bg-list {
+.cost-ant-pro .cost-ant-pro-layout .cost-ant-pro-layout-bg-list {
     background: rgb(247 249 252 / 100%);
 }
 
-.pfm-ant-pro-page-container-children-content {
+.cost-ant-pro-page-container-children-content {
     padding-inline: 0 !important;
 }
 
-.pfm-ant-pro-sider-actions {
+.cost-ant-pro-sider-actions {
     display: none !important;
 }
 
 
-.pfm-ant-pro-sider-collapsed-button {
+.cost-ant-pro-sider-collapsed-button {
     top: 95% !important;
     right: 17px !important;
 }
 
 
-.pfm-ant-menu .pfm-ant-menu-submenu-title .anticon {
+.cost-ant-menu .cost-ant-menu-submenu-title .anticon {
     transition: none !important;
 }
 
-.pfm-ant-menu .pfm-ant-menu-item .anticon+span {
+.cost-ant-menu .cost-ant-menu-item .anticon+span {
     transition: none !important;
 }
 
-.pfm-ant-menu .pfm-ant-menu-item .anticon {
+.cost-ant-menu .cost-ant-menu-item .anticon {
     transition: none !important;
 }
 
-.pfm-ant-menu .pfm-ant-menu-item {
+.cost-ant-menu .cost-ant-menu-item {
     transition: none !important;
 }
 
-.pfm-ant-menu .pfm-ant-menu-submenu-title .anticon+span {
+.cost-ant-menu .cost-ant-menu-submenu-title .anticon+span {
     transition: none !important;
 }
 
-.pfm-ant-tabs .pfm-ant-tabs-tab+.pfm-ant-tabs-tab {
+.cost-ant-tabs .cost-ant-tabs-tab+.cost-ant-tabs-tab {
     margin: 0 0 0 24px !important;
 }
 
@@ -662,99 +662,99 @@ textarea {
 }
 
 
-.pfm-ant-pro-form>div:not(.pfm-ant-pro-form-light-filter) .pro-field-lg {
+.cost-ant-pro-form>div:not(.cost-ant-pro-form-light-filter) .pro-field-lg {
     width: 100% !important;
 }
 
-.pfm-ant-select {
-    .pfm-ant-select-selector {
+.cost-ant-select {
+    .cost-ant-select-selector {
         border: 1px solid #CFD7E6 !important;
         // color: #99A6BF !important;
 
-        .pfm-ant-select-selection-placeholder {
+        .cost-ant-select-selection-placeholder {
             color: #99A6BF !important;
         }
     }
 
-    .pfm-ant-select-arrow {
+    .cost-ant-select-arrow {
         color: #99A6BF !important;
     }
 }
 
 
-.pfm-ant-input-number-input {
+.cost-ant-input-number-input {
     border-radius: 4px;
     &::placeholder {
         color: #99A6BF !important;
     }
 }
 
-.pfm-ant-select-disabled {
-    .pfm-ant-select-selector {
+.cost-ant-select-disabled {
+    .cost-ant-select-selector {
         border: 1px solid #DADEE6 !important;
         background: #F0F2F5 !important;
 
-        .pfm-ant-select-selection-placeholder {
+        .cost-ant-select-selection-placeholder {
             color: #7A8599 !important;
         }
     }
 
-    .pfm-ant-select-arrow {
+    .cost-ant-select-arrow {
         color: #7A8599 !important;
     }
 }
 
 
 
-.pfm-ant-input-number {
+.cost-ant-input-number {
     border: 1px solid #CFD7E6 !important;
     // color: #99A6BF !important;
     border-radius: 4px;
     box-shadow: none !important;
-    .pfm-ant-input-number-input {
+    .cost-ant-input-number-input {
         height: 22px !important;
         line-height: 22px !important;
     }
 }
 
-.pfm-ant-input-number-disabled {
+.cost-ant-input-number-disabled {
     border: 1px solid #DADEE6 !important;
     background: #F0F2F5 !important;
 
-    .pfm-ant-input-number-input {
+    .cost-ant-input-number-input {
         color: #7A8599 !important;
     }
 }
 
-.pfm-ant-input-affix-wrapper-disabled {
+.cost-ant-input-affix-wrapper-disabled {
     border: 1px solid #DADEE6 !important;
 }
 
-.pfm-ant-picker {
+.cost-ant-picker {
     border-radius: 4px !important;
     border: 1px solid #CFD7E6 !important;
     height: 24px;
-    .pfm-ant-picker-input {
+    .cost-ant-picker-input {
         &>input {
              &::placeholder {
                 color:#99A6BF !important;
              }
         }
-        .pfm-ant-picker-suffix {
+        .cost-ant-picker-suffix {
             color:#99A6BF !important;
         }
     }
 }
 
-.pfm-ant-picker-panel-container {
-    .pfm-ant-picker-panel {
-        .pfm-ant-picker-month-panel {
-            .pfm-ant-picker-body {
-                .pfm-ant-picker-content {
+.cost-ant-picker-panel-container {
+    .cost-ant-picker-panel {
+        .cost-ant-picker-month-panel {
+            .cost-ant-picker-body {
+                .cost-ant-picker-content {
                     tr {
                         td {
-                            &.pfm-ant-picker-cell-selected {
-                                .pfm-ant-picker-cell-inner {
+                            &.cost-ant-picker-cell-selected {
+                                .cost-ant-picker-cell-inner {
                                     background:#3377FF;
                                 }
                             }
@@ -766,11 +766,11 @@ textarea {
     }
 }
 
-.pfm-ant-picker-input>input[disabled] {
+.cost-ant-picker-input>input[disabled] {
     color: #7A8599 !important;
 }
 
-.pfm-ant-picker-disabled {
+.cost-ant-picker-disabled {
     background: #F0F2F5 !important;
     border: 1px solid #DADEE6 !important;
 

+ 327 - 0
src/pages/baseSetting/otherItemSet/reportItemSet/index.tsx

@@ -0,0 +1,327 @@
+/*
+ * @Author: code4eat awesomedema@gmail.com
+ * @Date: 2023-03-03 11:30:33
+ * @LastEditors: code4eat awesomedema@gmail.com
+ * @LastEditTime: 2023-10-24 14:39:32
+ * @FilePath: /KC-MiddlePlatform/src/pages/platform/setting/pubDicTypeMana/index.tsx
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+
+import { createFromIconfontCN } from '@ant-design/icons';
+
+import { ModalForm, ProFormText } from '@ant-design/pro-form';
+
+import { message, Tabs, Popconfirm } from 'antd';
+import { useEffect, useRef, useState } from 'react';
+
+import { addData, delData, editData, getData, getTabs } from './service';
+
+import './style.less';
+
+import KCIMPagecontainer from '@/components/KCIMPageContainer';
+import { KCIMTable } from '@/components/KCIMTable';
+import KCIMDrawerForm from '@/components/KCIMDrawerForm';
+import { set } from 'lodash';
+import { ProFormDependency, ProFormDigit, ProFormInstance, ProFormRadio, ProFormSelect } from '@ant-design/pro-components';
+import { getTargetDic } from '@/services/auth';
+// import TableTransfer from './transform';
+// import TableSelecter from './tableSelector';
+// import { getCheckData } from '../checkGroupMana/service';
+
+const IconFont = createFromIconfontCN({
+  scriptUrl: '',
+});
+
+export default function reportItemSet() {
+
+  const tableRef = useRef();
+  const [tabs, set_tabs] = useState<any[]>([]);
+
+
+  const [currentEdit, set_currentEdit] = useState<any|undefined>(undefined);
+  const [tableData, set_tableData] = useState<any[]>([]);
+  const [currentTab, set_currentTab] = useState<any|undefined>(undefined);
+
+  const columns = [
+    {
+      title: '报表项目名称',
+      dataIndex: 'columnName',
+    },
+    {
+      title: '报表项目代码',
+      dataIndex: 'columnCode',
+    },
+    {
+      title: '计算方式',
+      dataIndex: 'computeTypeName',
+    },
+    {
+      title: '计算来源',
+      dataIndex: 'computeSourceName',
+    },
+    {
+      title: '序号',
+      dataIndex: 'sort',
+    },
+    {
+      title: '下钻界面',
+      dataIndex: 'redirectName',
+    },
+    {
+      title: '操作',
+      dataIndex: 'option',
+      valueType: 'option',
+      width: '15%',
+      render: (_: any, record: { parentColumnCode: any,id:any }) => {
+        const { parentColumnCode } = record;
+        const delBtn = () => (
+          <Popconfirm
+            key={3}
+            title="是否确定删除?"
+            onConfirm={() => delTableData(record.id)}
+            okText="确定"
+            cancelText="取消"
+          >
+            <a key={3}>删除</a>
+          </Popconfirm>
+        );
+        return parentColumnCode == '0'
+          ? [
+              <UpDataActBtn key={1} record={record} type={'ADD'} />,
+              <UpDataActBtn key={2} record={record} type={'EDIT'} />,
+              delBtn()
+            ]
+          : [<a key={1}>编辑</a>, delBtn()];
+      },
+    },
+  ];
+
+  const getTableData = async (key: any) => {
+    const resp = await getData(key);
+    if (resp) {
+      set_tableData(resp.map((a:any) => ({ ...a, children: a.childColumns })));
+      //const columns = convertToColumnsFunc(title, true);
+    }
+  };
+
+  const delTableData = async (id: any) => {
+    const resp = await delData(id);
+    const { status } = resp;
+    if (status == 200) {
+      getTableData(currentTab.key);
+    }
+  };
+
+  const updateTable = async (formVal: { columnName: any; computeType: number; computeSource: any; parentColumnCode: any; sort: any; dataType: any; redirect: any; redirectParameter: any[]; id: any; }, type: string) => {
+  
+    try {
+      const result = {
+        reportCode: currentTab.key,
+        columnName: formVal.columnName,
+        computeType: formVal.computeType,
+        computeSource: formVal.computeType != 3 ? formVal.computeSource : 3,
+        parentColumnCode: formVal.computeType == 1 ? formVal.parentColumnCode : '',
+        sort: formVal.sort,
+        dataType: formVal.dataType,
+        redirect: formVal.redirect,
+        redirectParameter: formVal.redirectParameter?(formVal.redirectParameter instanceof Array)?formVal.redirectParameter.join(','):formVal.redirectParameter:'',
+      };
+
+      if (type == 'ADD') {
+        const resp = await addData({ ...result });
+        if (resp) {
+          getTableData(currentTab.key);
+        }
+      }
+      if (type == 'EDIT') {
+        const resp = await editData({ ...result, id: formVal.id });
+        if (resp) {
+          getTableData(currentTab.key);
+        }
+      }
+    } catch (e) {
+      console.log({ e });
+    }
+
+    return true;
+  };
+
+  const UpDataActBtn = ({ record, type}:{record:any, type:'ADD'|'EDIT'}) => {
+    const formRef = useRef<ProFormInstance<any>>();
+    return (
+      <ModalForm
+        title={`${type == 'EDIT' ? '编辑' :record?'添加':'新增'}报表`}
+        width={400}
+        initialValues={type == 'EDIT' ? { ...record,redirectParameter:record.redirectParameter?record.redirectParameter.split(','):[]} : { computeType: 1, dataType: 1 }}
+        trigger={type == 'EDIT' ? <a key="edit">编辑</a> : <a className="add" >{record?'添加':'新增'}</a>}
+        onFinish={(val) => {
+          set_currentEdit(undefined);
+          return updateTable(type == 'EDIT' ? { ...record, ...val,id:record.id } : { ...val,parentColumnCode:record?record.columnCode:'0' }, type);
+        }}
+        formRef={formRef}
+        modalProps={{ destroyOnClose: true }}
+      >
+        <ProFormText
+          name="columnName"
+          label="报表项目名称:"
+          placeholder="请输入"
+          rules={[{ required: true, message: '名称不能为空!' }]}
+        />
+        <ProFormSelect
+          name="computeType"
+          label="计算方式:"
+          options={[
+            { label: '对应成本项', value: 1 },
+            { label: '计算公式', value: 2 },
+            { label: '合计', value: 3 },
+          ]}
+          rules={[{ required: true, message: '计算方式不能为空!' }]}
+        />
+        <ProFormDependency name={['computeType']}>
+          {({ computeType }) => {
+            if (computeType == 1) {
+              return (
+                <ProFormSelect
+                  name="computeSource"
+                  label="报表项目类别:"
+                  request={async () => {
+                    const resp = await getTargetDic('REPORT_ITEM_TYPE');
+                    const { data, status } = resp;
+                    if (status == 200) {
+                      const { dataVoList } = data;
+                      return dataVoList.map((a:any) => {
+                        if(a.defaultValue&&type == 'ADD'){
+                            formRef.current?.setFieldValue('computeSource',a.code);
+                          }
+                          return { label: a.name, value: a.code }
+                      });
+                    }
+                    return [];
+                  }}
+                  rules={[{ required: true, message: '报表项目类别不能为空!' }]}
+                />
+              );
+            }
+            if (computeType == 2) {
+              return (
+                <ProFormText
+                  name="computeSource"
+                  label="计算公式:"
+                  placeholder="请输入"
+                  rules={[{ required: true, message: '名称不能为空!' }]}
+                />
+              );
+            }
+          }}
+        </ProFormDependency>
+
+        <ProFormDigit
+          name="sort"
+          label="序号:"
+          placeholder="请输入"
+          rules={[{ required: true, message: '序号不能为空!' }]}
+        />
+        <ProFormRadio.Group
+          name="dataType"
+          label="数据格式:"
+          options={[
+            { label: '数值', value: 1 },
+            { label: '百分比', value: 2 },
+          ]}
+          rules={[{ required: true }]}
+        />
+        <ProFormSelect
+          name="redirect"
+          label="下钻界面:"
+          request={async () => {
+            const resp = await getTargetDic('REPORT_REDIRECT_PATH');
+            const { data, status } = resp;
+            if (status == 200) {
+              const { dataVoList } = data;
+              return dataVoList.map((a:any) => {
+                  if(a.defaultValue&&type == 'ADD'){
+                    formRef.current?.setFieldValue('redirect',a.code);
+                  }
+                  return { label: a.name, value: a.code }
+              });
+            }
+            return [];
+          }}
+          rules={[{ required: true, message: '下钻界面不能为空!' }]}
+        />
+        <ProFormDependency name={['redirect']}>
+              {
+                ({redirect})=>{
+                      return redirect != '0'?(
+                        <ProFormSelect
+                        name="redirectParameter"
+                        label="下钻参数:"
+                        fieldProps={{mode:'multiple'}}
+                        request={async () => {
+                            const resp = await getTargetDic('REPORT_REDIRECT_PARAM');
+                            const { data, status } = resp;
+                            if (status == 200) {
+                            const { dataVoList } = data;
+                            return dataVoList.map((a:any) => {
+                                if(a.defaultValue&&type == 'ADD'){
+                                    formRef.current?.setFieldValue('redirectParameter',a.value?a.value.split(','):[]);
+                                }
+                                return { label: a.name, value: a.value }
+                            });
+                            }
+                            return [];
+                        }}
+                        rules={[{ required: true, message: '下钻参数不能为空!' }]}
+                        />
+                      ):null
+                }
+              }
+        </ProFormDependency>
+        
+      </ModalForm>
+    );
+  };
+
+
+  const getTabsReq = async () => {
+    const resp = await getTabs();
+    if (resp) {
+      set_tabs(resp.map((a: { code: any; name: any; }) => ({ key: a.code, label: a.name })));
+      set_currentTab({key:resp[0].code,label:resp[0].name});
+      getTableData(resp[0].code);
+    }
+  };
+
+  const onTabChanged = (key: any) => {
+    const needitem = tabs.filter((a: { key: any; }) => a.key == key);
+    set_currentTab(needitem[0]);
+    getTableData(key);
+  };
+
+
+
+  useEffect(() => {
+    getTabsReq();
+  }, []);
+
+  return (
+    <KCIMPagecontainer className="reportItemSet" title={false}>
+      <Tabs
+        defaultActiveKey={tabs.length > 0 ? tabs[0].key : undefined}
+        items={tabs}
+        key={'key'}
+        onChange={(key) => onTabChanged(key)}
+      />
+      <div className="toolBar">
+        <div className="filter"></div>
+        <div className="btnGroup">
+          {/* <a className='copy'>复制</a> */}
+          <UpDataActBtn record={undefined} type="ADD" />
+        </div>
+      </div>
+      <div>
+        <KCIMTable columns={columns} actionRef={tableRef} rowKey="id" dataSource={tableData} />
+      </div>
+    </KCIMPagecontainer>
+  );
+}

+ 69 - 0
src/pages/baseSetting/otherItemSet/reportItemSet/service.js

@@ -0,0 +1,69 @@
+/*
+ * @Author: code4eat awesomedema@gmail.com
+ * @Date: 2023-03-03 16:31:27
+ * @LastEditors: code4eat awesomedema@gmail.com
+ * @LastEditTime: 2023-10-19 16:43:53
+ * @FilePath: /KC-MiddlePlatform/src/pages/platform/setting/pubDicTypeMana/service.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+
+
+
+import { request } from 'umi';
+
+//获取table列表数据
+
+
+
+export const getData = (key) => {
+  return request('/costAccount/setting/getReportColumn', {
+    method: 'GET',
+    params:{reportCode:key}
+  });
+};
+
+
+//获取Tabs
+export const getTabs = () => {
+  return request('/costAccount/setting/getReport', {
+    method: 'GET',
+  });
+};
+
+
+//新增表格数据 
+
+export const addData = (data) => {
+  return request('/costAccount/setting/addReportColumn', {
+    method: 'POST',
+    data
+  });
+};
+
+
+//编辑权
+export const editData = (data) => {
+  return request('/costAccount/setting/editReportColumn', {
+    method: 'POST',
+    data
+  });
+};
+
+
+
+//删除表格操作
+
+export const delData = (id) => {
+  return request('/costAccount/setting/deleteReportColumn', {
+    method: 'POST',
+    params:{id}
+  });
+};
+
+
+
+
+
+
+
+

+ 92 - 0
src/pages/baseSetting/otherItemSet/reportItemSet/style.less

@@ -0,0 +1,92 @@
+
+
+
+.TableSelecter {
+
+  .pfm-ant-modal-footer {
+    display: none !important;
+  }
+  
+  .footer {
+       display: flex;
+       flex-direction:row;
+       justify-content: flex-end;
+       margin-top: 15px;
+       span {
+           display: inline-block;
+           width: 56px;
+           height: 24px;  
+           font-size: 14px;
+           line-height: 23px;
+           text-align: center;
+           border-radius: 4px;
+           cursor: pointer;
+
+           &.ok {
+               color: #FFFFFF;
+               background:#3377FF;
+               margin-left: 8px;
+           }
+           &.cancel {
+               border: 1px solid #DAE2F2;
+           }
+       }
+
+  }
+}
+
+.reportItemSet {
+  position: relative;
+  padding: 16px;
+  padding-top: 0;
+  background: #FFFFFF;
+  border-radius: 4px;
+
+
+  .toolBar {
+    position:absolute;
+    right:16px;
+    top:16px;
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+    align-items: center;
+
+    .filter {
+      display: flex;
+      flex-direction: row;
+      justify-content: flex-start;
+      align-items: center;
+
+      .filterItem {
+        display: flex;
+        flex-direction: row;
+        justify-content: center;
+        align-items: center;
+      }
+    }
+
+    .btnGroup {
+      
+      .add ,.copy{
+        cursor: pointer;
+        display: inline-block;
+        font-size: 14px;
+        font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+        font-weight: 400;
+        color: #FFFFFF;
+        line-height: 24px;
+        padding: 0 14px;
+        background: #3377FF;
+        border-radius: 4px;
+      }
+      .copy {
+          color: #17181A;
+          border: 1px solid #DAE2F2;
+          background: #FAFCFF;
+          margin-right: 8px;
+      }
+    }
+
+  }
+}

+ 11 - 16
src/pages/monthlyInfoSearch/empCostDataImport/index.js → src/pages/monthlyInfoSearch/empCostDataImport/index.tsx

@@ -2,20 +2,14 @@
  * @Author: code4eat awesomedema@gmail.com
  * @Date: 2023-03-03 11:30:33
  * @LastEditors: code4eat awesomedema@gmail.com
- * @LastEditTime: 2023-10-20 17:32:10
+ * @LastEditTime: 2023-10-23 15:59:01
  * @FilePath: /KC-MiddlePlatform/src/pages/platform/setting/pubDicTypeMana/index.tsx
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
 
 import { createFromIconfontCN } from '@ant-design/icons';
 
-import {
-  ProFormDependency,
-  ProFormDigit,
-  ProFormRadio,
-  ProFormSelect,
-} from '@ant-design/pro-components';
-import { ModalForm, ProFormText } from '@ant-design/pro-form';
+import { ModalForm } from '@ant-design/pro-form';
 import FormItem from 'antd/es/form/FormItem';
 import {DatePicker,Input} from 'antd';
 import { useEffect, useRef, useState } from 'react';
@@ -29,6 +23,8 @@ import locale from 'antd/es/date-picker/locale/zh_CN';
 import KCIMPagecontainer from '@/components/KCIMPageContainer';
 import { KCIMTable } from '@/components/KCIMTable';
 import KCIMUpload from '@/components/KCIMUpload';
+import { TableDataResponse } from 'typings';
+import { ActionType } from '@ant-design/pro-components';
 
 
 const IconFont = createFromIconfontCN({
@@ -39,9 +35,9 @@ const currentData =  `${new Date().getFullYear()}-${(new Date().getMonth()+1).to
 
 export default function empCostDataImport() {
   const [computeDate,set_computeDate] = useState(currentData);
-  const [tableDataFilterParams, set_tableDataFilterParams] = useState({computeDate:currentData});
+  const [tableDataFilterParams, set_tableDataFilterParams] = useState<any>({computeDate:currentData});
   const [tableDataSearchKeywords, set_tableDataSearchKeywords] = useState('');
-  const tableRef = useRef();
+  const tableRef = useRef<ActionType>();
 
   const columns = [
     {
@@ -70,11 +66,10 @@ export default function empCostDataImport() {
     },
   ];
 
-  const getTableData = async (params) => {
+  const getTableData = async (params:any):Promise<TableDataResponse|any[]> => {
     const resp = await getData({ ...params,...tableDataFilterParams});
-    const { status, data } = resp;
-    if (status == 200) {
-      const { list, totalCount, pageSize, totalPage } = data;
+    if (resp) {
+      const { list, totalCount, pageSize, totalPage } = resp;
       if (resp.totalCount == 0 && resp.currPage != 1) {
         return getTableData({ ...params, current: resp.currPage - 1 });
       } else {
@@ -90,7 +85,7 @@ export default function empCostDataImport() {
     return [];
   };
 
-  const tableDataSearchHandle = (paramName) => {
+  const tableDataSearchHandle = (paramName:string) => {
 
 
     set_tableDataFilterParams({
@@ -198,7 +193,7 @@ export default function empCostDataImport() {
                   onPressEnter={(e) => {
                       set_tableDataFilterParams({
                           ...tableDataFilterParams,
-                          filter: e.target.value
+                          filter: ((e.target) as HTMLInputElement).value 
                       });
                   }}
 

+ 22 - 25
src/pages/monthlyInfoSearch/patientChargeItemsImport/index.js → src/pages/monthlyInfoSearch/patientChargeItemsImport/index.tsx

@@ -2,7 +2,7 @@
  * @Author: code4eat awesomedema@gmail.com
  * @Date: 2023-03-03 11:30:33
  * @LastEditors: code4eat awesomedema@gmail.com
- * @LastEditTime: 2023-10-20 17:36:37
+ * @LastEditTime: 2023-10-24 14:13:01
  * @FilePath: /KC-MiddlePlatform/src/pages/platform/setting/pubDicTypeMana/index.tsx
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -10,6 +10,7 @@
 import { createFromIconfontCN } from '@ant-design/icons';
 
 import {
+  ActionType,
   ProFormDependency,
   ProFormDigit,
   ProFormRadio,
@@ -29,7 +30,8 @@ import locale from 'antd/es/date-picker/locale/zh_CN';
 import KCIMPagecontainer from '@/components/KCIMPageContainer';
 import { KCIMTable } from '@/components/KCIMTable';
 import KCIMUpload from '@/components/KCIMUpload';
-import {getTargetDic} from '../../../services/user';
+import { getTargetDic } from '@/services/auth';
+
 
 const IconFont = createFromIconfontCN({
   scriptUrl: '',
@@ -41,9 +43,9 @@ const currentData = `${new Date().getFullYear()}-${(new Date().getMonth() + 1)
 
 export default function patientChargeItemsImport() {
   const [computeDate,set_computeDate] = useState(currentData);
-  const [tableDataFilterParams, set_tableDataFilterParams] = useState({ computeDate: currentData });
+  const [tableDataFilterParams, set_tableDataFilterParams] = useState<any>({ computeDate: currentData });
   const [tableDataSearchKeywords, set_tableDataSearchKeywords] = useState('');
-  const tableRef = useRef();
+  const tableRef = useRef<ActionType>();
   const [totalNum,set_totalNum] = useState(0);
 
   const columns = [
@@ -121,27 +123,23 @@ export default function patientChargeItemsImport() {
     },
   ];
 
-  const getTableData = async (params) => {
+  const getTableData = async (params:any) => {
     const resp = await getData({ ...params, ...tableDataFilterParams });
-    const { status, data } = resp;
-    if (status == 200) {
-      const { list, totalCount, pageSize, totalPage } = data;
-      if (resp.totalCount == 0 && resp.currPage != 1) {
-        return getTableData({ ...params, current: resp.currPage - 1 });
-      } else {
-        return {
-          data: list,
-          success: true,
-          total: totalCount,
-          pageSize: pageSize,
-          totalPage: totalPage,
-        };
-      }
+    console.log({resp})
+    if (resp) {
+      const {list,totalCount,pageSize,totalPage} = resp;
+      return {
+        data: list,
+        success: true,
+        total: totalCount,
+        pageSize: pageSize,
+        totalPage: totalPage,
+      };
     }
     return [];
   };
 
-  const tableDataSearchHandle = (paramName) => {
+  const tableDataSearchHandle = (paramName:string) => {
     set_tableDataFilterParams({
       ...tableDataFilterParams,
       [`${paramName}`]: tableDataSearchKeywords,
@@ -150,9 +148,8 @@ export default function patientChargeItemsImport() {
 
   const getTotalNum = async ()=>{
       const resp = await getTotalNumReq(computeDate);
-      const {status,data} = resp;
-      if(status == 200){
-          set_totalNum(data);
+      if(resp){
+        set_totalNum(resp);
       }
   }
 
@@ -259,7 +256,7 @@ export default function patientChargeItemsImport() {
                     const { data, status } = resp;
                     if (status == 200) {
                       const { dataVoList } = data;
-                      return dataVoList.map((a) => ({ label: a.name, value: a.value }));
+                      return dataVoList.map((a:any) => ({ label: a.name, value: a.value }));
                     }
                     return [];
                   }}
@@ -297,7 +294,7 @@ export default function patientChargeItemsImport() {
               onPressEnter={(e) => {
                 set_tableDataFilterParams({
                   ...tableDataFilterParams,
-                  departmentName: e.target.value,
+                  departmentName: ((e.target) as HTMLInputElement).value 
                 });
               }}
             />

+ 18 - 22
src/pages/monthlyInfoSearch/patientInfoImport/index.js → src/pages/monthlyInfoSearch/patientInfoImport/index.tsx

@@ -2,7 +2,7 @@
  * @Author: code4eat awesomedema@gmail.com
  * @Date: 2023-03-03 11:30:33
  * @LastEditors: code4eat awesomedema@gmail.com
- * @LastEditTime: 2023-10-20 17:35:08
+ * @LastEditTime: 2023-10-23 16:05:32
  * @FilePath: /KC-MiddlePlatform/src/pages/platform/setting/pubDicTypeMana/index.tsx
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -23,6 +23,7 @@ import locale from 'antd/es/date-picker/locale/zh_CN';
 import KCIMPagecontainer from '@/components/KCIMPageContainer';
 import { KCIMTable } from '@/components/KCIMTable';
 import KCIMUpload from '@/components/KCIMUpload';
+import { ActionType } from '@ant-design/pro-components';
 
 
 const IconFont = createFromIconfontCN({
@@ -33,9 +34,9 @@ const currentData =  `${new Date().getFullYear()}-${(new Date().getMonth()+1).to
 
 export default function patientInfoImport() {
   const [computeDate,set_computeDate] = useState(currentData);
-  const [tableDataFilterParams, set_tableDataFilterParams] = useState({computeDate:currentData});
+  const [tableDataFilterParams, set_tableDataFilterParams] = useState<any>({computeDate:currentData});
   const [tableDataSearchKeywords, set_tableDataSearchKeywords] = useState('');
-  const tableRef = useRef();
+  const tableRef = useRef<ActionType>();
 
   const columns = [
     {
@@ -53,7 +54,7 @@ export default function patientInfoImport() {
     {
       title: '就诊类别',
       dataIndex: 'type',
-      renderText(type, record, index, action) {
+      renderText(type: number, record: any, index: any, action: any) {
         if(type==1)return '门诊';
         if(type==3)return '住院';
         if(type==2)return '急诊'
@@ -133,27 +134,22 @@ export default function patientInfoImport() {
     },
   ];
 
-  const getTableData = async (params) => {
+  const getTableData = async (params:any) => {
     const resp = await getData({ ...params,...tableDataFilterParams});
-    const { status, data } = resp;
-    if (status == 200) {
-      const { list, totalCount, pageSize, totalPage } = data;
-      if (resp.totalCount == 0 && resp.currPage != 1) {
-        return getTableData({ ...params, current: resp.currPage - 1 });
-      } else {
-        return {
-          data: list,
-          success: true,
-          total: totalCount,
-          pageSize: pageSize,
-          totalPage: totalPage,
-        };
-      }
+    if (resp) {
+      const { list, totalCount, pageSize, totalPage } = resp;
+      return {
+        data: list,
+        success: true,
+        total: totalCount,
+        pageSize: pageSize,
+        totalPage: totalPage,
+      };
     }
     return [];
   };
 
-  const tableDataSearchHandle = (paramName) => {
+  const tableDataSearchHandle = (paramName:string) => {
 
 
     set_tableDataFilterParams({
@@ -261,7 +257,7 @@ export default function patientInfoImport() {
                   onPressEnter={(e) => {
                       set_tableDataFilterParams({
                           ...tableDataFilterParams,
-                          departmentName: e.target.value
+                          departmentName: ((e.target) as HTMLInputElement).value 
                       });
                   }}
 
@@ -285,7 +281,7 @@ export default function patientInfoImport() {
                   onPressEnter={(e) => {
                       set_tableDataFilterParams({
                           ...tableDataFilterParams,
-                          patientName: e.target.value
+                          patientName: ((e.target) as HTMLInputElement).value 
                       });
                   }}
 

+ 61 - 0
src/pages/static/index.tsx

@@ -0,0 +1,61 @@
+/*
+ * @Author: code4eat awesomedema@gmail.com
+ * @Date: 2023-03-03 11:30:33
+ * @LastEditors: code4eat awesomedema@gmail.com
+ * @LastEditTime: 2023-10-26 11:12:59
+ * @FilePath: /KC-MiddlePlatform/src/pages/platform/setting/pubDicTypeMana/index.tsx
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+
+import { createFromIconfontCN } from '@ant-design/icons';
+
+import {Skeleton } from 'antd';
+import { useEffect, useRef, useState } from 'react';
+import { useLocation } from 'umi';
+
+import KCIMPagecontainer from '@/components/KCIMPageContainer';
+
+
+
+const IconFont = createFromIconfontCN({
+  scriptUrl: '',
+});
+
+
+function getQueryParams() {
+  const params = new URLSearchParams(window.location.search);
+  // 例如,获取名为 "id" 的查询参数
+  const softUrl = params.get('softUrl');
+  return { softUrl };
+}
+
+
+export default function StaticPage() {
+
+  const [specialPageUrl, setspecialPageUrl] = useState<string | undefined>(undefined);
+  const [loading, setloading] = useState(false);
+
+
+  const onLoadhandle = () => {
+    setloading(false);
+  };
+
+  useEffect(() => {
+    setloading(true);
+    const {softUrl} = getQueryParams();
+    // console.log({history,location,softUrl});
+    setspecialPageUrl(softUrl?softUrl:'');
+    
+  }, []);
+
+  return (
+    <KCIMPagecontainer className="StaticPage" title={false}>
+      <Skeleton loading={loading} paragraph={{ rows: 50 }} active />
+      <iframe
+        onLoad={() => onLoadhandle()}
+        style={{ width: '100%', height: '90vh', border: 'none' }}
+        src={specialPageUrl}
+      ></iframe>
+    </KCIMPagecontainer>
+  );
+}

+ 86 - 0
src/pages/static/service.js

@@ -0,0 +1,86 @@
+/*
+ * @Author: code4eat awesomedema@gmail.com
+ * @Date: 2023-03-03 16:31:27
+ * @LastEditors: code4eat awesomedema@gmail.com
+ * @LastEditTime: 2023-10-20 11:15:06
+ * @FilePath: /KC-MiddlePlatform/src/pages/platform/setting/pubDicTypeMana/service.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+
+
+
+import { request } from 'umi';
+import axios from 'axios';
+
+//获取table列表数据
+
+export const getData = (params) => {
+  return request('/costAccount/computeImport/getPatientItemList', {
+    method: 'GET',
+    params:{...params}
+  });
+};
+
+//获取总数
+export const getTotalNumReq = (computeDate) => {
+  return request('/costAccount/computeImport/getComputeTotal', {
+    method: 'GET',
+    params:{computeDate}
+  });
+};
+
+//导入数据
+export const importDataPost = (data) => {
+  return request('/costAccount/computeImport/importPatientItem', {
+    method: 'POST',
+    data
+  });
+};
+
+
+//下载模板
+
+export const downloadTemplateReq = () => {
+
+
+  let path = '/gateway/costAccount/computeImport/exportPatientItem';
+
+  const userData = localStorage.getItem('userData');
+  const { token = '' } = JSON.parse(userData);
+
+  axios({
+      method: 'get',
+      url: path,
+      responseType: 'blob',
+      headers: { token },
+  })
+      .then(function (response) {
+          //console.log({ 'chunk': response });
+          const filename = decodeURI(response.headers["content-disposition"]);
+          const objectUrl = URL.createObjectURL(
+              new Blob([response.data], {
+                  type: 'application/vnd.ms-excel',
+              })
+          )
+          const link = document.createElement('a')
+          // 设置导出的文件名称
+          link.download = `${filename}` + '.xls'
+          link.style.display = 'none'
+          link.href = objectUrl
+          link.click()
+          document.body.appendChild(link)
+
+      });
+
+
+
+}
+
+
+
+
+
+
+
+
+

+ 96 - 0
src/pages/static/style.less

@@ -0,0 +1,96 @@
+
+
+
+.TableSelecter {
+
+  .pfm-ant-modal-footer {
+    display: none !important;
+  }
+  
+  .footer {
+       display: flex;
+       flex-direction:row;
+       justify-content: flex-end;
+       margin-top: 15px;
+       span {
+           display: inline-block;
+           width: 56px;
+           height: 24px;  
+           font-size: 14px;
+           line-height: 23px;
+           text-align: center;
+           border-radius: 4px;
+           cursor: pointer;
+
+           &.ok {
+               color: #FFFFFF;
+               background:#3377FF;
+               margin-left: 8px;
+           }
+           &.cancel {
+               border: 1px solid #DAE2F2;
+           }
+       }
+
+  }
+}
+
+.patientChargeItemsImport {
+  position: relative;
+  padding: 16px;
+  background: #FFFFFF;
+  border-radius: 4px;
+
+
+  .toolBar {
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+    align-items: center;
+
+    .filter {
+      display: flex;
+      flex-direction: row;
+      justify-content: flex-start;
+      align-items: center;
+
+      .filterItem {
+        display: flex;
+        flex-direction: row;
+        justify-content: center;
+        align-items: center;
+      }
+    }
+
+    .btnGroup {
+      
+      .import ,.copy{
+        cursor: pointer;
+        display: inline-block;
+        font-size: 14px;
+        font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+        font-weight: 400;
+        color: #FFFFFF;
+        line-height: 24px;
+        padding: 0 14px;
+        background: #3377FF;
+        border-radius: 4px;
+      }
+      .copy {
+          color: #17181A;
+          border: 1px solid #DAE2F2;
+          background: #FAFCFF;
+          margin-right: 8px;
+      }
+    }
+
+  }
+  .total {
+    height: 16px;
+    font-size: 16px;
+    font-weight: 500;
+    color: #17181A;
+    line-height: 16px;
+    margin: 16px 0;
+  }
+}

+ 9 - 1
src/services/auth.ts

@@ -2,7 +2,7 @@
  * @Author: code4eat awesomedema@gmail.com
  * @Date: 2023-01-30 16:53:33
  * @LastEditors: code4eat awesomedema@gmail.com
- * @LastEditTime: 2023-04-17 10:05:31
+ * @LastEditTime: 2023-10-23 15:23:24
  * @FilePath: /BudgetManaSystem/src/services/oah.ts
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -32,6 +32,14 @@ export const getMenus = (systemId:number)=>{
     });
 }
 
+//获取指定字典
+export async function getTargetDic(dictType: string) {
+  return request('/costAccount/common/getDict', {
+    method: 'GET',
+    params: { dictType,pageSize:500,current:1 },
+  });
+}
+
 //获取平台菜单
 export const getPlatformMenu = (systemId?:Key) => {
     return request('/centerSys/user/getMenuNav', {

+ 17 - 0
typings.d.ts

@@ -1 +1,18 @@
+/*
+ * @Author: code4eat awesomedema@gmail.com
+ * @Date: 2022-12-14 14:14:32
+ * @LastEditors: code4eat awesomedema@gmail.com
+ * @LastEditTime: 2023-10-23 15:55:33
+ * @FilePath: /CostAccountingSys/typings.d.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
 import '@umijs/max/typings';
+
+
+export type TableDataResponse = {
+    data: any[]; 
+    success: boolean; 
+    total: number; 
+    pageSize: number; 
+    totalPage: number;
+};