ソースを参照

添加 查核单元项目设定/成本收入项目设定

code4eat 2 年 前
コミット
18ef630b3b

+ 11 - 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-05-10 13:37:08
+ * @LastEditTime: 2023-05-18 10:05:15
  * @FilePath: /BudgetManaSystem/.umirc.ts
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -141,6 +141,16 @@ export default defineConfig({
               path: '/setting/projectSetting/occupationsSecondaryDistriSet',
               component: './setting/projectSetting/occupationsSecondaryDistriSet',
             },
+            {
+              name: '核算单元项目设定',
+              path: '/setting/projectSetting/checkUnitProjectSet',
+              component: './setting/projectSetting/checkUnitProjectSet',
+            },
+            {
+              name: '成本收入项目设定',
+              path: '/setting/projectSetting/costIncomeProjectSet',
+              component: './setting/projectSetting/costIncomeProjectSet',
+            },
           ]
         },
         {

+ 8 - 1
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-05-10 15:56:43
+ * @LastEditTime: 2023-05-19 09:42:37
  * @FilePath: /BudgetManaSystem/src/app.ts
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -348,6 +348,10 @@ const secondaryDistribute = (params: any) => {
   return <IconFont type='icon-ercifenpei' />
 };
 
+const reportCheck = (params: any) => {
+  return <IconFont type='icon-baobiaochaxun' />
+};
+
 //布局配置
 
 export const layout = ({ initialState, setInitialState }: { initialState: any, setInitialState: any }) => {
@@ -451,6 +455,9 @@ export const layout = ({ initialState, setInitialState }: { initialState: any, s
                 if (node.path == '/secondaryDistribute') {
                   node.icon = <Icon component={secondaryDistribute} />;
                 }
+                if (node.path == '/reportCheck') {
+                  node.icon = <Icon component={reportCheck} />;
+                }
               }
               if (node.children) {
                 node.children.forEach((child: any) => addIconToPath(child, paths));

+ 6 - 0
src/global.less

@@ -111,6 +111,12 @@ textarea {
                                             }
                                             
                                         }
+                                        .bms-ant-table-tbody {
+                                            &>tr>td {
+                                               padding-left: 8px !important;
+                                               padding-right: 8px !important;
+                                            }
+                                        }
                                     }
                                 }
                             }

+ 2 - 2
src/pages/secondaryDistribute/employeeInfoCheck/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-05-12 13:48:08
+ * @LastEditTime: 2023-05-12 14:04:42
  * @FilePath: /BudgetManaSystem/src/pages/budgetMana/monthlySet/index.tsx
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -392,7 +392,7 @@ const EmployeeInfoCheck: React.FC = () => {
             title: '注意',
             okText: '确定',
             cancelText: '取消',
-            content: `${commitStatus == '1'?'取消':'提交'}当前选择的核算单元的数据?`,
+            content: `${commitStatus == '1'?'取消提交':'提交'}当前选择的核算单元的数据?`,
             onOk: async () => {
                 const resp = await commitRequest({
                     computeDate: currentComputeDate as string,

+ 2 - 2
src/pages/setting/checkUnitSet/medicalGroupSet/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-05-12 10:19:02
+ * @LastEditTime: 2023-05-12 14:04:00
  * @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
  */
@@ -100,7 +100,7 @@ const MedicalGroupSet = () => {
         const resp = await delTableData(record ? [record.id] : [...tableSelectedKeys]);
 
         if (resp) {
-            set_selectedAddKeys([]);
+            set_tableSelectedKeys([]);
             tableRef.current?.reload();
         }
     }

+ 3 - 3
src/pages/setting/projectSetting/bilingProjectMana/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-05-11 17:33:15
+ * @LastEditTime: 2023-05-15 17:24:09
  * @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
  */
@@ -22,7 +22,7 @@ import { ProColumns } from '@ant-design/pro-table';
 import { Input, message, Popconfirm } from 'antd';
 import { useEffect, useRef, useState } from 'react'
 
-import { addData, delData, editData, gainData, getData } from './service';
+import { addData, delData, editData, gainData, getBillProjectData } from './service';
 
 import './style.less';
 
@@ -91,7 +91,7 @@ export default function BilingProjectMana() {
 
 
     const getTableData = async (params: any) => {
-        const resp = await getData(params);
+        const resp = await getBillProjectData(params);
         if (resp) {
             return {
                 data: resp.list,

+ 2 - 2
src/pages/setting/projectSetting/bilingProjectMana/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-05-11 13:28:49
+ * @LastEditTime: 2023-05-15 17:23:49
  * @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
  */
@@ -29,7 +29,7 @@ export type BilingProjectTableItemDataType = {
 }
 
 
-export const getData = (params?:any) => {
+export const getBillProjectData = (params?:any) => {
   return request<{
        current:number;
        list:BilingProjectTableItemDataType[];

+ 1136 - 0
src/pages/setting/projectSetting/checkUnitProjectSet/index.tsx

@@ -0,0 +1,1136 @@
+
+
+/*
+ * @Author: code4eat awesomedema@gmail.com
+ * @Date: 2022-12-16 09:42:52
+ * @LastEditors: code4eat awesomedema@gmail.com
+ * @LastEditTime: 2023-05-19 11:06:04
+ * @FilePath: /BudgetManaSystem/src/pages/budgetMana/monthlySet/index.tsx
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+
+
+
+import BMSPagecontainer from '@/components/BMSPageContainer';
+
+import { Fragment, Key, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
+import './style.less';
+
+import { Tree, TreeProps, Tabs, Input, Modal, Transfer, Popconfirm, message, Popover, Select } from 'antd';
+import { DataNode } from 'antd/es/tree';
+
+import expandedIcon from '../../../../../static/treenode_open.png';
+import closeIcon from '../../../../../static/treenode_collapse.png';
+import { BMSTable } from '@/components/BMSTable';
+import { ActionType, ModalForm, ProColumns, ProColumnType, ProFormDigit, ProFormSelect } from '@ant-design/pro-components';
+import { createFromIconfontCN } from '@ant-design/icons';
+import { delRequest, getIndicTableData, getBillingItemTableData, getTreeDataRespType, getTreeData, getAllCheckUnit, saveCopyRequest, getAllCheckUnitProjectData, addBillingItemData, editBillingItemData, addIndicItemData, editIndicItemData, getNonCheckTableData, addNonCheckItemData } from './service';
+import { TransferItem, TransferProps } from 'antd/es/transfer';
+import { getComputeDate } from '@/pages/Home/service';
+
+
+import 'dayjs/locale/zh-cn';
+
+import React from 'react';
+import DirectoryTree from 'antd/es/tree/DirectoryTree';
+import { getDeepestTreeData } from '@/utils/tooljs';
+import { ColumnsType, TableRowSelection } from 'antd/es/table/interface';
+import { difference } from 'lodash';
+import { getBillProjectData } from '../bilingProjectMana/service';
+import { getIndicProjectTableData } from '../indicProjectMana/service';
+import { getNonCheckProjectTableData } from '../nonAssessmentProjectMana/service';
+
+
+
+
+const IconFont = createFromIconfontCN({
+    scriptUrl: '//at.alicdn.com/t/c/font_1927152_4nm5kxbv4m3.js',
+});
+
+const SearchIcon = createFromIconfontCN({
+    scriptUrl: '//at.alicdn.com/t/c/font_1927152_p7y3y2t8lg.js',
+});
+
+
+
+export type TableListItem = {
+    key: number;
+    name: string;
+};
+
+
+const CheckUnitProjectSet: React.FC = () => {
+
+    const [treeData, set_treeData] = useState<getTreeDataRespType[]>([]);
+    const [tableColumn, set_tableColumn] = useState<ProColumns[]>([]);
+    const [currentSelectedTreeNode, set_currentSelectedTreeNode] = useState<any | undefined>();
+    const [currentSelectedTabKey, set_currentSelectedTabKey] = useState<string>('1');
+    const [currentComputeDate, set_currentComputeDate] = useState<string | undefined>();
+    const [currentEditRow, set_currentEditRow] = useState<any>(undefined);
+
+
+    const [searchKeywords, set_searchKeywords] = useState('');
+
+    const [searchParams, set_searchParams] = useState<any>({});
+
+    const [expandedKeys, setExpandedKeys] = useState<React.Key[]>([]);
+    const [searchValue, setSearchValue] = useState('');
+    const [autoExpandParent, setAutoExpandParent] = useState(true);
+
+    const [ifEdit, set_ifEdit] = useState(false);
+
+    const [ifShowModal, set_ifShowModal] = useState(false);
+
+    const ref = React.createRef<{ save: any; getSelectedKeys: any }>();
+
+
+
+    const tableRef = useRef<ActionType>();
+
+
+    const billingTableColumn: ProColumns[] = [
+        {
+            title: '项目代码',
+            dataIndex: 'itemPointCode',
+            renderText(text, record, index, action) {
+                return <span style={{ display: 'inline-block', height: '26px', lineHeight: '26px' }}>{text}</span>
+            },
+        },
+        {
+            title: '项目名称',
+            dataIndex: 'itemName',
+        },
+        {
+            title: '项目类别',
+            dataIndex: 'itemType',
+        },
+        {
+            title: '点值',
+            width: 120,
+            dataIndex: 'orderPointValue',
+            renderText:(text, record, index, action)=>{
+                if (ifEdit && currentEditRow?.id == record.id) {
+                    return <ProFormDigit noStyle fieldProps={{
+                        defaultValue: text, onChange(value) {
+                            // console.log({value,currentEditRow});
+                            if (value && currentEditRow) {
+                                set_currentEditRow({ ...currentEditRow, orderPointValue: value })
+                            }
+                        },
+                    }} width={80} />
+                } else {
+                    return <span style={{ display: 'inline-block', width: 80 }}>{text}</span>
+                }
+            },
+        },
+        {
+            title: '类型',
+            width: 120,
+            dataIndex: 'coreFlagName',
+            renderText:(text, record, index, action)=>{
+                if (ifEdit && currentEditRow && currentEditRow?.id == record.id) {
+                    return <Select defaultValue={record.coreFlag} options={
+                        [
+                            { label: '核心', value: 1 }, { label: '非核心', value: 0 }
+                        ]
+                    } onChange={(a, b) => { set_currentEditRow({ ...currentEditRow, coreFlag: a }) }} />
+                } else {
+                    return <span style={{ display: 'inline-block', width: 80 }}>{text}</span>
+                }
+            },
+        }
+    ];
+
+    const indicTableColumn: ProColumns[] = [
+        {
+            title: '项目代码',
+            dataIndex: 'indicatorCode',
+            renderText(text, record, index, action) {
+                return <span style={{ display: 'inline-block', height: '26px', lineHeight: '26px' }}>{text}</span>
+            },
+        },
+        {
+            title: '项目名称',
+            dataIndex: 'indicatorName',
+        },
+        {
+            title: '类型',
+            dataIndex: 'indicatorTypeName',
+        },
+        {
+            title: '定义',
+            dataIndex: 'indicatorDefinition',
+        },
+        {
+            title: '点值',
+            width: 120,
+            dataIndex: 'orderPointValue',
+            renderText(text, record, index, action) {
+                if (ifEdit && currentEditRow?.id == record.id) {
+                    return <ProFormDigit noStyle fieldProps={{
+                        defaultValue: text, onChange(value) {
+                            console.log({ value, currentEditRow });
+                            if (value && currentEditRow) {
+                                set_currentEditRow({ ...currentEditRow, orderPointValue: value })
+                            }
+                        },
+                    }} width={80} />
+                } else {
+                    return <span style={{ display: 'inline-block', width: 80 }}>{text}</span>
+                }
+            },
+        }
+    ];
+    const nonCheckTableColumn: ProColumns[] = [
+        {
+            title: '项目名称',
+            dataIndex: 'nonAssessmentName',
+            renderText(text, record, index, action) {
+                return <span style={{ display: 'inline-block', height: '26px', lineHeight: '26px' }}>{text}</span>
+            },
+        },
+        {
+            title: '分配方式',
+            dataIndex: 'distributionTypeName',
+        },
+        {
+            title: '分配对象',
+            dataIndex: 'distributionTargetName',
+        },
+        {
+            title: '上限值',
+            dataIndex: 'ceiling',
+        },
+        {
+            title: '评分项',
+            width: 260,
+            dataIndex: 'orderPointValue',
+            ellipsis:true,
+            renderText(text, record) {
+                return record.secondItem?record.secondItem.reduce((prev: any,cur: any)=>`${prev.length>0?prev+'|':prev}${cur.secondItemName}`,''):''
+            },
+        }
+    ];
+
+
+    const delHandle = async (record: any) => {
+        const {  id  } = record;
+        const resp = await delRequest({id: id},currentSelectedTabKey);
+        if (resp) {
+            message.success('操作成功');
+            tableRef.current?.reload();
+        }
+    }
+
+
+
+    const onSelect: TreeProps['onSelect'] = (selectedKeys, info) => {
+        // console.log('selected', selectedKeys, info);
+        const { node } = info;
+        set_currentSelectedTreeNode(node);
+    };
+
+
+    const getCurrentComputeDate = async () => {
+        const resp = await getComputeDate();
+        set_currentComputeDate(resp);
+    }
+
+
+    const onTabChange = (activeKey: string) => {
+        set_currentSelectedTabKey(activeKey);
+    }
+
+
+
+
+    const getTableData = async (type: 'BILL' | 'INDIC' | 'NONCHECK', params: any, sort: any, filter: any) => {
+        // console.log({ currentSelectedTreeNode });
+        // console.log({ params, sort, filter });
+
+        if (currentSelectedTreeNode && currentComputeDate) {
+            if (type == 'BILL') {
+                const resp = await getBillingItemTableData({
+                    unitCode: currentSelectedTreeNode.code,
+                    ...params,
+                });
+                if (resp) {
+                    return {
+                        data: resp.list,
+                        success: true,
+                        total: resp.totalCount,
+                        pageSize: resp.pageSize,
+                        totalPage: resp.totalPage,
+                    }
+                }
+                return {
+                    data: [],
+                    success: true
+                }
+            }
+            if (type == 'INDIC') {
+                const resp = await getIndicTableData({
+                    unitCode: currentSelectedTreeNode.code,
+                    ...params
+                });
+                if (resp) {
+                    return {
+                        data: resp.list,
+                        success: true,
+                        total: resp.totalCount,
+                        pageSize: resp.pageSize,
+                        totalPage: resp.totalPage,
+                    }
+                }
+                return {
+                    data: [],
+                    success: true
+                }
+            }
+            if (type == 'NONCHECK') {
+                const resp = await getNonCheckTableData({
+                    unitCode: currentSelectedTreeNode.code,
+                    ...params
+                });
+                if (resp) {
+
+                    return {
+                        data: resp.list,
+                        success: true,
+                        total: resp.totalCount,
+                        pageSize: resp.pageSize,
+                        totalPage: resp.totalPage,
+                    }
+                }
+                return {
+                    data: [],
+                    success: true
+                }
+            }
+        }
+
+        return []
+    }
+
+
+    interface TableTransferProps extends TransferProps<TransferItem> {
+        leftColumns: ColumnsType<any>;
+        rightColumns: ColumnsType<any>;
+    }
+
+
+    const transferTableColumn = [
+        {
+            title: '项目名称',
+            dataIndex: 'itemName',
+            ellipsis: true,
+            width: 220
+        },
+        {
+            title: '类型',
+            dataIndex: 'itemType',
+
+        },
+    ];
+
+    const tableSelecterColumn = [
+        {
+            title: '核算单元名称',
+            dataIndex: 'unitName',
+        },
+        {
+            title: '职类',
+            dataIndex: 'unitTypeName',
+
+        },
+    ]
+
+
+
+    const openCopyHandleModal = () => {
+
+        set_ifShowModal(true);
+    }
+
+    const openTransfer = () => {
+        const ref = React.createRef<{ save: any }>();
+        Modal.confirm({
+            title: '添加',
+            icon: <></>,
+            width: 800,
+            okText: '确定',
+            cancelText: '取消',
+            content: <TableTransfer
+                ref={ref}
+                leftColumns={transferTableColumn}
+                rightColumns={transferTableColumn}
+            ></TableTransfer>,
+            onOk: () => {
+                return ref.current && ref.current.save();
+            }
+        })
+    }
+
+    interface TableSelecterProps extends TransferProps<TransferItem> {
+        tableSelecterColumn: any[];
+        record: any
+    }
+
+    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 getAllCheckUnit();
+            if (resp) {
+                const filteredData = resp.filter((a:any)=>a.code != currentSelectedTreeNode.code);
+                set_datasource(filteredData);
+                set_showList(filteredData);
+            }
+        }
+
+
+        const onSelectChange = (newSelectedRowKeys: React.Key[]) => {
+            setSelectedKeys([...newSelectedRowKeys]);
+
+        };
+
+        const save = async () => {
+
+            const result = {
+                unitCodeList: selectedKeys,
+                unitCode: currentSelectedTreeNode.code
+            };
+
+            const resp = await saveCopyRequest(result, currentSelectedTabKey);
+
+            if (resp) {
+                message.success('复制成功!');
+                set_ifShowModal(false);
+                tableRef.current?.reload();
+            }
+
+        }
+
+        useEffect(() => {
+            getFuncList();
+        }, [])
+
+        return (
+            <div className='TableSelecter'>
+                <Input placeholder={'请输入'} allowClear
+                    suffix={
+                        <IconFont 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
+                        // 注释该行则默认不显示下拉选项
+                        onChange: onSelectChange,
+                    }}
+                    pagination={{ showSizeChanger: false, pageSize: 10, 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 TableTransfer = React.forwardRef(({ leftColumns, rightColumns, ...restProps }: TableTransferProps, ref) => {
+
+        const [_data, _set_data] = useState<any>();
+        const [targetKeys, setTargetKeys] = useState<string[]>([]);
+        const [datasource, set_datasource] = useState<any[]>([]);
+        const [selectedKeys, setSelectedKeys] = useState<string[]>([]);
+        const [targetData,set_targetData] = useState<any[]>([]);
+
+
+        //获取单元
+        const getFuncList = async () => {
+
+            if (currentSelectedTabKey == '1') {
+                const resp = await getAllCheckUnitProjectData();
+                if (resp) {
+
+                    const resp1 = await getBillingItemTableData({
+                        unitCode: currentSelectedTreeNode.code,
+                        pageSize: 500, current: 1
+                    });
+
+                    if (resp1) {
+                        let allData = resp;
+                        set_targetData(resp1.list);
+                        const defaultSelctedkeys = (resp1.list).map(a => a.itemPointCode);
+                        set_datasource(allData);
+                        setTargetKeys(defaultSelctedkeys);
+                    }
+                }
+            }
+            if (currentSelectedTabKey == '2') {
+                const resp = await getIndicProjectTableData({ pageSize: 500, current: 1 });
+                if (resp) {
+
+                    const resp1 = await getIndicTableData({
+                        unitCode: currentSelectedTreeNode.code,
+                        pageSize: 500, current: 1
+                    });
+
+                    if (resp1) {
+                        set_targetData(resp1.list);
+                        set_datasource(resp.list.map((a: any) => ({ ...a, itemName: a.indicatorName, itemType: a.indicatorTypeName })));
+
+                        const defaultSelctedkeys = (resp1.list).map((a: any) => a.indicatorCode);
+                        setTargetKeys(defaultSelctedkeys);
+                    }
+                }
+            }
+            if (currentSelectedTabKey == '3') {
+                const resp = await getNonCheckProjectTableData({ pageSize: 500, current: 1 });
+                if (resp) {
+
+                    const resp1 = await getNonCheckTableData({
+                        unitCode: currentSelectedTreeNode.code,
+                        pageSize: 1000000, current: 1
+                    });
+
+                    if (resp1) {
+                        set_targetData(resp1.list);
+                        set_datasource(resp.list.map((a: any) => ({ ...a, itemName: a.name, itemType: a.distributionTypeName })));
+
+                        const defaultSelctedkeys = (resp1.list).map((a: any) => a.nonAssessmentCode);
+                        setTargetKeys(defaultSelctedkeys);
+                    }
+                }
+            }
+
+        }
+
+        const onChange = (nextTargetKeys: string[]) => {
+            setTargetKeys(nextTargetKeys);
+        };
+
+        const onSelectChange = (sourceSelectedKeys: string[], targetSelectedKeys: string[]) => {
+            //console.log('sourceSelectedKeys:', sourceSelectedKeys,'targetSelectedKeys:',targetSelectedKeys);
+            setSelectedKeys([...sourceSelectedKeys, ...targetSelectedKeys]);
+        };
+
+        useImperativeHandle(ref, () => ({
+            save: async () => {
+
+                let flag = false;
+
+                if (currentSelectedTabKey == '1') {
+                    const items = datasource.filter(a => targetKeys.includes(a.itemCode));
+                    //拿到当前的表格数据覆盖全量表格数据
+                    const uodatedData = items.map(a=>{
+                        if(targetData.length>0){
+                             const result = targetData.filter(b=>b.itemPointCode == a.code);
+                             if(result.length>0){
+                                  return {
+                                      ...a,
+                                      orderPointValue:result[0].orderPointValue,
+                                      coreFlag:result[0].coreFlag,
+                                  }
+                             }else{
+                                 return a
+                             }
+                        }else{
+                          return a
+                        }
+                  })
+                    const result = {
+                        unitCode: currentSelectedTreeNode.code,
+                        item: uodatedData.map(a=>({
+                            itemPointCode:a.itemCode,
+                            itemName:a.itemName,
+                            orderPointValue:a.orderPointValue,
+                            coreFlag:a.coreFlag
+                        }))
+                    }
+                    const resp = await addBillingItemData(result);
+                    if (resp) {
+                        flag = true
+                    }
+                }
+                if (currentSelectedTabKey == '2') {
+                    const items = datasource.filter(a => targetKeys.includes(a.code));
+
+                    //拿到当前的表格数据覆盖全量表格数据
+                    const uodatedData = items.map(a=>{
+                          if(targetData.length>0){
+                               const result = targetData.filter(b=>b.indicatorCode == a.code);
+                               if(result.length>0){
+                                    return {
+                                        ...a,
+                                        orderPointValue:result[0].orderPointValue
+                                    }
+                               }else{
+                                   return a
+                               }
+                          }else{
+                            return a
+                          }
+                    })
+                    const commitData = uodatedData.map((a:any) => ({
+                        indicatorCode: a.code,
+                        indicatorName: a.indicatorName,
+                        orderPointValue: a.orderPointValue,
+                        executePointValue: a.executePointValue
+                    }))
+                    const result = {
+                        unitCode: currentSelectedTreeNode.code,
+                        indicatorValues: commitData
+                    }
+
+                    const resp = await addIndicItemData(result);
+                    if (resp) {
+                        flag = true
+                    }
+                }
+                if (currentSelectedTabKey == '3') {
+                    const items = datasource.filter(a => targetKeys.includes(a.code));
+                    const commitData = items.map(a => ({
+                        code:a.code,
+                        name:a.name
+                    }))
+                    const result = {
+                        unitCode: currentSelectedTreeNode.code,
+                        assessments: commitData
+                    }
+                    const resp = await addNonCheckItemData(result);
+                    if (resp) {
+                        flag = true
+                    }
+                }
+
+                if (flag) {
+                    message.success('操作成功!');
+                    tableRef.current?.reload();
+                }
+
+            }
+        }));
+
+        useEffect(() => {
+            getFuncList();
+        }, [])
+
+        return (
+            <Transfer className='TableTransfer' showSearch
+                titles={['待选项', '已选项']}
+                locale={{
+                    itemUnit: '项',
+                    itemsUnit: '项',
+                    searchPlaceholder: '请输入',
+                }}
+                oneWay={true}
+                onChange={onChange}
+                onSelectChange={onSelectChange}
+                dataSource={datasource}
+                rowKey={record => record.code}
+                targetKeys={targetKeys}
+                selectedKeys={selectedKeys}
+                filterOption={(inputValue, item) => {
+                    return item.itemName!.indexOf(inputValue) !== -1
+
+                }}
+            >
+                {({
+                    direction,
+                    filteredItems,
+                    onItemSelectAll,
+                    onItemSelect,
+                    selectedKeys: listSelectedKeys,
+                    disabled: listDisabled,
+                }) => {
+
+                    //console.log({ filteredItems, listSelectedKeys, direction });
+                    const columns = direction === 'left' ? leftColumns : rightColumns;
+
+                    const rowSelection: TableRowSelection<TransferItem> = {
+                        getCheckboxProps: (item) => ({ disabled: listDisabled || item.disabled }),
+                        onSelectAll(selected, selectedRows) {
+                            const treeSelectedKeys = selectedRows.map(({ code }) => code);
+                            const diffKeys = selected
+                                ? difference(treeSelectedKeys, listSelectedKeys)
+                                : difference(listSelectedKeys, treeSelectedKeys);
+                            onItemSelectAll(diffKeys as string[], selected);
+                        },
+                        onSelect({ code }, selected) {
+                            onItemSelect(code as string, selected);
+                        },
+                        selectedRowKeys: listSelectedKeys,
+                    };
+
+                    return (
+                        <BMSTable
+                            rowSelection={rowSelection}
+                            columns={columns as TransferItem[]}
+                            dataSource={filteredItems}
+                            size="small"
+                            bordered={false}
+                            rowKey={'code'}
+                            pagination={{ showTitle: false, pageSize: 10, showLessItems: false, simple: true }}
+                            tableAlertRender={false}
+                            style={{ pointerEvents: listDisabled ? 'none' : undefined }}
+                            onRow={({ code, disabled: itemDisabled }) => ({
+                                onClick: () => {
+                                    if (itemDisabled || listDisabled) return;
+                                    onItemSelect(code as string, !listSelectedKeys.includes(code as string));
+                                },
+                            })}
+                        />
+                    );
+                }}
+            </Transfer>
+        )
+    })
+
+
+
+    const tableSearchHandle = () => {
+        set_searchParams({
+            name: searchKeywords
+        })
+    }
+
+    //编辑按钮操作
+    const editBtnHandle = async () => {
+        let flag = false;
+  
+        if (ifEdit) {
+            //保存操作
+            if (currentSelectedTabKey == '1' && currentEditRow) {
+                //收费项目
+                console.log({currentEditRow});
+                const result = {
+                    id: currentEditRow.id,
+                    unitCode: currentSelectedTreeNode.code,
+                    orderPointValue: `${currentEditRow.orderPointValue}`,
+                    coreFlag: currentEditRow.coreFlag
+                }
+                const resp = await editBillingItemData(result);
+                if (resp) flag = true;
+            }
+            if (currentSelectedTabKey == '2' && currentEditRow) {
+                //收费项目
+                const result = {
+                    id: currentEditRow.id,
+                    unitCode: currentSelectedTreeNode.code,
+                    indicatorCode: currentEditRow.indicatorCode,
+                    indicatorName: currentEditRow.indicatorName,
+                    orderPointValue: currentEditRow.orderPointValue,
+                    executePointValue: currentEditRow.executePointValue
+                }
+                const resp = await editIndicItemData(result);
+                if (resp) flag = true;
+            }
+        } else {
+            //开启编辑模式
+            set_ifEdit(true);
+        }
+
+        if (flag) {
+            set_ifEdit(false);
+            message.success('操作成功!');
+            tableRef.current?.reload();
+        }
+    }
+
+
+    const dataList: any[] = [];
+
+    const getParentKey = (key: React.Key, tree: any[]): React.Key => {
+        let parentKey: React.Key;
+        for (let i = 0; i < tree.length; i++) {
+            const node = tree[i];
+            if (node.child) {
+                if (node.child.some((item: { code: React.Key; }) => item.code === key)) {
+                    parentKey = node.code;
+                } else if (getParentKey(key, node.child)) {
+                    parentKey = getParentKey(key, node.child);
+                }
+            }
+        }
+        return parentKey!;
+    };
+
+
+    const onTreeSearchKeyChange = (e: React.ChangeEvent<HTMLInputElement>) => {
+
+        const { value } = e.target;
+        const newExpandedKeys = dataList
+            .map((item) => {
+                if (item.name.indexOf(value) > -1) {
+                    return getParentKey(item.code, treeData);
+                }
+                return null;
+            });
+
+        const b = newExpandedKeys.filter((item, i, self) => item && self.indexOf(item) === i);
+
+        setExpandedKeys(newExpandedKeys as React.Key[]);
+        setSearchValue(value);
+        setAutoExpandParent(true);
+    }
+
+
+    const onExpand = (newExpandedKeys: React.Key[]) => {
+        setExpandedKeys(newExpandedKeys);
+        setAutoExpandParent(false);
+    };
+
+    const generateList = (data: getTreeDataRespType[]) => {
+        for (let i = 0; i < data.length; i++) {
+            const node = data[i];
+            const { code, name } = node;
+            dataList.push({ code: code, name: name });
+            if (node.child) {
+                generateList(node.child);
+            }
+        }
+    };
+    generateList(treeData as any);
+
+
+    const getTreeReqFunc = async (computeDate: string) => {
+        const resp = await getTreeData(computeDate);
+        set_treeData(resp);
+    }
+
+    const setTableColumn = () => {
+        if (currentSelectedTabKey == '1') {
+            set_tableColumn(billingTableColumn);
+        }
+        if (currentSelectedTabKey == '2') {
+            set_tableColumn(indicTableColumn);
+        }
+        if (currentSelectedTabKey == '3') {
+            set_tableColumn(nonCheckTableColumn);
+        }
+    }
+
+    useEffect(() => {
+
+        if (currentComputeDate) {
+            getTreeReqFunc(currentComputeDate);
+        }
+    }, [currentComputeDate]);
+
+    useEffect(() => {
+        setTableColumn();
+    }, [ifEdit]);
+
+
+    useEffect(() => {
+        tableRef.current?.reload();
+    }, [currentSelectedTreeNode]);
+
+    useEffect(() => {
+        setTableColumn();
+    }, [currentSelectedTabKey]);
+
+
+    useEffect(() => {
+        //初始化左侧树结构数据后
+
+        if (treeData?.length > 0) {
+
+            if (treeData[0].child && treeData[0].child.length > 0) {
+                const [node, nodeParent] = getDeepestTreeData(treeData[0], 'child');
+
+                set_currentSelectedTreeNode(node);
+                setExpandedKeys([nodeParent.code]);
+            }
+        }
+    }, [treeData]);
+
+
+
+
+    useEffect(() => {
+        set_tableColumn(billingTableColumn as ProColumns[]);
+        getCurrentComputeDate();
+
+    }, []);
+
+
+    return (
+        <div className='CheckUnitProjectSet'>
+
+            <ModalForm title={'添加医疗组人员信息'} width={400} submitter={{
+                render: (props, defaultDoms) => []
+            }} open={ifShowModal} modalProps={{
+                closable: false,
+            }}>
+                <TableSelecter
+                    ref={ref}
+                    record={undefined}
+                    tableSelecterColumn={tableSelecterColumn}
+                ></TableSelecter>
+            </ModalForm>
+
+            <div className='leftTree'>
+                <div className='search'>
+                    <Input
+                        className='searchInput'
+                        placeholder="请输入类目名称"
+                        size='small'
+                        allowClear
+
+                        style={{ marginBottom: 16 }}
+                        onChange={onTreeSearchKeyChange}
+                        suffix={
+                            <SearchIcon type='iconsousuo' />
+                        }
+                    />
+                </div>
+                {
+                    treeData && treeData.length > 0 && currentSelectedTreeNode && (
+                        <DirectoryTree
+                            fieldNames={{ title: 'name', key: 'code', children: 'child' }}
+                            rootStyle={{ height: '100%', paddingBottom: 50, overflowY: 'scroll', overflowX: 'hidden' }}
+                            onSelect={onSelect}
+                            onExpand={onExpand}
+                            expandedKeys={expandedKeys}
+                            autoExpandParent={autoExpandParent}
+                            selectedKeys={[currentSelectedTreeNode.code]}
+                            blockNode={true}
+                            icon={() => null}
+                            titleRender={
+                                (nodeData: any) => {
+                                    const strTitle = nodeData.name as string;
+                                    const index = strTitle.indexOf(searchValue);
+                                    const beforeStr = strTitle.substring(0, index);
+                                    const afterStr = strTitle.slice(index + searchValue.length);
+                                    const title =
+                                        index > -1 ? (
+                                            <span>
+                                                {beforeStr}
+                                                <span className="site-tree-search-value" style={{ color: 'red', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{searchValue}</span>
+                                                {afterStr}
+                                            </span>
+                                        ) : (
+                                            <span className='strTitle'>{strTitle}</span>
+                                        );
+                                    return <div style={{
+                                        display: 'flex', flexDirection: 'row',
+                                        width: '100%',
+                                        justifyContent: 'flex-start', alignItems: 'center', height: 32,
+                                        borderRadius: '4px',
+                                        overflow: 'hidden',
+                                        color: '#17181A',
+                                        textOverflow: 'ellipsis',
+                                        whiteSpace: 'nowrap'
+
+                                    }}>{title}</div>
+                                }
+                            }
+                            defaultSelectedKeys={[treeData[0].child[0].code]}
+                            treeData={treeData as unknown as DataNode[]}
+                            // treeData={treeDataNew}
+                            switcherIcon={(props: any) => {
+                                const { expanded } = props;
+                                return !expanded ? <img style={{ width: 20, height: 20, position: 'relative', top: 5 }} src={expandedIcon} /> : <img style={{ width: 20, height: 20, position: 'relative', top: 5 }} src={closeIcon} />
+                            }}
+                        />
+                    )
+                }
+            </div>
+            {/* <div style={{width:16,height:'92vh',background:'#F5F7FA'}}></div> */}
+            <div className='rightContent'>
+                <BMSPagecontainer title={false} ghost>
+                    <div></div>
+                    <Tabs
+                        defaultActiveKey="1"
+                        onChange={onTabChange}
+                        items={[
+                            {
+                                label: `收费项目`,
+                                key: '1',
+                            },
+                            {
+                                label: `指标项目`,
+                                key: '2',
+                            },
+                            {
+                                label: `非考核项目`,
+                                key: '3',
+                            },
+                        ]}
+                    />
+
+                    {
+                        currentSelectedTabKey == '1' && (
+                            <div className='tabContent'>
+                                <div className='tableToolbar'>
+                                    <div className='search'>
+                                        <span>检索:</span><Input className='searchInput' allowClear onChange={(e) => {
+
+                                            set_searchKeywords(e.target.value)
+                                            if (e.target.value.length == 0) {
+                                                set_searchParams({
+                                                    ...searchParams,
+                                                    name: e.target.value
+                                                })
+                                            }
+                                        }} placeholder="请输入项目名称" suffix={
+                                            <IconFont type="iconsousuo" onClick={() => tableSearchHandle()} />
+                                        } />
+                                    </div>
+                                    <div className={'btnGroup'}>
+                                        <span key="2" onClick={() => openCopyHandleModal()}>复制</span>
+                                        <span key="3" onClick={() => openTransfer()}>添加</span>
+
+                                    </div>
+                                </div>
+                                {currentSelectedTreeNode && <BMSTable params={searchParams} actionRef={tableRef} rowKey='id' columns={[...tableColumn, {
+                                    title: '操作',
+                                    key: 'option',
+                                    width: 140,
+                                    valueType: 'option',
+                                    render: (text, record: any) => [
+                                        <a key={'edit'} onClick={() => {
+                                            if (!ifEdit) {
+                                                set_ifEdit(true);
+                                                set_currentEditRow(record)
+                                            }
+                                            if (ifEdit) {
+                                                editBtnHandle();
+                                            }
+
+                                        }}>{ifEdit ? '保存' : '编辑'}</a>,
+                                        <Fragment key={'cancel'}>{ifEdit && <a onClick={() => set_ifEdit(false)}>取消</a>}</Fragment>,
+                                        <Popconfirm key="popconfirm" title={`确认删除吗?`} okText="是" cancelText="否" onConfirm={() => delHandle(record)}>
+                                            {!ifEdit && <a key={'del'}>删除</a>}
+                                        </Popconfirm>
+                                    ],
+                                }]} request={(params, sort, filter) => getTableData('BILL', params, sort, filter)} />}
+                            </div>
+                        )
+                    }
+
+                    {
+                        currentSelectedTabKey == '2' && (
+                            <div className='tabContent'>
+                                <div className='tableToolbar'>
+                                    <div className='search'>
+                                        <span>检索:</span><Input className='searchInput' allowClear placeholder="请输入项目名称" onChange={(e) => {
+                                            set_searchKeywords(e.target.value);
+
+                                            if (e.target.value.length == 0) {
+                                                set_searchParams({
+                                                    ...searchParams,
+                                                    name: ''
+                                                });
+                                            }
+                                        }} suffix={
+                                            <IconFont type="iconsousuo" onClick={() => tableSearchHandle()} />
+                                        } />
+                                    </div>
+                                    <div className={'btnGroup'}>
+                                        <span key="2" onClick={() => openCopyHandleModal()}>复制</span>
+                                        <span key="3" onClick={() => openTransfer()}>添加</span>
+
+                                    </div>
+                                </div>
+                                {currentSelectedTreeNode && <BMSTable actionRef={tableRef} params={searchParams} rowKey='id' columns={[...tableColumn, {
+                                    title: '操作',
+                                    key: 'option',
+                                    width: 140,
+                                    valueType: 'option',
+                                    render: (text, record: any) => [
+                                        <a key={'edit'} onClick={() => {
+
+                                            if (!ifEdit) {
+                                                set_ifEdit(true);
+                                                set_currentEditRow(record)
+                                            }
+                                            if (ifEdit) {
+                                                editBtnHandle();
+                                            }
+
+                                        }}>{ifEdit ? '保存' : '编辑'}</a>,
+                                        <Fragment key={'cancel'}>{ifEdit && <a onClick={() => set_ifEdit(false)}>取消</a>}</Fragment>,
+                                        <Popconfirm key="popconfirm" title={`确认删除吗?`} okText="是" cancelText="否" onConfirm={() => delHandle(record)}>
+                                            {!ifEdit && <a key={'del'}>删除</a>}
+                                        </Popconfirm>
+                                    ],
+                                }]} request={(params, sort, filter) => getTableData('INDIC', params, sort, filter)} />}
+                            </div>
+                        )
+                    }
+
+                    {
+                        currentSelectedTabKey == '3' && (
+                            <div className='tabContent'>
+                                <div className='tableToolbar'>
+                                    <div className='search'>
+                                        <span>检索:</span><Input className='searchInput' allowClear placeholder="请输入项目名称" onChange={(e) => {
+                                            set_searchKeywords(e.target.value);
+
+                                            if (e.target.value.length == 0) {
+                                                set_searchParams({
+                                                    ...searchParams,
+                                                    name: ''
+                                                });
+                                            }
+                                        }} suffix={
+                                            <IconFont type="iconsousuo" onClick={() => tableSearchHandle()} />
+                                        } />
+                                    </div>
+                                    <div className={'btnGroup'}>
+                                        <span key="2" onClick={() => openCopyHandleModal()}>复制</span>
+                                        <span key="3" onClick={() => openTransfer()}>添加</span>
+
+                                    </div>
+                                </div>
+                                {currentSelectedTreeNode && <BMSTable actionRef={tableRef} params={searchParams} rowKey='id' columns={[...tableColumn,{
+                                    title: '操作',
+                                    key: 'option',
+                                    valueType: 'option',
+                                    render: (text, record: any) => [
+                                        <Popconfirm key="popconfirm" title={`确认删除吗?`} okText="是" cancelText="否" onConfirm={() => delHandle(record)}>
+                                            {!ifEdit && <a key={'del'}>删除</a>}
+                                        </Popconfirm>
+                                    ],
+                                }]} request={(params, sort, filter) => getTableData('NONCHECK', params, sort, filter)} />}
+                            </div>
+                        )
+                    }
+
+                </BMSPagecontainer>
+            </div>
+        </div>
+    );
+
+};
+
+export default CheckUnitProjectSet;

+ 290 - 0
src/pages/setting/projectSetting/checkUnitProjectSet/service.ts

@@ -0,0 +1,290 @@
+/*
+ * @Author: code4eat awesomedema@gmail.com
+ * @Date: 2022-12-21 11:13:51
+ * @LastEditors: code4eat awesomedema@gmail.com
+ * @LastEditTime: 2023-05-17 17:06:08
+ * @FilePath: /BudgetManaSystem/src/pages/budgetMana/monthlyInfoCheck/service.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+
+
+
+
+import { request } from '@@/plugin-request';
+
+
+
+
+//获取树结构单元数据
+
+export type getTreeDataRespType = {
+    code: number;
+    name: string;
+    child: getTreeDataRespType[]
+}
+
+export const getTreeData = (computeDate: string) => {
+
+    return request<getTreeDataRespType[]>('/performance/check/getUnitList', {
+        method: 'GET',
+        params: { computeDate }
+    })
+}
+
+//获取所有核算单元用于复制选择
+
+export const getAllCheckUnit = () => {
+
+    return request('/performance/kpi/getUnitList', {
+        method: 'GET',
+    })
+}
+
+
+//获取所有查核项目用于添加
+export const getAllCheckUnitProjectData = () => {
+    return request('/performance/item/getAllItemList', {
+        method: 'GET',
+    })
+}
+
+
+
+
+//获取收费项目表格数据
+
+export type getBillingItemTableDataParamsType = {
+    unitCode: string,
+    name?: string,
+    pageSize?: number,
+    current?: number
+}
+
+export type BillingItemType = {
+    "id": number, //主键
+    "hospId": number, //医院id
+    "itemPointCode": string, //收费项目代码
+    "itemName": string, //收费项目名称
+    "orderPointValue": number, //点值
+    "executePointValue": number, //执行点值
+    "unitCode": string, //核算单元代码
+    "coreFlag": number, //是否synt
+    "coreFlagName": string, //是否核心项目名称
+    "itemType": string //是否核心项目 0 否 1 是 2不计
+}
+
+export type BillingItemTableDataType = {
+    current: number,
+    list: BillingItemType[],
+    pageSize: number,
+    totalCount: number,
+    totalPage: number,
+}
+
+export const getBillingItemTableData = (params: getBillingItemTableDataParamsType) => {
+
+    return request<BillingItemTableDataType>('/performance/item/getUnitItemList', {
+        method: 'GET',
+        params: { ...params }
+    })
+
+}
+
+
+//收费项目保存添加
+export const addBillingItemData = (data: {
+    unitCode: string,
+    item: any[]
+}) => {
+
+    return request('/performance/item/addUnitItemList', {
+        method: 'POST',
+        data: { ...data }
+    })
+
+}
+
+//收费项目编辑保存
+export const editBillingItemData = (data: {
+    "id": number, //主键
+    "unitCode": string, //核算单元代码
+    "orderPointValue": string, //点值
+    "coreFlag": number //是否 核心 1是0否
+}) => {
+
+    return request('/performance/item/editUnitItemList', {
+        method: 'POST',
+        data: { ...data }
+    })
+
+}
+
+
+
+//获取指标表格数据
+
+export type getIndicTableDataParamsType = {
+    current?: number,
+    pageSize?: number,
+    unitCode: string,
+    name?: string,
+}
+
+export type IndicTableItemDataType = {
+    "id": number, //主键
+    "hospId": number, //医院id
+    "indicatorCode": string, //指标代码
+    "indicatorName": string, //指标名称
+    "orderPointValue": number, //点值
+    "executePointValue": number, //执行点值
+    "unitCode": string, //核算单元代码
+    "indicatorType": number, //类型
+    "indicatorTypeName": string, //类型名称
+    "indicatorDefinition": string //定义
+}
+
+
+
+export const getIndicTableData = (params: getIndicTableDataParamsType) => {
+
+    return request('/performance/item/getUnitIndicatorList', {
+        method: 'GET',
+        params: params
+    })
+
+}
+
+//指标项目添加
+export const addIndicItemData = (data: {
+    unitCode: string,
+    indicatorValues: any[]
+}) => {
+
+    return request('/performance/item/addUnitIndicatorList', {
+        method: 'POST',
+        data: { ...data }
+    })
+
+}
+
+
+//指标项目编辑保存
+
+export const editIndicItemData = (data: {
+    "id":number, //主键
+    "unitCode":string, //核算单元代码
+    "indicatorCode":string, //指标代码
+    "indicatorName":string, //指标名称
+    "orderPointValue":string, //点值
+    "executePointValue": number //执行点值
+}) => {
+
+    return request('/performance/item/editUnitIndicatorList', {
+        method: 'POST',
+        data: { ...data }
+    })
+
+}
+
+
+
+//获取非考核项目表格数据
+
+export type getNonCheckTableDataParamsType = {
+    current?: number,
+    pageSize?: number,
+    unitCode: string,
+    name?: string,
+}
+
+export type NonCheckTableItemDataType = {
+    "id": number, //主键
+    "hospId": number, //医院id
+    "indicatorCode": string, //指标代码
+    "indicatorName": string, //指标名称
+    "orderPointValue": number, //点值
+    "executePointValue": number, //执行点值
+    "unitCode": string, //核算单元代码
+    "indicatorType": number, //类型
+    "indicatorTypeName": string, //类型名称
+    "indicatorDefinition": string //定义
+}
+
+
+
+export const getNonCheckTableData = (params: getNonCheckTableDataParamsType) => {
+
+    return request('/performance/item/getUnitNonAssessmentList', {
+        method: 'GET',
+        params: params
+    })
+
+}
+
+
+//非考核项目添加
+export const addNonCheckItemData = (data: {
+    unitCode: string,
+    assessments: any[]
+}) => {
+
+    return request('/performance/item/addUnitNonAssessmentList', {
+        method: 'POST',
+        data: { ...data }
+    })
+
+}
+
+
+
+
+//删除项目
+export const delRequest = (params:any,tabKey:string) => {
+
+    if(tabKey == '1'){
+        return request('/performance/item/deleteUnitItemList', {
+            method: 'POST',
+            params: params
+        })
+    }
+    if(tabKey == '2'){
+        return request('/performance/item/deleteUnitIndicatorList', {
+            method: 'POST',
+            params: params
+        })
+    }
+    if(tabKey == '3'){
+        return request('/performance/item/deleteUnitNonAssessmentList', {
+            method: 'POST',
+            params: params
+        })
+    }
+}
+
+
+
+
+//保存项目复制
+
+export const saveCopyRequest = (data: any,tabKey:string) => {
+
+    if(tabKey == '1'){
+        return request('/performance/item/copyUnitItemList', {
+            method: 'POST',
+            data: data
+        })
+    }
+    if(tabKey == '2'){
+        return request('/performance/item/copyUnitIndicatorList', {
+            method: 'POST',
+            data: data
+        })
+    }
+    if(tabKey == '3'){
+        return request('/performance/item/copyUnitNonAssessmentList', {
+            method: 'POST',
+            data: data
+        })
+    }
+
+}

+ 171 - 0
src/pages/setting/projectSetting/checkUnitProjectSet/style.less

@@ -0,0 +1,171 @@
+
+.TableSelecter {
+    .footer {
+         display: flex;
+         flex-direction:row;
+         justify-content: flex-end;
+         margin-bottom:-10px;
+         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;
+             }
+         }
+
+    }
+}
+
+.CheckUnitProjectSet {
+    display: flex;
+    flex-direction: row;
+    // height: 100%;
+    background: #F5F7FA;
+
+    .leftTree {
+        position:fixed;
+        top:64px;
+        width: 220px;
+        height: calc(100vh - 80px);
+        background: #FFF;
+        border-radius: 4px;
+        padding: 16px;
+        overflow: hidden;
+        margin-right: 16px;
+        // border-right:16px solid #F5F7FA;
+
+        .searchInput {
+              border: 1px solid #CFD7E6;
+        }
+
+
+        .bms-ant-tree.bms-ant-tree-directory .bms-ant-tree-treenode-selected:hover::before,.bms-ant-tree.bms-ant-tree-directory .bms-ant-tree-treenode-selected::before {
+            border-radius: 4px;
+            background: rgb(240 242 245 / 100%);
+        }
+
+        .bms-ant-tree.bms-ant-tree-directory .bms-ant-tree-treenode .bms-ant-tree-node-content-wrapper.bms-ant-tree-node-selected {
+            font-weight: bold;
+        }
+    }
+
+    .rightContent {
+        position: relative;
+        border-radius: 4px;
+        width: calc(100% - 220px);
+        padding: 16px;
+        padding-top: 0;
+        margin-left: 236px;
+        background: #FFF;
+
+        .midLine {
+            display: flex;
+            flex-direction: row;
+            justify-content: center;
+            align-items: center;
+            height: 24px;
+            line-height: 24px;
+            background: #F0FCFC;
+            font-size: 12px;
+            color: #515866;
+            font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+            font-weight: 400;
+            margin-top: 12px;
+            margin-bottom: 15px;
+
+            &>span {
+                cursor: pointer;
+                font-size: 12px;
+                font-family: SourceHanSansCN-Medium, SourceHanSansCN;
+                font-weight: 500;
+                color: #00B3B3;
+                padding-right: 4px;
+            }
+
+        }
+
+        .bms-ant-tabs-nav {
+            &::before {
+                border-bottom: none !important;
+            }
+        }
+
+        .tabContent {
+            display: flex;
+            flex-direction: column;
+
+            .tableToolbar {
+                display: flex;
+                flex-direction: row;
+                justify-content: space-between;
+                align-items: center;
+                margin-bottom: 16px;
+
+                .search {
+                    display: flex;
+                    flex-direction: row;
+                    justify-content: flex-start;
+                    align-items: center;
+
+                    .searchInput {
+                        width: 167px;
+                        height: 24px;
+                        background: #FFF;
+                        border-radius: 4px;
+                        border: 1px solid #CFD7E6;
+                    }
+
+                    &>span {
+                        font-size: 14px;
+                        font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+                        font-weight: 400;
+                        color: #17181A;
+                    }
+                }
+
+                .btnGroup {
+                    &>span {
+                        display: inline-block;
+                        text-align: center;
+                        width: 56px;
+                        height: 24px;
+                        line-height: 23px;
+                        background: #FAFCFF;
+                        border-radius: 4px;
+                        cursor: pointer;
+                        border: 1px solid #DAE2F2;
+                        margin-right: 8px;
+
+                        &:last-child {
+                            margin-right: 0;
+                            color: #FFF;
+                            background: #3376FE;
+                            border: none;
+                        }
+                    }
+
+                    &.disabled {
+                        &>span {
+                            cursor:not-allowed;
+                            color: rgb(0 0 0 / 50%);
+                            background-color:#f0f2f5;
+                        }
+                    }
+                }
+            }
+        }
+    }
+}

+ 501 - 0
src/pages/setting/projectSetting/costIncomeProjectSet/index.tsx

@@ -0,0 +1,501 @@
+/*
+ * @Author: code4eat awesomedema@gmail.com
+ * @Date: 2023-03-03 11:30:33
+ * @LastEditors: code4eat awesomedema@gmail.com
+ * @LastEditTime: 2023-05-18 17:56:28
+ * @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 { getPubDicData } from '@/services/getDic';
+import { createFromIconfontCN } from '@ant-design/icons';
+
+import { ActionType, ProFormRadio } from '@ant-design/pro-components';
+import { ModalForm, ProFormCheckbox, ProFormDigit, ProFormSelect, ProFormText, ProFormTextArea } from '@ant-design/pro-form'
+import { ProColumns } from '@ant-design/pro-table';
+import { Input, message, Popconfirm, Tabs } from 'antd';
+import { useEffect, useRef, useState } from 'react'
+
+import { addCostData, addIncomeData, delData, editCostData, editIncomeData, getCostIncomeProjectTable, getCostProjectTable } from './service';
+
+import './style.less';
+
+
+const IconFont = createFromIconfontCN({
+    scriptUrl: '//at.alicdn.com/t/c/font_1927152_4nm5kxbv4m3.js',
+});
+
+
+
+export default function CostIncomeProjectSet() {
+
+    const [tableDataFilterParams, set_tableDataFilterParams] = useState<any | undefined>();
+    const [tableDataSearchKeywords, set_tableDataSearchKeywords] = useState<string>('');
+    const tableRef = useRef<ActionType>();
+
+    const [columns, set_columns] = useState<ProColumns[]>([]);
+
+    const [currentSelectedTabKey, set_currentSelectedTabKey] = useState<string>('1');
+
+
+
+
+    const incomeColumns: ProColumns[] = [
+
+        {
+            title: '项目代码',
+            dataIndex: 'code',
+        },
+        {
+            title: '项目名称',
+            dataIndex: 'name',
+        },
+        {
+            title: '适应范围',
+            dataIndex: 'scope',
+            renderText(num, record, index, action) {
+                return `${record.opdFlag == 1 ? record.opdFlagName : ''}${(record.opdFlag ==1&&record.inpFlag==1)?' | ':''}${record.inpFlag == 1?record.inpFlagName : ''}`
+            },
+        },
+        {
+            title: '统计',
+            dataIndex: 'statFlag',
+            renderText(num, record, index, action) {
+                return record.statFlag ? '是' : '否'
+            },
+        },
+        {
+            title: '序号',
+            dataIndex: 'seqNo',
+        },
+        {
+            title: '操作',
+            key: 'option',
+            width: 120,
+            valueType: 'option',
+            render: (_: any, record: any) => {
+                return [
+                    <UpDataActBtn key={'act'} record={record} type='EDIT' />,
+                    <Popconfirm
+                        title="是否确认删除?"
+                        key="del"
+                        onConfirm={() => delTableData(record)}
+                    >
+                        <a>删除</a>
+                    </Popconfirm>
+                ]
+            },
+        },
+
+    ]
+    const costCloumns: ProColumns[] = [
+        {
+            title: '项目名称',
+            dataIndex: 'name',
+        },
+        {
+            title: '类型',
+            dataIndex: 'itemTypeName',
+        },
+        {
+            title: '汇总',
+            dataIndex: 'summaryFlag',
+            renderText(num, record, index, action) {
+                return record.summaryFlag ? '是' : '否'
+            },
+        },
+        {
+            title: '可控',
+            dataIndex: 'ctrlFlag',
+            renderText(num, record, index, action) {
+                return record.ctrlFlag ? '是' : '否'
+            },
+        },
+        {
+            title: '统计',
+            dataIndex: 'statFlag',
+            renderText(num, record, index, action) {
+                return record.statFlag ? '是' : '否'
+            },
+        },
+        {
+            title: '序号',
+            dataIndex: 'seqNo',
+        },
+        {
+            title: '操作',
+            key: 'option',
+            width: 160,
+            valueType: 'option',
+            render: (_: any, record: any) => {
+                return record.summaryFlag ? [
+                    <UpDataActBtn key={'add'} type='ADD' text='添加' record={record} />,
+                    <UpDataActBtn key={'act'} record={record} type='EDIT' />,
+                    <Popconfirm
+                        title="是否确认删除?"
+                        key="del"
+                        onConfirm={() => delTableData(record)}
+                    >
+                        <a>删除</a>
+                    </Popconfirm>
+                ] : [
+                    <UpDataActBtn key={'act'} record={record} type='EDIT' />,
+                    <Popconfirm
+                        title="是否确认删除?"
+                        key="del"
+                        onConfirm={() => delTableData(record)}
+                    >
+                        <a>删除</a>
+                    </Popconfirm>
+                ]
+            },
+        },
+
+    ]
+
+
+    const getTableData = async (params: any) => {
+        if (currentSelectedTabKey == '1') {
+            const resp = await getCostIncomeProjectTable(params);
+            if (resp) {
+                return {
+                    data: resp.list,
+                    success: true,
+                    total: resp.totalCount,
+                    pageSize: resp.pageSize,
+                    totalPage: resp.totalPage,
+                }
+            }
+        }
+        if (currentSelectedTabKey == '2') {
+            const resp = await getCostProjectTable(params);
+            if (resp) {
+                return {
+                    data: resp,
+                    success: true,
+                }
+            }
+        }
+
+        return []
+    }
+
+    const delTableData = async (record: any) => {
+        const resp = await delData(record.id,currentSelectedTabKey);
+        if (resp) {
+            message.success('操作成功!');
+            tableRef.current?.reload();
+            // message.success('操作成功!');
+        }
+    }
+
+    const updateTable = async (formVal: any, type: 'EDIT' | "ADD") => {
+
+        console.log({ formVal });
+
+        if(currentSelectedTabKey == '1'){
+            const result = {
+                name: formVal.name,
+                opdFlag: formVal.scope.includes('门诊') ? 1 : 0,
+                inpFlag: formVal.scope.includes('住院') ? 1 : 0,
+                statFlag: formVal.statFlag,
+                seqNo: formVal.seqNo
+            }
+    
+            if (type == 'ADD') {
+                const resp = await addIncomeData({ ...result });
+                if (resp) {
+                    tableRef.current?.reload();
+                    message.success('操作成功!');
+                }
+            }
+            if (type == 'EDIT') {
+                const resp = await editIncomeData({ id: formVal.id, ...result });
+                if (resp) {
+                    tableRef.current?.reload();
+                    message.success('操作成功!');
+                }
+            }
+        }
+        if(currentSelectedTabKey == '2'){
+            const result = {
+                name: formVal.name,
+                parentCode: formVal.parentCode,
+                itemType: formVal.itemType,
+                summaryFlag: formVal.summaryFlag,
+                ctrlFlag: formVal.ctrlFlag,
+                statFlag: formVal.statFlag,
+                seqNo: formVal.seqNo
+            }
+    
+            if (type == 'ADD') {
+                const resp = await addCostData({ ...result });
+                if (resp) {
+                    tableRef.current?.reload();
+                    message.success('操作成功!');
+                }
+            }
+            if (type == 'EDIT') {
+                const resp = await editCostData({ id: formVal.id, ...result });
+                if (resp) {
+                    tableRef.current?.reload();
+                    message.success('操作成功!');
+                }
+            }
+        }
+
+
+        
+
+        return true;
+    }
+
+    const [dicData, set_dicData] = useState<any[]>([]);
+
+    const getDirecData = async (key?: string) => {
+
+        const data = await getPubDicData();
+        if (data) {
+            set_dicData(data);
+        }
+    }
+
+    const UpDataActBtn = ({ record, type, text }: { record: any, type: 'EDIT' | 'ADD', text?: string }) => {
+
+        let scope = [];
+        if (record.opdFlag) { scope.push('门诊') }
+        if (record.inpFlag) { scope.push('住院') }
+
+        return (
+            <ModalForm
+                title={`${type == 'EDIT' ? '编辑' : '新增'}${currentSelectedTabKey == '1' ? '收入项目' : '成本项目'}`}
+                width={352}
+                initialValues={type == 'EDIT' ? { ...record, scope: scope } : {}}
+                trigger={
+                    type == 'EDIT' ? <a key="edit" >编辑</a> : <a className='add'>{text ? text : '新增'}</a>
+                }
+                onFinish={(val) => {
+                    return updateTable(type == 'EDIT' ? { ...record, ...val,parentCode:record.parentCode} : { ...val,parentCode:record.code?record.code:0 }, type);
+                }}
+                modalProps={{ destroyOnClose: true }}
+                colProps={{ span: 24 }}
+                grid
+            >
+
+                {
+                    currentSelectedTabKey == '1' && (
+                        <>
+                            <ProFormText
+                                name="name"
+                                label="项目名称:"
+                                placeholder="请输入"
+                                rules={[{ required: true, message: '名称不能为空!' }]}
+                            />
+                            <ProFormCheckbox.Group
+                                name="scope"
+                                label="适应范围:"
+                                options={['门诊', '住院']}
+                                rules={[{ required: true, message: '适应范围不能为空!' }]}
+                            />
+
+                            <ProFormRadio.Group
+                                name="statFlag"
+                                label="统计:"
+                                options={[
+                                    {
+                                        label: '是',
+                                        value: 1,
+                                    },
+                                    {
+                                        label: '否',
+                                        value: 0,
+                                    }
+                                ]}
+                                placeholder="请选择"
+                            />
+                            <ProFormDigit
+                                name="seqNo"
+                                label="序号:"
+                                rules={[{ required: true, message: '序号不能为空!' }]}
+                            />
+                        </>
+                    )
+                }
+
+                {
+                    currentSelectedTabKey == '2'&&(
+                        <>
+                            <ProFormText
+                                name="name"
+                                label="项目名称:"
+                                placeholder="请输入"
+                                rules={[{ required: true, message: '名称不能为空!' }]}
+                            />
+                            <ProFormSelect
+                                name="itemType"
+                                label="类型:"
+                                placeholder="请选择"
+                                options={[
+                                    {
+                                        label:'人事成本',value:1
+                                    },
+                                    {
+                                        label:'变动成本',value:2
+                                    },
+                                    {
+                                        label:'固定成本',value:3
+                                    }
+                                ]}
+                                rules={[{ required: true, message: '类型不能为空!' }]}
+                            />
+                            <ProFormRadio.Group
+                                name="summaryFlag"
+                                label="汇总:"
+                                options={[
+                                    {
+                                        label: '是',
+                                        value: 1,
+                                    },
+                                    {
+                                        label: '否',
+                                        value: 0,
+                                    }
+                                ]}
+                                placeholder="请选择"
+                            />
+                            <ProFormRadio.Group
+                                name="ctrlFlag"
+                                label="可控:"
+                                options={[
+                                    {
+                                        label: '是',
+                                        value: 1,
+                                    },
+                                    {
+                                        label: '否',
+                                        value: 0,
+                                    }
+                                ]}
+                                placeholder="请选择"
+                            />
+                            <ProFormRadio.Group
+                                name="statFlag"
+                                label="统计:"
+                                options={[
+                                    {
+                                        label: '是',
+                                        value: 1,
+                                    },
+                                    {
+                                        label: '否',
+                                        value: 0,
+                                    }
+                                ]}
+                                placeholder="请选择"
+                            />
+                            <ProFormDigit
+                                name="seqNo"
+                                label="序号:"
+                                rules={[{ required: true, message: '序号不能为空!' }]}
+                            />
+                        </>
+                    )
+                }
+
+
+
+            </ModalForm>
+        )
+    }
+
+    const tableDataSearchHandle = (paramName: string) => {
+
+
+        set_tableDataFilterParams({
+            ...tableDataFilterParams,
+            [`${paramName}`]: tableDataSearchKeywords
+        })
+    }
+
+
+
+    const onTabChange = (activeKey: string) => {
+        set_currentSelectedTabKey(activeKey);
+    }
+
+    useEffect(() => {
+        tableRef.current?.reload();
+        if (currentSelectedTabKey == '1') {
+            set_columns(incomeColumns)
+        }
+        if (currentSelectedTabKey == '2') {
+            set_columns(costCloumns)
+        }
+    }, [currentSelectedTabKey])
+
+
+    useEffect(() => {
+        getDirecData();
+    }, [])
+
+    return (
+        <BMSPagecontainer className='CostIncomeProjectSet' title={false}>
+            <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={'请输入项目名称'} allowClear
+                            suffix={
+                                <IconFont type="iconsousuo" onClick={() => tableDataSearchHandle('name')} />
+                            }
+                            onChange={(e) => {
+                                set_tableDataSearchKeywords(e.target.value);
+                                if (e.target.value.length == 0) {
+                                    set_tableDataFilterParams({
+                                        ...tableDataFilterParams,
+                                        name: ''
+                                    });
+                                }
+                            }}
+                            onPressEnter={(e) => {
+
+                                set_tableDataFilterParams({
+                                    ...tableDataFilterParams,
+                                    name: (e.target as HTMLInputElement).value
+                                });
+                            }}
+
+                        />
+                    </div>
+                </div>
+                <div className='btnGroup'>
+                    {/* <span className='getDataBtn' onClick={() => getDataBySQL()}>获取</span> */}
+                    <UpDataActBtn record type='ADD' />
+                </div>
+            </div>
+            <div style={{ marginTop: 16 }}>
+                <BMSTable columns={columns as ProColumns[]} pagination={currentSelectedTabKey == '2'&&false} actionRef={tableRef} rowKey='id' params={tableDataFilterParams} request={(params) => getTableData(params)} />
+            </div>
+        </BMSPagecontainer>
+    )
+}

+ 145 - 0
src/pages/setting/projectSetting/costIncomeProjectSet/service.ts

@@ -0,0 +1,145 @@
+/*
+ * @Author: code4eat awesomedema@gmail.com
+ * @Date: 2023-03-03 16:31:27
+ * @LastEditors: code4eat awesomedema@gmail.com
+ * @LastEditTime: 2023-05-18 14:25:32
+ * @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 type CostIncomeTableItemDataType = {
+  "id": number, //主键
+  "code": string, //流转功能code
+  "hospId": number, //医院id
+  "name": string, //名称
+  "opdFlag": number, //门诊可用标志  0否 1是
+  "opdFlagName": string, //门诊可用标志显示名称
+  "inpFlag": number, //住院可用标志  0否 1是
+  "inpFlagName": string, //住院可用标志显示名称
+  "statFlag": number, //统计标志 0否 1是
+  "seqNo": number //序号
+}
+
+
+export const getCostIncomeProjectTable = (params?: any) => {
+  return request<{
+    current: number;
+    list: CostIncomeTableItemDataType[];
+    pageSize: number;
+    totalCount: number;
+    totalPage: number;
+  }>('/performance/item/getIncomeList', {
+    method: 'GET',
+    params: { ...params }
+  });
+};
+
+
+//新增收入项目表格数据
+export type AddIncomeTableDataType = {
+  "name": string, //名称
+  "opdFlag": number, //门诊可用标志  0否 1是
+  "inpFlag": number, //住院可用标志  0否 1是
+  "statFlag": number, //统计标志 0否 1是
+  "seqNo": number //序号
+}
+export const addIncomeData = (data: AddIncomeTableDataType) => {
+  return request('/performance/item/addIncome', {
+    method: 'POST',
+    data
+  });
+};
+
+
+
+//编辑表格数据
+
+export const editIncomeData = (data: AddIncomeTableDataType & { id: number }) => {
+  return request('/performance/item/editIncome', {
+    method: 'POST',
+    data
+  });
+};
+
+
+
+
+//获取成本项目table列表数据
+
+export type CostTableItemDataType = {
+  "id": number, //主键
+  "hospId": number, //医院id
+  "code": string, //项目代码
+  "name": string, //项目名称
+  "parentCode": number,
+  "itemType": number, //项目类型
+  "itemTypeName": string, //项目类型名称
+  "summaryFlag": number, //汇总标志  0否 1是
+  "ctrlFlag": number, //可控标志  0否 1是
+  "statFlag": number, //统计标志 0否 1是
+  "seqNo": number //序号
+  "children": CostTableItemDataType[]
+}
+
+
+export const getCostProjectTable = (params?: any) => {
+  return request<CostTableItemDataType[]>('/performance/item/getCostList', {
+    method: 'GET',
+    params: { ...params }
+  });
+};
+
+//新增成本项目表格数据
+export type AddCostTableDataType = {
+
+  "name":string, //名称
+  "parentCode": number, //父级代码 最上级传0 非最上级传上级code
+  "itemType": number, //项目类型 1人事成本 2变动成本 3固定成本
+  "summaryFlag": number, //汇总标志  0否 1是
+  "ctrlFlag": number, //可控标志  0否 1是
+  "statFlag": number, //统计标志 0否 1是
+  "seqNo": number //序号
+}
+export const addCostData = (data: AddCostTableDataType) => {
+  return request('/performance/item/addCost', {
+    method: 'POST',
+    data
+  });
+};
+
+//编辑成本表格数据
+
+export const editCostData = (data: AddCostTableDataType & { id: number }) => {
+  return request('/performance/item/editCost', {
+    method: 'POST',
+    data
+  });
+};
+
+//删除表格操作
+export const delData = (id: string,tabKey:string) => {
+
+  if(tabKey == '1'){
+    return request('/performance/item/deleteIncome', {
+      method: 'POST',
+      params: { id }
+    });
+  }
+  if(tabKey == '2'){
+    return request('/performance/item/deleteCost', {
+      method: 'POST',
+      params: { id }
+    });
+  }
+  
+};
+
+
+
+

+ 62 - 0
src/pages/setting/projectSetting/costIncomeProjectSet/style.less

@@ -0,0 +1,62 @@
+.CostIncomeProjectSet {
+  padding: 16px;
+  background: #FFFFFF;
+  border-radius: 4px;
+  padding-top: 0;
+
+  .bms-ant-tabs-nav {
+    &::before {
+      border-bottom: none !important;
+    }
+  }
+
+  .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 {
+      .getDataBtn {
+        display: inline-block;
+        text-align: center;
+        width: 56px;
+        height: 24px;
+        cursor: pointer;
+        line-height: 24px;
+        background: #FAFCFF;
+        border-radius: 4px;
+        margin-right: 8px;
+        border: 1px solid #DAE2F2;
+      }
+
+      .add {
+        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;
+      }
+    }
+
+  }
+}

+ 3 - 3
src/pages/setting/projectSetting/indicProjectMana/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-05-11 17:35:35
+ * @LastEditTime: 2023-05-17 14:22:00
  * @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
  */
@@ -22,7 +22,7 @@ import { ProColumns } from '@ant-design/pro-table';
 import { Input, message, Popconfirm } from 'antd';
 import { useEffect, useRef, useState } from 'react'
 
-import { addData, delData, editData, gainData, getData } from './service';
+import { addData, delData, editData, gainData, getIndicProjectTableData } from './service';
 
 import './style.less';
 
@@ -94,7 +94,7 @@ export default function BilingProjectMana() {
 
 
     const getTableData = async (params: any) => {
-        const resp = await getData(params);
+        const resp = await getIndicProjectTableData(params);
         if (resp) {
             return {
                 data: resp.list,

+ 2 - 2
src/pages/setting/projectSetting/indicProjectMana/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-05-04 16:34:33
+ * @LastEditTime: 2023-05-17 14:29:09
  * @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
  */
@@ -28,7 +28,7 @@ export type IndicProjectTableItemDataType = {
 }
 
 
-export const getData = (params?: any) => {
+export const getIndicProjectTableData = (params?: any) => {
   return request<{
     current: number;
     list: IndicProjectTableItemDataType[];

+ 3 - 3
src/pages/setting/projectSetting/nonAssessmentProjectMana/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-05-12 11:09:29
+ * @LastEditTime: 2023-05-17 16:58:28
  * @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
  */
@@ -24,7 +24,7 @@ import { useEffect, useRef, useState } from 'react'
 import { getSecondaryProjectDistriData } from '../secondaryProjectDistribute/service';
 
 
-import { addData, delData, editData, gainData, getData, saveScoreData } from './service';
+import { addData, delData, editData, gainData,getNonCheckProjectTableData, saveScoreData } from './service';
 
 import './style.less';
 
@@ -113,7 +113,7 @@ export default function NonAssessmentProjectMana() {
 
 
     const getTableData = async (params: any) => {
-        const resp = await getData(params);
+        const resp = await getNonCheckProjectTableData(params);
         if (resp) {
             return {
                 data: resp.list,

+ 1 - 1
src/pages/setting/projectSetting/nonAssessmentProjectMana/service.ts

@@ -28,7 +28,7 @@ export type NonAssessProjectTableItemDataType = {
 }
 
 
-export const getData = (params?: any) => {
+export const getNonCheckProjectTableData = (params?: any) => {
   return request<{
     current: number;
     list: NonAssessProjectTableItemDataType[];