123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580 |
- /*
- * @Author: code4eat awesomedema@gmail.com
- * @Date: 2023-03-03 11:30:33
- * @LastEditors: code4eat awesomedema@gmail.com
- * @LastEditTime: 2024-08-16 10:34:01
- * @FilePath: /KC-MiddlePlatform/src/pages/platform/setting/pubDicTypeMana/index.tsx
- * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
- */
- import KCIMPagecontainer from '@/components/KCIMPageContainer';
- import { KCIMTable } from '@/components/KCIMTable';
- import { formatMoneyNumber } from '@/utils/format';
- import { createFromIconfontCN } from '@ant-design/icons';
- import FormItem from 'antd/es/form/FormItem';
- import { ActionType, DrawerForm, ProFormInstance, ProFormText, ProTable, TableDropdown } from '@ant-design/pro-components';
- import { ModalForm, ProFormDigit, ProFormSelect, ProFormSwitch } from '@ant-design/pro-form'
- import { ProColumns } from '@ant-design/pro-table';
- import type { MenuProps } from 'antd';
- import { Input, message, Dropdown, Modal, Popconfirm, Drawer, Breadcrumb } from 'antd';
- import { useEffect, useRef, useState } from 'react';
- import 'moment/locale/zh-cn';
- import locale from 'antd/es/date-picker/locale/zh_CN';
- import { addData, delData, editData, getAllNeedMatchItems, getDepartmentListsReq, getTableDataReq, importDataPost, mapItemAndStandItem } from './service';
- import './style.less';
- import KCIMUpload from '@/components/KCIMUpload';
- import { downloadTemplateReq } from '@/utils/tooljs';
- import { getStandItemList } from '../standardProjectMana/service';
- import { getDicDataBySysId } from '@/services/getDic';
- import { KcimCenterSysId } from '@/constant';
- import { Setting } from './components/setting';
- import KCIMDrawerForm from '@/components/KCIMDrawerForm';
- import { MatchPage } from './components/match';
- const IconFont = createFromIconfontCN({
- scriptUrl: '',
- });
- let currentRow: any = undefined;
- export const fetchAllDepartments = async (params:any) => {
- const {keyWords} = params;
- let currentPage = 1;
- const pageSize = 500;
- let allDepartments: any[] = [];
- let hasMore = true;
- do {
- const resp = await getDepartmentListsReq({ current: currentPage, pageSize,departName:keyWords });
- if (resp) {
- const { list = [] } = resp;
- allDepartments = [...allDepartments, ...list];
- if (list.length < pageSize) {
- hasMore = false; // 如果返回的数据少于每页数量,说明已经是最后一页
- } else {
- currentPage++; // 否则继续请求下一页
- }
- } else {
- hasMore = false; // 如果请求失败,终止循环
- }
- } while (hasMore);
- return allDepartments.map((a: any) => ({ label:`${a.name}(${a.code})`, value: a.code }));
- };
- export default function ChargeItemsMana() {
- const [tableDataFilterParams, set_tableDataFilterParams] = useState<any | undefined>();
- const [tableDataSearchKeywords, set_tableDataSearchKeywords] = useState<string>('');
- const tableRef = useRef<ActionType>();
- const formRef = useRef<ProFormInstance>();
- const [stopStat, set_stopStat] = useState(0);
- const [drawerVisible, set_drawerVisible] = useState(false);
- const [drawerType, set_drawerType] = useState(1);
- const [currentSelectRow, set_currentSelectRow] = useState(undefined);
- const [ifBatchMatch, set_ifBatchMatch] = useState(false);
- const columns: ProColumns[] = [
- {
- title: '科室',
- dataIndex: 'departmentName',
- width: 160,
- renderText(text, record, index, action) {
- return `[${record.departmentCode}]${record.departmentName}`
- },
- },
- {
- title: '收费项目编码',
- dataIndex: 'code',
- width: 100
- },
- {
- title: '收费项目名称',
- dataIndex: 'name',
- width: 260
- },
- {
- title: '国家编码',
- dataIndex: 'nationalCode',
- width: 100
- },
- {
- title: '项目类别',
- dataIndex: 'type',
- width: 100
- },
- {
- title: '项目分类',
- dataIndex: 'itemTypeName',
- width: 100
- },
- {
- title: '康程分类',
- dataIndex: 'kcCodeName',
- width: 280
- },
- {
- title: '标准项目编码',
- dataIndex: 'standItemCode',
- width: 100
- },
- {
- title: '标准项目名称',
- dataIndex: 'standItemName',
- width: 260
- },
- {
- title: '参与人员',
- dataIndex: 'empMaps',
- width: 260,
- renderText(arr, record, index, action) {
- if (arr)
- return arr.reduce((prev: any, cur: any) => `${prev.length > 0 ? prev + '|' : prev}${cur.empTypeCodeName + '*' + cur.num + '*' + cur.executeTime}`, '')
- },
- },
- {
- title: '使用设备',
- dataIndex: 'equipmentMaps',
- width: 260,
- renderText(arr, record, index, action) {
- if (arr)
- return arr.reduce((prev: any, cur: any) => `${prev.length > 0 ? prev + '|' : prev}${cur.equipmentCodeName + '*' + cur.num + '*' + cur.executeTime}`, '')
- },
- },
- {
- title: '使用空间',
- dataIndex: 'spaceMaps',
- width: 260,
- renderText(arr, record, index, action) {
- if (arr)
- return arr.reduce((prev: any, cur: any) => `${prev.length > 0 ? prev + '|' : prev}${cur.spaceCodeName + '*' + cur.num + '*' + cur.executeTime}`, '')
- },
- },
- {
- title: '计价药材',
- dataIndex: 'valuation',
- width: 260,
- renderText(arr) {
- if (arr)
- return arr.reduce((prev: any, cur: any) => `${prev.length > 0 ? prev + '|' : prev}${cur.code + '*' + cur.name + '*' + cur.num}`, '')
- },
- },
- {
- title: '不计价药材成本',
- dataIndex: 'noValuation',
- width: 260,
- renderText(arr, record, index, action) {
- if (arr)
- return arr.reduce((prev: any, cur: any) => `${prev.length > 0 ? prev + '|' : prev}${cur.code + '*' + cur.name + '*' + cur.num}`, '')
- },
- },
- {
- title: '单价',
- dataIndex: 'price',
- width: 90
- },
- {
- title: '操作',
- key: 'option',
- width: 120,
- fixed: 'right',
- valueType: 'option',
- render: (_: any, record: any) => {
- const items: MenuProps['items'] = [
- {
- key: '1',
- label: (
- <UpDataActBtn key={'act'} record={record} type='EDIT' />
- ),
- },
- // {
- // key: '2',
- // label: (
- // <a >
- // 同步设置
- // </a>
- // ),
- // },
- {
- key: '3',
- label: (
- <Popconfirm
- title="是否确认删除?"
- key="del"
- onConfirm={() => delTableData(record)}
- >
- <a>删除</a>
- </Popconfirm>
- ),
- },
- ];
- return [
- // <UpDataActBtn key={'act'} record={record} type='EDIT' />,
- // <Popconfirm
- // title="是否确认删除?"
- // key="del"
- // onConfirm={() => delTableData(record)}
- // >
- // <a>删除</a>
- // </Popconfirm>
- <a key='1' onClick={() => { set_currentSelectRow(record); currentRow = record; set_drawerType(2); set_drawerVisible(true) }}>匹配</a>,
- <a key='2' onClick={() => { currentRow = record; set_drawerType(1); set_currentSelectRow(record);set_drawerVisible(true); }}>设置</a>,
- <Dropdown menu={{ items }} placement="bottomLeft" arrow>
- <a><IconFont type="icongengduochuizhi" style={{ color: '#3377FF', width: 16, height: 16 }} /></a>
- </Dropdown>
- ]
- },
- },
- ]
- const getTableData = async (params: any) => {
- const resp = await getTableDataReq({ ...params, type: stopStat });
- if (resp) {
- return {
- data: resp.list,
- success: true,
- total: resp.totalCount,
- pageSize: resp.pageSize,
- totalPage: resp.totalPage,
- }
- }
- return []
- }
- const delTableData = async (record: any) => {
- const resp = await delData(record.id);
- if (resp) {
- message.success('操作成功!');
- tableRef.current?.reload();
- // message.success('操作成功!');
- }
- }
-
- const updateTable = async (formVal: any, type: 'EDIT' | "ADD") => {
- const result = {
- ...formVal,
- standItemCode: formVal.standItem ? formVal.standItem.label : undefined,
- standItemName: formVal.standItem ? formVal.standItem.label : undefined,
- departmentCode: formVal.department ? formVal.department.value : undefined,
- departmentName: formVal.department ? formVal.department.label : undefined,
- department:null
- }
- if (type == 'ADD') {
- const resp = await addData(result);
- if (resp) {
- tableRef.current?.reload();
- message.success('操作成功!');
- }
- }
- if (type == 'EDIT') {
- const resp = await editData({ ...result });
- if (resp) {
- tableRef.current?.reload();
- message.success('操作成功!');
- }
- }
- return true;
- }
- const UpDataActBtn = ({ record, type }: { record: any, type: 'EDIT' | 'ADD' }) => {
- return (
- <ModalForm
- title={`${type == 'EDIT' ? '编辑' : '新增'}收费项目`}
- width={350}
- formRef={formRef}
- initialValues={type == 'EDIT' ? {
- ...record, standItem: record.standItemCode,
- department:record.departmentCode
- } : {}}
- trigger={
- type == 'EDIT' ? <a key="edit" >编辑</a> : <span className='add'>新增</span>
- }
- onFinish={(val) => {
- return updateTable(type == 'EDIT' ? { ...record, ...val } : { ...val }, type);
- }}
- modalProps={{ destroyOnClose: true }}
- colProps={{ span: 24 }}
- grid
- >
- <ProFormSelect
- name="department"
- label="科室:"
- placeholder="请输入"
- params={['departName']}
- request={fetchAllDepartments}
- fieldProps={{labelInValue:true,showSearch:true}}
- rules={[{ required: false, message: '科室不能为空!' }]}
- />
- <ProFormText
- name="code"
- label="收费项目编码:"
- placeholder="请输入"
- rules={[{ required: true, message: '收费项目编码不能为空!' }]}
- />
- <ProFormText
- name="name"
- label="收费项目名称:"
- placeholder="请输入"
- rules={[{ required: true, message: '收费项目名称不能为空!' }]}
- />
- <ProFormSelect
- name="itemType"
- label="项目分类:"
- placeholder="请输入"
- request={async () => {
- const resp = await getDicDataBySysId(KcimCenterSysId, 'MED_SERVICE_ITEM_TYPE');
- if (resp) {
- const { dataVoList = [] } = resp;
- return dataVoList.map((a: any) => ({ label: a.name, value: a.code }))
- }
- return []
- }}
- rules={[{ required: false, message: '项目分类不能为空!' }]}
- />
- <ProFormText
- name="type"
- label="收费项目类别:"
- placeholder="请输入"
- // rules={[{ required: true, message: '收费项目类别不能为空!' }]}
- />
- <ProFormText
- name="nationalCode"
- label="国家编码:"
- placeholder="请输入"
- />
- <ProFormSelect
- name="standItem"
- label="标准项目名称:"
- placeholder="请选择"
- showSearch
- fieldProps={{
- labelInValue: true,
- }}
- request={async ({ keyWords }) => {
- const resp = await getStandItemList({ name: keyWords, pageSize: 100, current: 1 });
- if (resp) {
- return resp.list.map((a: any) => ({ label: a.name, value: a.code }))
- } else {
- return []
- }
- }}
- />
- <ProFormDigit
- name="price"
- label="单价:"
- placeholder="请输入"
- rules={[{ required: true, message: '单价不能为空!' }]}
- />
- </ModalForm>
- )
- }
- const tableDataSearchHandle = (paramName: string) => {
- set_tableDataFilterParams({
- ...tableDataFilterParams,
- [`${paramName}`]: tableDataSearchKeywords
- })
- }
- const downloadTemplate = async () => {
- await downloadTemplateReq('/costAccount/setting/exportItem');
- };
- const closeDrawer = () => {
- set_drawerVisible(false);
- }
- const switchBatchHandle = (bool:boolean)=>{
- set_ifBatchMatch(bool);
- }
- const importData = () => {
- return (
- <ModalForm
- width={360}
- title={`导入数据`}
- trigger={
- <a className="import" key="3">
- 导入
- </a>
- }
- submitter={{
- render: (props, defaultDoms) => {
- const needBtn = defaultDoms.filter((b) => {
- return b.key != 'rest';
- });
- return [
- ...needBtn,
- ];
- },
- }}
- onFinish={async (values) => {
- const {
- importFile: { fileList },
- } = values;
- let formData = new FormData();
- formData.append('file', fileList[0].originFileObj);
- const resp = await importDataPost(formData);
- if (resp) {
- tableRef.current?.reload();
- return true;
- }
- }}
- >
- <FormItem name={'importFile'}>
- <KCIMUpload downloadTemplateFile={() => downloadTemplate()} />
- </FormItem>
- </ModalForm>
- );
- };
-
- const batchMatchInit = async () => {
- const resp = await getAllNeedMatchItems();
- if (resp) {
- let needItem = undefined;
- for (const item of resp) {
- if (!item.match) {
- set_currentSelectRow(item);
- needItem = item;
- break; // 满足条件后退出循环
- }
- }
- if(!needItem){
- set_currentSelectRow(resp[0]);
- }
- }
- }
- useEffect(() => {
- if (ifBatchMatch) {
- batchMatchInit();
- }
- }, [ifBatchMatch]);
- return (
- <>
- <div style={{ padding: '0 16px', paddingTop: 16 }}>
- <Breadcrumb>
- <Breadcrumb.Item>收费项目设置</Breadcrumb.Item>
- <Breadcrumb.Item>
- {ifBatchMatch ? <a onClick={()=>set_ifBatchMatch(false)}>收费项目管理</a> : '收费项目管理'}
- </Breadcrumb.Item>
- {ifBatchMatch && <Breadcrumb.Item>项目匹配</Breadcrumb.Item>}
- </Breadcrumb>
- </div>
- <KCIMPagecontainer className='ChargeItemsMana' title={false} style={{padding:ifBatchMatch?0:16}}>
- <Drawer
- width={drawerType == 1 ? 800 : 1200}
- title={false}
- open={drawerVisible}
- afterOpenChange={bool => {
- set_drawerVisible(bool);
- if (!bool){ set_currentSelectRow(undefined); tableRef.current?.reload(); }
- }}
- headerStyle={{ height: 0, padding: 0, overflow: 'hidden' }}
- bodyStyle={{ padding: 0 }}
- destroyOnClose={true}
- >
- {drawerType == 1 && <Setting record={currentSelectRow} onVisibleChange={(bool: boolean) => set_drawerVisible(bool)} />}
- {drawerType == 2 && <MatchPage closeDrawer={closeDrawer} record={currentSelectRow} onVisibleChange={(bool: boolean) => set_drawerVisible(bool)} />}
- </Drawer>
- {
- !ifBatchMatch ? (
- <>
- <div className='toolBar'>
- <div className='filter'>
- <div className='filterItem'>
- <span className='label' style={{ whiteSpace: 'nowrap' }}> 检索:</span>
- <Input placeholder={'项目名称/国家编码'} allowClear
- suffix={
- <IconFont type="iconsousuo" style={{ color: '#99A6BF' }} 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 style={{ paddingRight: 16 }}><ProFormSwitch noStyle fieldProps={{
- size: 'small', onChange: (bool) => {
- set_stopStat(bool ? 1 : 0);
- tableRef.current?.reload();
- }
- }} />只显示未对照项目</span>
- {/* <span className='mapBtn' onClick={() => mapBtnHandle()}>对照</span> */}
- <span className='mapBtn' onClick={() => set_ifBatchMatch(true)}>批量匹配</span>
- {importData()}
- <UpDataActBtn record type='ADD' />
- </div>
- </div>
- <div style={{ marginTop: 16 }}>
- <KCIMTable
- scroll={{ x: 1500,y:`calc(100vh - 271px)` }}
- columns={columns as ProColumns[]}
- actionRef={tableRef} rowKey='id' params={tableDataFilterParams}
- request={(params) => getTableData(params)}
-
- // expandable={{ expandedRowRender }}
- />
- </div>
- </>
- ):(
- currentSelectRow&&<MatchPage closeDrawer={closeDrawer} switchBatchHandle={switchBatchHandle} single={false} record={currentSelectRow} onVisibleChange={(bool: boolean) => set_drawerVisible(bool)} />
- )
- }
- </KCIMPagecontainer>
- </>
- )
- }
|