Sfoglia il codice sorgente

更新2023-07-28周功能

code4eat 2 anni fa
parent
commit
771190d5a6

+ 6 - 1
.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-07-19 13:32:35
+ * @LastEditTime: 2023-07-25 09:44:29
  * @FilePath: /BudgetManaSystem/.umirc.ts
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -153,6 +153,11 @@ export default defineConfig({
               path: '/setting/projectSetting/costIncomeProjectSet',
               component: './setting/projectSetting/costIncomeProjectSet',
             },
+            {
+              name: '二次分配分组设定',
+              path: '/setting/projectSetting/secondaryDistriGroupSet',
+              component: './setting/projectSetting/secondaryDistriGroupSet',
+            },
           ]
         },
         {

+ 14 - 5
src/global.less

@@ -106,8 +106,8 @@ textarea {
         }
         .bms-ant-modal-body {
             max-height: 570px;
-            // overflow-y: scroll;
-            // overflow-x: hidden;
+            overflow-y: scroll;
+            overflow-x: hidden;
             padding: 0;
 
             .bms-ant-modal-confirm-body-wrapper {
@@ -578,12 +578,21 @@ textarea {
 
 
 
-.bms-ant-tabs .bms-ant-tabs-tab {
-    padding: 5px 0 !important;
-    padding-top: 12px !important;
+.bms-ant-tabs {
+    .bms-ant-tabs-tab {
+        padding: 5px 0 !important;
+        padding-top: 12px !important;
+    }
+    .bms-ant-tabs-nav {
+        &::before {
+            border-bottom: none !important;
+        }
+    }
+   
 }
 
 
+
 .bms-ant-table-wrapper {
     overflow: hidden;
 }

+ 47 - 91
src/pages/budgetMana/monthlyDataCheck/index.tsx

@@ -4,7 +4,7 @@
  * @Author: code4eat awesomedema@gmail.com
  * @Date: 2022-12-16 09:42:52
  * @LastEditors: code4eat awesomedema@gmail.com
- * @LastEditTime: 2023-07-24 09:33:39
+ * @LastEditTime: 2023-07-27 14:45:47
  * @FilePath: /BudgetManaSystem/src/pages/budgetMana/monthlySet/index.tsx
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -42,6 +42,7 @@ import { getDeepestTreeData } from '@/utils/tooljs';
 import '../../../utils/zhongtaiA'
 import { formatMoneyNumber } from '@/utils/format';
 import { getJiezhuanStatus } from '../monthlySet/service';
+import { useAccess } from '@umijs/max';
 
 const IconFont = createFromIconfontCN({
     scriptUrl: '',
@@ -53,6 +54,37 @@ export type TableListItem = {
     name: string;
 };
 
+const tabData = [
+    {
+        label: `固定工资`,
+        key: '1',
+    },
+    {
+        label: `单元成本数据`,
+        key: '7',
+    },
+    {
+        label: `非考核项目`,
+        key: '2',
+    },
+    {
+        label: `考核项目`,
+        key: '3',
+    },
+    {
+        label: `管理指标`,
+        key: '4',
+    },
+    {
+        label: `收入数据`,
+        key: '5',
+    },
+    {
+        label: `成本数据`,
+        key: '6',
+    },
+]
+
 
 
 const MonthlyDataCheck: React.FC = () => {
@@ -94,6 +126,10 @@ const MonthlyDataCheck: React.FC = () => {
 
     const [tableH, set_tableH] = useState(0);
 
+    const access = useAccess();
+
+    const [tabs,set_tabs] = useState<any[]>([]);
+
     const [ifBanAllAction, set_ifBanAllAction] = useState(true);  //是否掩藏所有操作
 
     const [computeMethod, set_computeMethod] = useState('1'); //1按考核分级 2按总分
@@ -985,65 +1021,6 @@ const MonthlyDataCheck: React.FC = () => {
         if (resp) {
             set_manaIndexGroups(resp);
             if (resp.length > 0) {
-                // const titleResp = await getManaIndexTableData({ computeDate: currentComputeDate as string, groupId: resp[0].groupCode });
-                // if (titleResp) {
-                //     const columns = titleResp.title.map((item: any) => (item.children ? {
-                //         title: () => {
-                //             return <div>{item.name} <span style={{ fontSize: 14, fontFamily: 'SourceHanSansCN-Medium, SourceHanSansCN', fontWeight: 500, color: item.arrow == 'up' ? '#00BF8F' : '#FF4060' }}>↓</span></div>
-                //         },
-                //         key: item.code,
-                //         dataIndex: item.name,
-                //         children: item.children.map((a: any) => {
-                //             return {
-                //                 title: a.name,
-                //                 dataIndex: `${a.code}${item.code}`,
-                //                 key: `${a.code}${item.code}`,
-                //                 width: 100,
-                //                 align: 'center',
-                //             }
-
-                //         })
-                //     } : {
-                //         title: item.name,
-                //         dataIndex: item.code,
-                //         key: item.code,
-                //         width: 100,
-                //         align: 'center',
-                //     }));
-
-
-
-
-                //     set_tableColumn([{
-                //         title: '核算单元',
-                //         dataIndex: 'unitName',
-                //         key: 'unitName',
-                //         align: 'center',
-                //         width: 120,
-                //         fixed: 'left',
-                //     }, ...columns,
-                //     {
-                //         title: '总得分',
-                //         dataIndex: 'totalScore',
-                //         key: 'totalScore',
-                //         align: 'center',
-                //         width: 100,
-                //         fixed:'right',
-
-                //     },
-                //     {
-                //         title: '操作',
-                //         key: 'option',
-                //         valueType: 'option',
-                //         width: 100,
-                //         align: 'center',
-                //         fixed: 'right',
-                //         render: (_: any, record: any) => [
-                //             <EditManaIndexTableRow record={record} key={'edit'} />
-                //         ],
-                //     }]);
-                // }
-
                 set_currentSelectedManaGroup(resp[0])
             }
         }
@@ -1274,6 +1251,10 @@ const MonthlyDataCheck: React.FC = () => {
         set_tableColumn(tableColumnOne as ProColumns[]);
         getComputeMethod();
 
+        const tabs = access.whatCanIDoInThisPage(location.pathname.replace('/budgetManaSystem', ''));
+        const tabsNameArr = tabs.map((a:any)=>a.name);
+        const needShowTabs = tabData.filter(a=>tabsNameArr.includes(a.label));
+        set_tabs(needShowTabs);
         window.addEventListener('resize', (e) => handleResize(e)) //监听窗口大小改变
         doResize();
         return () => {
@@ -1474,36 +1455,7 @@ const MonthlyDataCheck: React.FC = () => {
                                 <Tabs
                                     defaultActiveKey="1"
                                     onChange={onTabChange}
-                                    items={[
-                                        {
-                                            label: `固定工资`,
-                                            key: '1',
-                                        },
-                                        {
-                                            label: `单元成本数据`,
-                                            key: '7',
-                                        },
-                                        {
-                                            label: `非考核项目`,
-                                            key: '2',
-                                        },
-                                        {
-                                            label: `考核项目`,
-                                            key: '3',
-                                        },
-                                        {
-                                            label: `管理指标`,
-                                            key: '4',
-                                        },
-                                        {
-                                            label: `收入数据`,
-                                            key: '5',
-                                        },
-                                        {
-                                            label: `成本数据`,
-                                            key: '6',
-                                        },
-                                    ]}
+                                    items={tabs}
                                 />
 
                                 {
@@ -2085,4 +2037,8 @@ const MonthlyDataCheck: React.FC = () => {
 
 };
 
-export default MonthlyDataCheck;
+export default MonthlyDataCheck;
+
+function whatCanIDoInThisPage(pathname: string) {
+    throw new Error('Function not implemented.');
+}

+ 26 - 15
src/pages/budgetMana/monthlyInfoCheck/index.tsx

@@ -4,7 +4,7 @@
  * @Author: code4eat awesomedema@gmail.com
  * @Date: 2022-12-16 09:42:52
  * @LastEditors: code4eat awesomedema@gmail.com
- * @LastEditTime: 2023-07-24 14:11:10
+ * @LastEditTime: 2023-07-27 14:49:13
  * @FilePath: /BudgetManaSystem/src/pages/budgetMana/monthlySet/index.tsx
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -40,6 +40,7 @@ import { difference } from 'lodash';
 
 import '../../../../src/utils/zhongtaiA'
 import { getJiezhuanStatus } from '../monthlySet/service';
+import { useAccess } from '@umijs/max';
 
 
 const IconFont = createFromIconfontCN({
@@ -116,8 +117,25 @@ export type TableListItem = {
     name: string;
 };
 
+const tabData = [
+    {
+        label: `人员信息`,
+        key: '1',
+    },
+    {
+        label: `科室信息`,
+        key: '2',
+    },
+    {
+        label: `收费项目信息`,
+        key: '3',
+    },
+]
+
+
 
 const MonthlyInfoCheck: React.FC = () => {
+    const access = useAccess();
 
     const [treeData, set_treeData] = useState<getTreeDataRespType[]>([]);
     const [tableColumn, set_tableColumn] = useState<ProColumns[]>([]);
@@ -146,6 +164,7 @@ const MonthlyInfoCheck: React.FC = () => {
     const [autoExpandParent, setAutoExpandParent] = useState(true);
 
     const [ifBanAllAction, set_ifBanAllAction] = useState(true);  //是否掩藏所有操作
+    const [tabs,set_tabs] = useState<any[]>([]);
 
 
 
@@ -709,6 +728,11 @@ const MonthlyInfoCheck: React.FC = () => {
         set_tableColumn(personTableColumn as ProColumns[]);
         getCurrentComputeDate();
 
+        const tabs = access.whatCanIDoInThisPage(location.pathname.replace('/budgetManaSystem', ''));
+        const tabsNameArr = tabs.map((a:any)=>a.name);
+        const needShowTabs = tabData.filter(a=>tabsNameArr.includes(a.label));
+        set_tabs(needShowTabs);
+
     }, []);
 
 
@@ -802,20 +826,7 @@ const MonthlyInfoCheck: React.FC = () => {
                     <Tabs
                         defaultActiveKey="1"
                         onChange={onTabChange}
-                        items={[
-                            {
-                                label: `人员信息`,
-                                key: '1',
-                            },
-                            {
-                                label: `科室信息`,
-                                key: '2',
-                            },
-                            {
-                                label: `收费项目信息`,
-                                key: '3',
-                            },
-                        ]}
+                        items={tabs}
                     />
 
                     {

+ 11 - 2
src/pages/setting/checkUnitSet/checkUnitEmpSet/index.tsx

@@ -4,7 +4,7 @@
  * @Author: code4eat awesomedema@gmail.com
  * @Date: 2022-12-16 09:42:52
  * @LastEditors: code4eat awesomedema@gmail.com
- * @LastEditTime: 2023-07-19 14:44:17
+ * @LastEditTime: 2023-07-27 16:05:56
  * @FilePath: /BudgetManaSystem/src/pages/budgetMana/monthlySet/index.tsx
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -24,7 +24,7 @@ import closeIcon from '../../../../../static/treenode_collapse.png';
 import { BMSTable } from '@/components/BMSTable';
 import { ActionType, ProColumns} from '@ant-design/pro-components';
 import { createFromIconfontCN } from '@ant-design/icons';
-import { CheckUnitEmpMapTableDataType, delTableData,addMapEmp,getCheckUnitEmpMapTableDataByUnitClass,getMapEmpList, getTreeData, getTreeDataRespType } from './service';
+import { CheckUnitEmpMapTableDataType, delTableData,addMapEmp,getCheckUnitEmpMapTableDataByUnitClass,getMapEmpList, getTreeData, getTreeDataRespType, updateEmpInfoReq } from './service';
 import { TransferItem, TransferProps } from 'antd/es/transfer';
 
 import difference from 'lodash/difference';
@@ -426,6 +426,14 @@ const CheckUnitDepMap: React.FC = () => {
 
     }
 
+    const updateEmpInfo =async () => {
+        const resp = await updateEmpInfoReq();
+        if(resp){
+            message.success('更新成功!');
+            tableRef.current?.reload()
+        }
+    }
+
 
     useEffect(() => {
         if(currentSelectedTreeNode&&currentSelectedTreeNode.unitType){
@@ -560,6 +568,7 @@ const CheckUnitDepMap: React.FC = () => {
                                 />
                             </div>
                             <div className='btnGroup'>
+                                <span className='updateInfo' style={{marginRight:8}} onClick={()=>updateEmpInfo()}>更新人员信息</span>
                                 <span className='add' onClick={()=>addHandle()}>添加</span>
                             </div>
                         </div>

+ 10 - 1
src/pages/setting/checkUnitSet/checkUnitEmpSet/service.ts

@@ -2,7 +2,7 @@
  * @Author: code4eat awesomedema@gmail.com
  * @Date: 2022-12-21 11:13:51
  * @LastEditors: code4eat awesomedema@gmail.com
- * @LastEditTime: 2023-04-26 15:59:31
+ * @LastEditTime: 2023-07-27 16:04:34
  * @FilePath: /BudgetManaSystem/src/pages/budgetMana/monthlyInfoCheck/service.ts
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -100,3 +100,12 @@ export const delTableData = ( id:number) => {
 
 }
 
+//更新人员信息
+
+export const updateEmpInfoReq = () => {
+
+    return request('/performance/unit/updateEmployee', {
+        method: 'POST',
+    })
+}
+

+ 13 - 0
src/pages/setting/checkUnitSet/checkUnitEmpSet/style.less

@@ -100,6 +100,19 @@
                 }
 
                 .btnGroup {
+                    .updateInfo {
+                        cursor: pointer;
+                        display: inline-block;
+                        font-size: 14px;
+                        font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+                        font-weight: 400;
+                        color: #17181A;
+                        line-height: 24px;
+                        padding: 0 14px;
+                        background: #FAFCFF;
+                        border: 1px solid #DAE2F2;
+                        border-radius: 4px;
+                    }
                     .add {
                         cursor: pointer;
                         display: inline-block;

+ 7 - 5
src/pages/setting/projectSetting/checkUnitProjectSet/index.tsx

@@ -4,7 +4,7 @@
  * @Author: code4eat awesomedema@gmail.com
  * @Date: 2022-12-16 09:42:52
  * @LastEditors: code4eat awesomedema@gmail.com
- * @LastEditTime: 2023-07-24 13:53:10
+ * @LastEditTime: 2023-07-27 18:00:00
  * @FilePath: /BudgetManaSystem/src/pages/budgetMana/monthlySet/index.tsx
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -267,8 +267,8 @@ const CheckUnitProjectSet: React.FC = () => {
             title: '可控',
             ellipsis: true,
             dataIndex: 'ctrlFlag',
-            renderText(text, record, index, action) {
-                return ifEdit ? <ProFormSelect noStyle fieldProps={{
+            renderText:(text, record, index, action)=>{
+                return (ifEdit&&currentEditRow?.id == record.id) ? <ProFormSelect noStyle fieldProps={{
                     defaultValue: text, onChange(value, option) {
                         set_currentEditRow({ ...currentEditRow, ctrlFlag: value })
                     },
@@ -987,7 +987,6 @@ const CheckUnitProjectSet: React.FC = () => {
             //保存操作
             if (currentSelectedTabKey == '1' && currentEditRow) {
                 //收费项目
-                console.log({ currentEditRow });
                 const result = {
                     id: currentEditRow.id,
                     unitCode: currentSelectedTreeNode.code,
@@ -1025,6 +1024,7 @@ const CheckUnitProjectSet: React.FC = () => {
         } else {
             //开启编辑模式
             set_ifEdit(true);
+            set_currentEditRow(undefined);
         }
 
         if (flag) {
@@ -1435,7 +1435,8 @@ const CheckUnitProjectSet: React.FC = () => {
 
                                     </div>
                                 </div>
-                                {currentSelectedTreeNode && <BMSTable actionRef={tableRef} pagination={false} params={searchParams} rowKey='id' columns={[...tableColumn, {
+                                {currentSelectedTreeNode && <BMSTable actionRef={tableRef} pagination={false} params={searchParams} rowKey='id' columns={[...tableColumn, 
+                                {
                                     title: '操作',
                                     key: 'option',
                                     width: 140,
@@ -1448,6 +1449,7 @@ const CheckUnitProjectSet: React.FC = () => {
                                             }
                                             if (ifEdit) {
                                                 editBtnHandle();
+                    
                                             }
 
                                         }}>{(ifEdit && currentEditRow?.id == record.id) ? '保存' : '编辑'}</a>,

+ 829 - 0
src/pages/setting/projectSetting/secondaryDistriGroupSet/index.tsx

@@ -0,0 +1,829 @@
+/*
+ * @Author: code4eat awesomedema@gmail.com
+ * @Date: 2023-03-03 11:30:33
+ * @LastEditors: code4eat awesomedema@gmail.com
+ * @LastEditTime: 2023-07-28 10:34:30
+ * @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 BMSPagecontainer from '@/components/BMSPageContainer';
+import { BMSTable } from '@/components/BMSTable';
+
+import { createFromIconfontCN, MenuOutlined } from '@ant-design/icons';
+import { ActionType, arrayMoveImmutable, ProFormSelect, useRefFunction } from '@ant-design/pro-components';
+import { ModalForm, ProFormText, ProFormTextArea } from '@ant-design/pro-form';
+import { ProColumns } from '@ant-design/pro-table';
+import { InputNumber, Dropdown, Input, MenuProps, message, Modal, Popconfirm, Space, Form, Table, Tabs } from 'antd';
+
+import { TransferItem, TransferProps } from 'antd/es/transfer';
+import React, { Key } from 'react';
+import { useEffect, useImperativeHandle, useRef, useState } from 'react';
+
+import { getMedicalGroup, getEmpTableDataFromMedicalGroup, addMedicalGroup, editMedicalGroup, delLeftReportData, addMedicalGroupEmp, updateMedicalGroupEmpInfo, delTableData, getAllUnitList, addGroupItemList, editGroupItemList } from './service';
+
+import './style.less';
+import '../../../../utils/zhongtaiB';
+import '../../../../utils/zhongtaiA'
+import { SortableContainer, SortableElement, SortableHandle } from 'react-sortable-hoc';
+import { getSecondaryProjectDistriData } from '../secondaryProjectDistribute/service';
+
+const IconFont = createFromIconfontCN({
+    scriptUrl: '',
+});
+
+const AddIconFont = createFromIconfontCN({
+    scriptUrl: '',
+});
+
+
+
+const DragHandle = SortableHandle(() => (
+    <MenuOutlined style={{ cursor: 'grab', color: '#999' }} />
+));
+
+let _currentSelectedType: { groupCode: any; } | undefined = undefined;
+
+
+const SecondaryDistriGroupSet = () => {
+
+    const [tableDataFilterParams, set_tableDataFilterParams] = useState<any | undefined>();
+
+    const [typeList, set_typeList] = useState<any[]>([]);
+    const [showTypeListArr, set_showTypeListArr] = useState<any[]>([]);
+    const [currentSelectedType, set_currentSelectedType] = useState<any | undefined>(undefined);
+
+    const [tableSelectedKeys, set_tableSelectedKeys] = useState<any[]>([]);
+
+    const [selectedAddKeys, set_selectedAddKeys] = useState<Key[]>([]);
+
+    const [ifShowModal, set_ifShowModal] = useState(false);
+
+    const [currentEditLeftData, set_currentEditLeftData] = useState<any | undefined>(undefined);
+
+    const [ifEditTable, set_ifEditTable] = useState(false);
+
+    const [currentTabKey, set_currentTabKey] = useState('1');
+
+    const tableRef = useRef<ActionType>();
+
+    const [dataSource,set_dataSource] = useState<any[]>([]);
+
+    const ref = React.createRef<{ save: any; getSelectedKeys: any }>();
+
+    const [tableColumns,set_tableColumns] = useState<ProColumns[]>([]);
+
+    const [tableDataSearchKeywords,set_tableDataSearchKeywords] = useState('');
+
+
+    const columnOne:ProColumns[] = [
+
+        {
+            title: '核算单元名称',
+            ellipsis: true,
+            dataIndex: 'unitName',
+
+        },
+        {
+            title: '核算单元代码',
+            dataIndex: 'unitCode',
+
+        },
+        {
+            title: '职类',
+            dataIndex: 'unitTypeName',
+
+        },
+        {
+            title: '操作',
+            key: 'option',
+            valueType: 'option',
+            render: (_: any, record: any) => {
+                console.log({currentSelectedType});
+                return [
+                    <Popconfirm
+                        title="是否确认删除?"
+                        key="del"
+                        onConfirm={() => delTableDataHanfle(record)}
+                    >
+                        <a>删除</a>
+                    </Popconfirm>
+                ]
+            },
+        },
+    ];
+    const columnTwo = [
+        {
+            title: '排序',
+            dataIndex: 'sort',
+            width: 60,
+            className: 'drag-visible',
+            render: () => <DragHandle />,
+        },
+        {
+            title: '项目名称',
+            ellipsis: true,
+            dataIndex: 'itemName',
+
+        },
+        {
+            title: '占比',
+            dataIndex: 'weightPercent',
+
+        },
+        {
+            title: '评价方式',
+            dataIndex: 'evaluationName',
+
+        },
+        {
+            title: '来源',
+            dataIndex: 'sourceName',
+
+        }
+    ]
+
+    
+
+
+    const getTableData = async (params?:any)=>{
+        if(!_currentSelectedType)return false;
+        const { groupCode:secondGroupCode } = _currentSelectedType;
+        let keywords=params?params.keywords:''
+        
+        if (secondGroupCode) {
+            const resp = await getEmpTableDataFromMedicalGroup(currentTabKey == '1'?{secondGroupCode,unitName:keywords}:{secondGroupCode,itemName:keywords},currentTabKey == '1'?1:2);
+            if (resp) {
+                set_dataSource(resp);
+            }
+        }
+    }
+
+    const switchChangeHandle = async (checked: boolean, record: any, key: string) => {
+        const result = { ...record, medicalGroupManager: checked ? 1 : 0 }
+        const resp = await updateMedicalGroupEmpInfo(result);
+        if (resp) {
+            tableRef.current?.reload();
+        }
+    }
+
+    const delTableDataHanfle = async (record?: { id: number; }) => {
+        const resp = await delTableData(record ? [record.id] : [...tableSelectedKeys]);
+        console.log({currentSelectedType});
+        if (resp) {
+            set_tableSelectedKeys([]);
+            getTableData();
+        }
+    }
+
+    //获取左侧数据
+    const getPageLeftData = async () => {
+        const resp = await getMedicalGroup();
+
+        if (resp) {
+
+            set_typeList(resp);
+            set_showTypeListArr(resp);
+        }
+    }
+
+
+    const updateTable = async (formVal: any, type: 'EDIT' | "ADD" | 'ADD_LEFTDATA' | 'EDIT_LEFTDATA') => {
+
+        // console.log({formVal,type});
+
+        if (type == 'ADD_LEFTDATA') {
+            const resp = await addMedicalGroup({
+                groupName: formVal.groupName,
+                description: formVal.description,
+            });
+            if (resp) {
+                getPageLeftData();
+            }
+        }
+
+
+
+        if (type == 'EDIT_LEFTDATA') {
+            const resp = await editMedicalGroup({
+                id: formVal.id,
+                groupName: formVal.groupName,
+                description: formVal.description
+            });
+            if (resp) {
+                getPageLeftData();
+            }
+        }
+
+        return true;
+
+    }
+
+    const UpDataActBtn = ({ record, type }: { record: any, type: 'EDIT' | 'ADD' | 'ADD_LEFTDATA' | 'EDIT_LEFTDATA' }) => {
+
+        const getTrriger = () => {
+            if (type == 'ADD') {
+                return <span className='add'>添加</span>
+            }
+            if (type == 'EDIT') {
+                return <a key="edit" >编辑</a>
+            }
+            if (type == 'ADD_LEFTDATA') {
+                return (
+                    <div className='add'>
+                        <img src={require('../../../../../static/addIcon_black.png')} alt="" />
+                    </div>
+                )
+            }
+            if (type == 'EDIT_LEFTDATA') {
+                return <a key="edit" >编辑</a>
+            }
+        }
+
+        return (
+            <ModalForm
+                title={type == 'ADD_LEFTDATA' ? `新增分组` : `编辑分组`}
+                width={352}
+                initialValues={type == 'EDIT_LEFTDATA' ? { ...record } : {}}
+                trigger={
+                    getTrriger()
+                }
+                onFinish={(val) => {
+                    return updateTable(type == 'EDIT_LEFTDATA' ? { ...record, ...val } : val, type);
+                }}
+            >
+
+                <ProFormText
+                    label='分组名称:'
+                    name='groupName'
+                    rules={[{ required: true, message: '名称不能为空!' }]}
+                />
+                <ProFormTextArea
+                    label='说明:'
+                    name='description'
+                />
+            </ModalForm>
+        )
+    }
+
+
+    interface TableSelecterProps extends TransferProps<TransferItem> {
+        tableSelecterColumn: any[];
+        record: any
+    }
+
+
+    const tableSelecterUnitColumn: any[] =  [
+        {
+            title: '核算单元名称',
+            dataIndex: 'unitName',
+        },
+        {
+            title: '职类',
+            dataIndex: 'unitTypeName',
+        },
+    ];
+
+    const addGroupEmpHandle = () => {
+
+        const ref = React.createRef<{ save: any; getSelectedKeys: any }>();
+      
+        set_ifShowModal(true);
+    }
+
+    const TableSelecter = React.forwardRef(({ tableSelecterColumn, record }: TableSelecterProps, ref) => {
+
+        const [datasource, set_datasource] = useState<any[]>([]);
+        const [selectedKeys, setSelectedKeys] = useState<React.Key[]>([]);
+        const [showList, set_showList] = useState<any[]>([]);
+
+        //获取表格数据
+        const getFuncList = async () => {
+            const resp = await getAllUnitList({ secondGroupCode: currentSelectedType.groupCode });
+            if (resp) {
+                set_datasource(resp);
+                set_showList(resp);
+            }
+        }
+
+
+        const onSelectChange = (newSelectedRowKeys: React.Key[]) => {
+            setSelectedKeys([...newSelectedRowKeys]);
+
+        };
+
+        const save = async () => {
+            const result = {
+                secondGroupCode: currentSelectedType.groupCode as string,
+                unitCodeList: selectedKeys
+            };
+
+            const resp = await addMedicalGroupEmp(result);
+
+            if (resp) {
+                message.success('添加成功!');
+                set_ifShowModal(false);
+                getTableData();
+                
+            }
+        }
+
+        useEffect(() => {
+            getFuncList();
+        }, [])
+
+        return (
+            <div className='TableSelecter'>
+                <Input placeholder={'请输入'} allowClear
+                    suffix={
+                        <IconFont style={{ color: '#99A6BF' }} type="iconsousuo" />
+                    }
+                    style={{ marginBottom: 8 }}
+                    onChange={(e) => {
+                        if (e.target.value.length != 0) {
+                            const result = datasource.filter(item => item.unitName.indexOf(e.target.value) != -1);
+                            set_showList(result);
+                        } else {
+                            set_showList(datasource);
+                        }
+
+                    }}
+
+                />
+                <BMSTable columns={tableSelecterColumn}
+                    options={{
+                        density: true,
+                        setting: {
+                            listsHeight: 100,
+                        },
+                    }}
+                    rowKey='code'
+
+                    tableAlertRender={false}
+                    rowSelection={{
+                        // 自定义选择项参考: https://ant.design/components/table-cn/#components-table-demo-row-selection-custom
+                        // 注释该行则默认不显示下拉选项
+                        selections: [Table.SELECTION_ALL, Table.SELECTION_INVERT],
+                        onChange: onSelectChange,
+                    }}
+                    pagination={{ showSizeChanger: false, pageSize:9, simple: true, showTitle: false }}
+                    dataSource={showList}
+                />
+                <div className='footer'>
+                    <span className='cancel' onClick={() => set_ifShowModal(false)}>取消</span>
+                    <span className='ok' onClick={() => save()}>{`确认(${selectedKeys.length > 0 && selectedKeys.length})`}</span>
+                </div>
+            </div>
+
+        )
+    });
+
+    const moreItems: MenuProps['items'] = [
+        {
+            key: '1',
+            label: <UpDataActBtn key={'act'} record={currentEditLeftData} type='EDIT_LEFTDATA' />,
+        },
+        {
+            key: '2',
+            label: (
+                <a onClick={async (e) => {
+                    e.preventDefault();
+                    const resp = await delLeftReportData(currentEditLeftData.id);
+                    if (resp) {
+                        getPageLeftData();
+                    }
+                }}>
+                    删除
+                </a>
+            ),
+        }
+    ];
+
+    
+    const onTableSelectChange = (newSelectedRowKeys: React.Key[]) => {
+        set_tableSelectedKeys([...newSelectedRowKeys]);
+    };
+
+    const updateSecondaryDistriItemSet = async (itemList:any[],type:'ADD'|'EDIT')=>{
+
+           if(type == 'ADD'){
+            const totalWeight = itemList.reduce((prev,cur)=>{
+                console.log({'prev':prev,'cur.weight':cur.weight})
+                return (prev)+cur.weight
+            },0);
+            console.log({totalWeight,itemList});
+            if(totalWeight.toFixed(2) != 1){
+                  message.error('占比总和必须等于1!');
+                  return false
+            }
+            const result = {
+             secondGroupCode:currentSelectedType.groupCode,
+             itemList:itemList.map((a:any)=>({
+                 secondItemCode:a.secondItemCode?a.secondItemCode:a.itemCode,
+                 weight:a.weight
+             }))
+            }
+            const resp = await addGroupItemList(result);
+            if(resp){
+                 getTableData();
+                 return true;
+            }
+            return false
+           }
+
+           if(type == 'EDIT'){
+               const resp = await editGroupItemList(itemList);
+               if(resp){
+                  getTableData();
+               }
+           }
+           
+    }
+
+    const AddItemComponent = () => {
+
+   
+        const [scoreList, set_scoreList] = useState<any[]>([]);
+        const [scoreInitList, set_scoreInitList] = useState({});
+
+        const addIndicator = () => {
+
+            const key = Math.random();
+
+            const temp = [...scoreList, { tempId: key, id: key, [`secondItemCode${key}`]: '', [`weight${key}`]: '' }];
+
+            set_scoreInitList({ ...scoreInitList, [`secondItemCode${key}`]: '', [`weight${key}`]: '' });
+
+            set_scoreList([...temp]);
+
+        }
+
+        const delGroupIndic = (data: any, index: number) => {
+            let temp = [...scoreList];
+            let defaultFormData: { [key: string]: any } = {};
+            const result = temp.filter((a: any) => a.id != data.id);
+            result.forEach((a: any) => {
+                defaultFormData[`secondItemCode${a.id}`] = a.secondItemCode;
+                defaultFormData[`weight${a.id}`] = a.weight;
+            });
+
+            set_scoreInitList({ ...defaultFormData });
+            set_scoreList([...result]);
+        }
+
+        
+        useEffect(() => {
+            let defaultFormData: { [key: string]: any } = {};
+                if (true) {
+                    const defaultVal = dataSource.map((a: any) => {
+                        defaultFormData[`secondItemCode${a.id}`] = a.itemCode;
+                        defaultFormData[`weight${a.id}`] = a.weight;
+                        return { ...a, tempId: Math.random() }
+                    });
+
+                    set_scoreInitList({ ...defaultFormData });
+            
+                    set_scoreList([...defaultVal]);
+                }    
+        },[]);
+
+        return (
+            <ModalForm
+                title={`二次分配项目设置(${currentSelectedType.groupName})`}
+                className='SecondaryDistriGroupSet-ModalForm'
+                width={355}
+                initialValues={{...scoreInitList}}
+                trigger={
+                    <a className='score'>添加</a>
+                }
+                onFinish={(val) => {
+                    return updateSecondaryDistriItemSet(scoreList,'ADD');
+                }}
+                modalProps={{ destroyOnClose: true }}
+            >
+                {
+                    (
+                        <div>
+                            {
+                                scoreList.map((item: any, index: number) => {
+
+                                    return (
+                                        <div className='item' key={index}>
+                                            <ProFormSelect label="管理指标:" width={160} 
+                                                name={`secondItemCode${item.id}`}
+                                                 request={async () => {
+                                                    const resp = await getSecondaryProjectDistriData({pageSize:1000,current:1});
+                                                    if (resp) {
+                                                        return resp.list.map((a: any) => ({
+                                                            label: a.name,
+                                                            value: a.code
+                                                        }))
+                                                    }
+                                                    return []
+
+                                                }}
+                                                fieldProps={{
+                                                    //   labelInValue:true,
+                                                    onChange(value, option: any) {
+                                                        // console.log({value,option});
+                                                        const temp = [...scoreList];
+                                                        const newArr = temp.map((a: any) => {
+                                                            if (a.id == item.id) {
+                                                                return { ...a, secondItemCode: value, secondItemName: option.label }
+                                                            }
+                                                            return a
+                                                        });
+
+                                                        set_scoreList([...newArr]);
+                                                    },
+                                                }}
+                                            />
+                                            <Form.Item name={`weight${item.id}`} label='占比:'>
+                                                <InputNumber
+                                                    style={{ width: 120, height: 24, position: 'relative', top: 0 }}
+                                                    onChange={(value) => {
+                                                        //console.log({value,index,indicatorData});
+                                                        const temp = [...scoreList];
+                                                        const newArr = temp.map((a: any) => {
+                                                            if (a.id == item.id) {
+                                                                return { ...a, weight: value }
+                                                            }
+                                                            return a
+                                                        });
+
+                                                        set_scoreList([...newArr]);
+                                                    }}
+                                                />
+                                            </Form.Item>
+                                            <span className='delIcon' onClick={() => delGroupIndic(item, index)}><IconFont   type="iconshanchu" /></span>
+                                        </div>
+                                    )
+                                })
+                            }
+                            <div className='addBtn' onClick={() => addIndicator()}>
+                                <AddIconFont type="icon-zengjia" style={{ color: '#3376FE' }} /><span>增加一行</span>
+                            </div>
+                        </div>
+                    )
+                }
+            </ModalForm>
+        )
+    }
+
+    const onTabChange = (activeKey:string) => {
+        set_currentTabKey(activeKey);
+        activeKey == '1'?set_tableColumns(columnOne):set_tableColumns(columnTwo);
+    }
+
+    
+    
+    const SortableItem = SortableElement((props: any) => <tr {...props} />);
+    const SortContainer = SortableContainer((props: any) => <tbody {...props} />);
+
+    const onSortEnd = useRefFunction(
+        ({ oldIndex, newIndex }: { oldIndex: number; newIndex: number }) => {
+            if (oldIndex !== newIndex) {
+                const newData = arrayMoveImmutable({
+                    array: [...dataSource],
+                    fromIndex: oldIndex,
+                    toIndex: newIndex,
+                }).filter((el) => !!el);
+                const updatedSortArr = newData.map((item: any, index: number) => ({ ...item, sort: index }))
+                set_dataSource([...updatedSortArr]);
+                updateSecondaryDistriItemSet(updatedSortArr,'EDIT');
+            }
+        },
+    );
+
+    const DraggableContainer = (props: any) => (
+        <SortContainer
+            useDragHandle
+            disableAutoscroll
+            helperClass="row-dragging"
+            onSortEnd={onSortEnd}
+            {...props}
+        />
+    );
+
+    const DraggableBodyRow = (props: any) => {
+        const { className, style, ...restProps } = props;
+        // function findIndex base on Table rowKey props and should always be a right array index
+        const index = dataSource.findIndex(
+            (x) => x.id === restProps['data-row-key'],
+        );
+
+        return <SortableItem index={index} {...restProps} />;
+    };
+
+    useEffect(() => {
+        if (currentSelectedType) {
+            set_tableDataFilterParams({ ...tableDataFilterParams, secondGroupCode: currentSelectedType.groupCode });
+            getTableData();
+            _currentSelectedType = currentSelectedType
+        }else{
+            _currentSelectedType = undefined;
+        }
+    }, [currentSelectedType])
+
+    useEffect(() => {
+        if (showTypeListArr.length > 0) {
+            set_currentSelectedType(showTypeListArr[0]);
+            //set_tableDataFilterParams({ ...tableDataFilterParams, medicalGroupCode: showTypeListArr[0].code });
+        }
+    }, [showTypeListArr]);
+
+    useEffect(()=>{
+        getPageLeftData();
+    },[currentTabKey]);
+
+    useEffect(()=>{
+          
+    },[tableDataFilterParams])
+
+
+    useEffect(() => {
+        getPageLeftData();
+        set_tableColumns(columnOne);
+    }, [])
+
+
+
+    return (
+        <BMSPagecontainer title={false} className='SecondaryDistriGroupSet'>
+
+            <ModalForm title={'新增分组核算单元'} width={400} 
+            submitter={{
+                render: (props, defaultDoms) => []
+            }} 
+            open={ifShowModal} modalProps={{
+                closable: false,
+            }}>
+                <TableSelecter
+                    ref={ref}
+                    record={undefined}
+                    tableSelecterColumn={tableSelecterUnitColumn}
+                ></TableSelecter>
+            </ModalForm>
+
+            <div className='left'>
+                <div className='toolbar'>
+                    <Input placeholder={'请输入分组名称'} allowClear
+                        suffix={
+                            <IconFont style={{ color: '#99A6BF' }} type="iconsousuo" />
+                        }
+                        style={{ width: 156 }}
+                        onChange={(e) => {
+                            const result = typeList.filter(item => item.groupName.indexOf(e.target.value) != -1);
+                            set_showTypeListArr(result);
+                        }}
+                    />
+
+                    <UpDataActBtn key={'act'} record={undefined} type='ADD_LEFTDATA' />
+
+                </div>
+
+                <div className='wrap'>
+                    {
+                        showTypeListArr.map((item, index) => {
+                            return (
+                                <div className={currentSelectedType ? currentSelectedType.id == item.id ? 'type on' : 'type' : 'type'}
+                                    key={index}
+                                    onClick={() => {
+                                        if (ifEditTable) {
+                                            //编辑状态还未保存
+                                            Modal.confirm({
+                                                title: '当前存在编辑未保存,请保存后再操作!',
+                                                okText: '放弃编辑',
+                                                cancelText: '继续编辑',
+                                                onOk(...args) {
+                                                    set_ifEditTable(false);
+                                                    set_currentSelectedType(item);
+
+                                                },
+                                            })
+                                        } else {
+                                            set_currentSelectedType(item)
+                                        }
+                                    }}
+                                >
+                                    <div className='content'>
+                                        <div className='name'>{item.groupName}</div>
+                                    </div>
+
+                                    <Dropdown menu={{ items: moreItems }} placement="bottom" onOpenChange={(bool) => { bool && set_currentEditLeftData(item) }}>
+                                        <div className='more'>
+                                            <img src={require('../../../../../static/more_point_gray.png')} alt="" />
+                                        </div>
+                                    </Dropdown>
+                                </div>
+                            )
+                        })
+                    }
+                </div>
+            </div>
+            <div className='right'>
+                <Tabs
+                    defaultActiveKey="1"
+                    onChange={onTabChange}
+                    items={[
+                        {
+                            label: `核算单元`,
+                            key: '1',
+                        },
+                        {
+                            label: `二次分配项目`,
+                            key: '2',
+                        },
+                    ]}
+                />
+                <div className='toolBar'>
+                    <div className='filter'>
+                        <div className='filterItem'>
+                            <span className='label' style={{ whiteSpace: 'nowrap' }}> 检索:</span>
+                            <Input placeholder={currentTabKey == '1'?'核算单元名称':'请输入项目名称'} allowClear
+                                suffix={
+                                    <IconFont style={{ color: '#99A6BF' }} type="iconsousuo" onClick={() => getTableData({keywords:tableDataSearchKeywords})} />
+                                }
+                                onChange={(e) => {
+                                    set_tableDataSearchKeywords(e.target.value);
+                                    if (e.target.value.length == 0) {
+                                        getTableData({keywords:''});
+                                    }
+                                }}
+                                onPressEnter={(e) => {
+                                    getTableData({keywords:tableDataSearchKeywords});
+                                }}
+
+                            />
+                        </div>
+                    </div>
+                    <div className='btnGroup'>
+                        {currentTabKey == '1'?<span className='manaBtn' onClick={() => addGroupEmpHandle()}>添加</span>:<AddItemComponent />}
+                    </div>
+                </div>
+                <div style={{ marginTop: 16 }}>
+                    {(currentSelectedType&&currentTabKey) && <BMSTable actionRef={tableRef} columns={tableColumns}
+                        rowKey='id'
+                        pagination={false}
+                        tableAlertRender={false}
+                        rowSelection={ currentTabKey == '1'?{
+                            // 自定义选择项参考: https://ant.design/components/table-cn/#components-table-demo-row-selection-custom
+                            // 注释该行则默认不显示下拉选项
+                            //selections: [Table.SELECTION_ALL, Table.SELECTION_INVERT, Table.SELECTION_NONE,],
+                            onChange: onTableSelectChange,
+
+                        }:false}
+                        tableAlertOptionRender={() => {
+                            return (
+
+                                <Space size={16}>
+                                    <Popconfirm
+                                        title="是否确认删除?"
+                                        key="del"
+                                        onConfirm={() => delTableDataHanfle()}
+                                    >
+                                        <a>批量删除</a>
+                                    </Popconfirm>
+                                </Space>
+                            );
+                        }}
+                        params={tableDataFilterParams}
+                        dataSource={dataSource}
+                        //request={currentTabKey == '1'?(params, sort, filter) => getTableData(params, sort, filter):undefined}
+                        components={currentTabKey == '2' ? {
+                            body: {
+                                wrapper: DraggableContainer,
+                                row: DraggableBodyRow,
+                            },
+                        } : undefined}
+                    />}
+                </div>
+            </div>
+            {
+                tableSelectedKeys.length > 0 && (
+                    <div className='bottomToolbar'>
+                        <span className='leftAccount'>已选择<a>{tableSelectedKeys.length}</a>项</span>
+                        <div className='btnGroup'>
+                            <span className='cancel' onClick={() => tableRef.current?.clearSelected && tableRef.current?.clearSelected()}>取消选择</span>
+                            <Popconfirm
+                                title="是否确认删除?"
+                                key="del"
+                                onConfirm={() => delTableDataHanfle()}
+                            >
+                                <span className='batchDel'>批量删除</span>
+                            </Popconfirm>
+
+                        </div>
+                    </div>
+                )
+            }
+
+        </BMSPagecontainer >
+    )
+}
+
+
+export default SecondaryDistriGroupSet;

+ 134 - 0
src/pages/setting/projectSetting/secondaryDistriGroupSet/service.ts

@@ -0,0 +1,134 @@
+/*
+ * @Author: code4eat awesomedema@gmail.com
+ * @Date: 2023-03-07 11:12:10
+ * @LastEditors: code4eat awesomedema@gmail.com
+ * @LastEditTime: 2023-07-26 16:45:23
+ * @FilePath: /KC-MiddlePlatform/src/pages/platform/setting/pubDicMana/service.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+
+
+
+
+import { getManaIndexGroup } from '@/pages/budgetMana/monthlyDataCheck/service';
+import { Key } from 'react';
+import { request } from 'umi';
+
+
+//获取左侧医疗组
+export const getMedicalGroup = () => {
+  return request('/performance/secondGroup/list', {
+    method: 'GET',
+  });
+};
+
+//获取表格数据
+export const getEmpTableDataFromMedicalGroup = (params:{secondGroupCode:string;itemName?:string;unitName?:string},type:1|2) => {
+    if(type == 1){
+      return request('/performance/secondGroup/secondUnitList', {
+        method: 'GET',
+        params:{...params}
+      });
+    }
+    if(type == 2){
+      return request('/performance/secondGroup/secondItemList', {
+        method: 'GET',
+        params:{...params}
+      });
+    }
+    
+};
+
+
+//新增医疗组
+export const addMedicalGroup = (data:any) => {
+  return request('/performance/secondGroup/add', {
+    method: 'POST',
+    data
+  });
+};
+
+
+//编辑医疗组
+export const editMedicalGroup = (data:any) => {
+  return request('/performance/secondGroup/edit', {
+    method: 'POST',
+    data
+  });
+};
+
+
+//删除左侧数据
+export const delLeftReportData = (id:number) => {
+  return request('/performance/secondGroup/delete', {
+    method: 'POST',
+    params:{id}
+  });
+};
+
+
+
+//分组添加核算单元
+
+type AddMedicalGroupEmpDataType = {secondGroupCode:string,unitCodeList:Key[]}
+export const addMedicalGroupEmp = (data:AddMedicalGroupEmpDataType) => {
+  return request('/performance/secondGroup/unitAdd', {
+    method: 'POST',
+    data
+  });
+};
+
+
+
+//编辑表格数据
+
+export const updateMedicalGroupEmpInfo = (data:any) => {
+    return request('/performance/unit/editMedicalGroupMap', {
+      method: 'POST',
+      data
+    });
+};
+
+
+
+
+
+
+//删除表格操作
+export const delTableData = (ids:number[]) => {
+    return request('/performance/secondGroup/unitRemove', {
+      method: 'POST',
+      data:[...ids]
+    });
+};
+
+
+//获取核算单元列表
+
+export const getAllUnitList = (params:{secondGroupCode:string}) => {
+  return request('/performance/secondGroup/unitList', {
+    method: 'GET',
+    params
+  });
+};
+
+//添加分组项目列表
+
+export const addGroupItemList = (data:any) => {
+  return request('/performance/secondGroup/secondItemAdd', {
+    method: 'POST',
+    data
+  });
+};
+
+//编辑分组项目列表
+
+export const editGroupItemList = (data:any) => {
+  return request('/performance/secondGroup/secondItemEdit', {
+    method: 'POST',
+    data
+  });
+};
+
+
+

+ 307 - 0
src/pages/setting/projectSetting/secondaryDistriGroupSet/style.less

@@ -0,0 +1,307 @@
+.row-dragging {
+
+  .bms-ant-table-cell {
+    width: 130px;
+  }
+}
+
+.TableSelecter {
+       .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;
+                }
+            }
+
+       }
+}
+
+.SecondaryDistriGroupSet-ModalForm {
+  .item {
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+    align-items: center;
+
+    .delIcon {
+      position: relative;
+      top:3px;
+      cursor: pointer;
+      display:flex;
+      justify-content: center;
+      align-items: center;
+      width: 24px;
+      height: 24px;
+      background: #FAFCFF;
+      border-radius: 4px;
+      border: 1px solid #DAE2F2;
+      .iconshanchu {
+        color: #17181A !important;
+        svg {
+          color: #17181A !important;
+        }
+      }
+    }
+  }
+  .addBtn {
+    cursor: pointer;
+    display: flex;
+    flex-direction: row;
+    justify-content: center;
+    align-items: center;
+    width: 320px;
+    height: 40px;
+    background: #FFFFFF;
+    border-radius: 4px;
+    color: #3376FE;
+    border: 1px dashed #CFD6E6;
+
+    &>span {
+       margin-left: 8px;
+    }
+  }
+}
+
+.SecondaryDistriGroupSet {
+  width: 100%;
+  overflow: hidden;
+
+  .left {
+    float: left;
+    border-radius: 4px;
+    width: 220px;
+    height: calc(100vh - 80px);
+    overflow: scroll;
+    margin-right: 16px;
+    padding: 16px 8px;
+    background: #FFFFFF;
+
+    .toolbar {
+      display: flex;
+      flex-direction: row;
+      justify-content: space-between;
+      align-items: center;
+      padding: 0 8px;
+
+      .add {
+        cursor: pointer;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        width: 24px;
+        height: 24px;
+        background: #FAFCFF;
+        border-radius: 4px;
+        border: 1px solid #DAE2F2;
+
+        &>img {
+          width: 16px;
+          height: 16px;
+        }
+      }
+    }
+
+    .wrap {
+      margin-top: 16px;
+
+      .type {
+        cursor: pointer;
+        height: 32px;
+        border-radius: 4px;
+        background: #FFFFFF;
+        display: flex;
+        padding-left: 8px;
+        padding-right: 8px;
+        flex-direction: row;
+        justify-content: space-between;
+        align-items: center;
+        margin-bottom: 4px;
+
+        .icon {
+          width: 25px;
+          height: 25px;
+        }
+
+        .content {
+          width: 80%;
+          padding-left: 7px;
+
+          .name {
+            height: 15px;
+            font-size: 14px;
+            font-family: SourceHanSansCN-Medium, SourceHanSansCN;
+            font-weight: 400;
+            color: #17181A;
+            line-height: 15px;
+            overflow: hidden;
+            white-space: nowrap;
+            text-overflow: ellipsis;
+          }
+        }
+
+        .more {
+          display: flex;
+          justify-content: center;
+          align-items: center;
+          cursor: pointer;
+          width: 16px;
+          height: 16px;
+          border-radius: 4px;
+          background: #FFFFFF;
+
+          &>img {
+            width: 100%;
+            height: 100%;
+          }
+        }
+
+        &.on {
+          background: #F0F2F5;
+
+          .content {
+            .name {
+              font-weight: 500;
+              color: #17181A;
+            }
+          }
+        }
+
+        &:last-child {
+          margin-bottom: 0;
+        }
+      }
+    }
+  }
+
+  .right {
+    float: left;
+    width: calc(100% - 236px);
+    padding: 16px;
+    padding-top: 0;
+    border-radius: 4px;
+    background: #FFFFFF;
+
+    .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 {
+        .manaBtn,.score {
+          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;
+        }
+
+        .inner {
+          &>span {
+            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;
+            margin-left: 8px;
+          }
+
+        }
+      }
+
+
+    }
+  }
+
+  .bottomToolbar {
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+    align-items: center;
+    position: fixed;
+    left:200px;
+    bottom: 0;
+    padding: 0 16px;
+    width:calc(100% - 200px);
+    height: 48px;
+    background: #FFFFFF;
+    box-shadow: 0px -8px 16px 0px rgba(64, 85, 128, 0.1);
+
+    .leftAccount {
+      font-size: 14px;
+      font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+      font-weight: 400;
+      color: #17181A;
+      line-height: 21px;
+
+    }
+    .btnGroup {
+        .cancel {
+          display: inline-block;
+          width: 80px;
+          height: 24px;
+          border-radius: 4px;
+          font-size: 14px;
+          text-align: center;
+          line-height: 23px;
+          margin-right: 8px;
+          cursor: pointer;
+          border: 1px solid #DAE2F2;
+        }
+        .batchDel {
+          display: inline-block;
+          width: 80px;
+          height: 24px;
+          border-radius: 4px;
+          font-size: 14px;
+          text-align: center;
+          line-height: 23px;
+          color: #FFFFFF;
+          cursor: pointer;
+          background: #3377FF;
+        }
+    }
+  }
+}

+ 2 - 2
src/pages/setting/projectSetting/secondaryProjectDistribute/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-07-21 17:09:36
+ * @LastEditTime: 2023-07-27 18:01:26
  * @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
  */
@@ -291,7 +291,7 @@ export default function BilingProjectMana() {
                                                 },
                                             }}
                                             width={160} />
-                                            <Form.Item name={`levelRate${item.id}`} label='占比(请输入小数):'>
+                                            <Form.Item name={`levelRate${item.id}`} label='系数(请输入小数):'>
                                                 <InputNumber
                                                     style={{ width: 120, height: 24, position: 'relative', top: 0 }}
                                                     onChange={(value) => {

+ 24 - 3
src/pages/setting/reportSet/reportListMana/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-07-14 10:40:37
+ * @LastEditTime: 2023-07-27 18:03:03
  * @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
  */
@@ -20,7 +20,7 @@ import { ProColumns } from '@ant-design/pro-table';
 import { Input, message, Popconfirm } from 'antd';
 import { useEffect, useRef, useState } from 'react';
 
-import { addChildReportList, addData, delData, editData, getChildReportList, getManaIndic, getReportListTableData, getReportListType } from './service';
+import { addChildReportList, addData, delData, editData, getChildReportList, getManaIndic, getReportListTableData, getReportListType, getReportListTypeFromDic } from './service';
 
 import './style.less';
 
@@ -593,7 +593,7 @@ export default function ReportListMana() {
                 <div className='filter'>
                     <div className='filterItem'>
                         <span className='label' style={{ whiteSpace: 'nowrap' }}> 检索:</span>
-                        <Input placeholder={'请输入列标题'} allowClear
+                        <Input placeholder={'请输入列标题'} allowClear width={160}
                             suffix={
                                 <IconFont type="iconsousuo" onClick={() => tableDataSearchHandle('columnName')} />
                             }
@@ -616,6 +616,27 @@ export default function ReportListMana() {
 
                         />
                     </div>
+                    <div className='filterItem' style={{marginLeft:16}}>
+                        <span className='label' style={{ whiteSpace: 'nowrap' }}> 类型:</span>
+                        <ProFormSelect noStyle placeholder={'请选择类型'} 
+                           width={160}
+                           request={async ()=>{
+                              const resp = await getReportListTypeFromDic();
+                              if(resp){
+                                return resp.list.map((a:any)=>({label:a.name,value:a.code}));
+                              }
+                              return []
+                           }}
+                           fieldProps={{
+                             onChange(value, option) {
+                                set_tableDataFilterParams({
+                                    ...tableDataFilterParams,
+                                    columnType:value
+                                });
+                             },
+                           }}
+                        />
+                    </div>
                 </div>
                 <div className='btnGroup'>
                     <UpDataActBtn record type='ADD' />

+ 10 - 2
src/pages/setting/reportSet/reportListMana/service.ts

@@ -2,7 +2,7 @@
  * @Author: code4eat awesomedema@gmail.com
  * @Date: 2023-03-03 16:31:27
  * @LastEditors: code4eat awesomedema@gmail.com
- * @LastEditTime: 2023-06-30 17:27:16
+ * @LastEditTime: 2023-07-27 18:02:51
  * @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
  */
@@ -63,7 +63,7 @@ export const addData = (data: any) => {
 
 
 
-//获取报表类型
+//获取报表类型
 
 export const getReportListType = () => {
   return request('/performance/dict/getDictDataList?current=1&pageSize=10&typeCode=9', {
@@ -145,6 +145,14 @@ export const addChildReportList = (data: AddChildReportListDataType) => {
   });
 };
 
+//获取报表列类型
+export const getReportListTypeFromDic = () => {
+  return request('/performance/dict/getDictDataList?current=1&pageSize=500&typeCode=11', {
+    method: 'GET',
+  });
+};
+
+