index.tsx 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545
  1. /*
  2. * @Author: code4eat awesomedema@gmail.com
  3. * @Date: 2023-03-03 11:30:33
  4. * @LastEditors: code4eat awesomedema@gmail.com
  5. * @LastEditTime: 2023-05-12 14:04:00
  6. * @FilePath: /KC-MiddlePlatform/src/pages/platform/setting/pubDicTypeMana/index.tsx
  7. * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  8. */
  9. import BMSPagecontainer from '@/components/BMSPageContainer';
  10. import { BMSTable } from '@/components/BMSTable';
  11. import { createFromIconfontCN } from '@ant-design/icons';
  12. import { ActionType } from '@ant-design/pro-components';
  13. import { ModalForm, ProFormText, ProFormTextArea } from '@ant-design/pro-form';
  14. import { ProColumns } from '@ant-design/pro-table';
  15. import { Button, Dropdown, Input, MenuProps, message, Modal, Popconfirm, Space, Switch, Table } from 'antd';
  16. import { TransferItem, TransferProps } from 'antd/es/transfer';
  17. import React, { Key } from 'react';
  18. import { useEffect, useImperativeHandle, useRef, useState } from 'react';
  19. import { getMedicalGroup, getEmpTableDataFromMedicalGroup, addMedicalGroup, editMedicalGroup, delLeftReportData, getMedicalAllEmp, addMedicalGroupEmp, MedicalEmpInfoType, updateMedicalGroupEmpInfo, delTableData } from './service';
  20. import './style.less';
  21. const IconFont = createFromIconfontCN({
  22. scriptUrl: '//at.alicdn.com/t/c/font_1927152_4nm5kxbv4m3.js',
  23. });
  24. const MedicalGroupSet = () => {
  25. const [tableDataFilterParams, set_tableDataFilterParams] = useState<any | undefined>();
  26. const [typeList, set_typeList] = useState<any[]>([]);
  27. const [showTypeListArr, set_showTypeListArr] = useState<any[]>([]);
  28. const [currentSelectedType, set_currentSelectedType] = useState<any | undefined>(undefined);
  29. const [tableSelectedKeys, set_tableSelectedKeys] = useState<any[]>([]);
  30. const [selectedAddKeys, set_selectedAddKeys] = useState<Key[]>([]);
  31. const [ifShowModal, set_ifShowModal] = useState(false);
  32. const [currentEditLeftData, set_currentEditLeftData] = useState<any | undefined>(undefined);
  33. const [ifEditTable, set_ifEditTable] = useState(false);
  34. const tableRef = useRef<ActionType>();
  35. const ref = React.createRef<{ save: any; getSelectedKeys: any }>();
  36. const column = [
  37. {
  38. title: '工号',
  39. ellipsis: true,
  40. dataIndex: 'account',
  41. },
  42. {
  43. title: '姓名',
  44. dataIndex: 'name',
  45. },
  46. {
  47. title: '组长',
  48. dataIndex: 'medicalGroupManager',
  49. render: (_: any, record: any) => {
  50. return <Switch size='small' checked={_} onChange={(bool) => switchChangeHandle(bool, record, 'medicalGroupManager')} />
  51. }
  52. },
  53. {
  54. title: '操作',
  55. key: 'option',
  56. valueType: 'option',
  57. render: (_: any, record: any) => {
  58. return [
  59. <Popconfirm
  60. title="是否确认删除?"
  61. key="del"
  62. onConfirm={() => delTableDataHanfle(record)}
  63. >
  64. <a>删除</a>
  65. </Popconfirm>
  66. ]
  67. },
  68. },
  69. ]
  70. const delTableDataHanfle = async (record?: { id: number; }) => {
  71. const resp = await delTableData(record ? [record.id] : [...tableSelectedKeys]);
  72. if (resp) {
  73. set_tableSelectedKeys([]);
  74. tableRef.current?.reload();
  75. }
  76. }
  77. const [tableColumn, set_tableColumn] = useState<ProColumns[] | any[]>(column);
  78. const getTableData = async (params: any, sort: any, filter: any) => {
  79. const { medicalGroupCode } = params;
  80. if (medicalGroupCode) {
  81. const resp = await getEmpTableDataFromMedicalGroup(params);
  82. if (resp) {
  83. return {
  84. data: resp.list,
  85. success: true,
  86. total: resp.totalCount,
  87. pageSize: resp.pageSize,
  88. totalPage: resp.totalPage,
  89. }
  90. }
  91. }
  92. return {
  93. data: [],
  94. success: true
  95. }
  96. }
  97. const switchChangeHandle = async (checked: boolean, record: any, key: string) => {
  98. const result = { ...record, medicalGroupManager: checked ? 1 : 0 }
  99. const resp = await updateMedicalGroupEmpInfo(result);
  100. if (resp) {
  101. tableRef.current?.reload();
  102. }
  103. }
  104. //获取左侧数据
  105. const getPageLeftData = async () => {
  106. const resp = await getMedicalGroup();
  107. if (resp) {
  108. set_typeList(resp);
  109. set_showTypeListArr(resp);
  110. }
  111. }
  112. const updateTable = async (formVal: any, type: 'EDIT' | "ADD" | 'ADD_LEFTDATA' | 'EDIT_LEFTDATA') => {
  113. // console.log({formVal,type});
  114. if (type == 'ADD_LEFTDATA') {
  115. const resp = await addMedicalGroup({
  116. name: formVal.name,
  117. remark: formVal.remark,
  118. });
  119. if (resp) {
  120. getPageLeftData();
  121. }
  122. }
  123. if (type == 'EDIT_LEFTDATA') {
  124. const resp = await editMedicalGroup({
  125. id: formVal.id,
  126. name: formVal.name,
  127. remark: formVal.remark
  128. });
  129. if (resp) {
  130. getPageLeftData();
  131. }
  132. }
  133. return true;
  134. }
  135. const UpDataActBtn = ({ record, type }: { record: any, type: 'EDIT' | 'ADD' | 'ADD_LEFTDATA' | 'EDIT_LEFTDATA' }) => {
  136. const getTrriger = () => {
  137. if (type == 'ADD') {
  138. return <span className='add'>添加</span>
  139. }
  140. if (type == 'EDIT') {
  141. return <a key="edit" >编辑</a>
  142. }
  143. if (type == 'ADD_LEFTDATA') {
  144. return (
  145. <div className='add'>
  146. <img src={require('../../../../../static/addIcon_black.png')} alt="" />
  147. </div>
  148. )
  149. }
  150. if (type == 'EDIT_LEFTDATA') {
  151. return <a key="edit" >编辑</a>
  152. }
  153. }
  154. return (
  155. <ModalForm
  156. title={type == 'ADD_LEFTDATA' ? `新增医疗组` : `编辑医疗组`}
  157. width={352}
  158. initialValues={type == 'EDIT_LEFTDATA' ? { ...record } : {}}
  159. trigger={
  160. getTrriger()
  161. }
  162. onFinish={(val) => {
  163. return updateTable(type == 'EDIT_LEFTDATA' ? { ...record, ...val } : val, type);
  164. }}
  165. >
  166. <ProFormText
  167. label='医疗组名称:'
  168. name='name'
  169. rules={[{ required: true, message: '名称不能为空!' }]}
  170. />
  171. <ProFormTextArea
  172. label='说明:'
  173. name='remark'
  174. />
  175. </ModalForm>
  176. )
  177. }
  178. interface TableSelecterProps extends TransferProps<TransferItem> {
  179. tableSelecterColumn: any[];
  180. record: any
  181. }
  182. const tableSelecterColumn: any[] = [
  183. {
  184. title: '工号',
  185. dataIndex: 'account',
  186. },
  187. {
  188. title: '姓名',
  189. dataIndex: 'name',
  190. },
  191. ];
  192. const addGroupEmpHandle = () => {
  193. const ref = React.createRef<{ save: any; getSelectedKeys: any }>();
  194. set_ifShowModal(true);
  195. // Modal.confirm({
  196. // title: `添加医疗组人员信息`,
  197. // icon: <></>,
  198. // width: 400,
  199. // centered: true,
  200. // content: <TableSelecter
  201. // ref={ref}
  202. // record={undefined}
  203. // tableSelecterColumn={tableSelecterColumn}
  204. // ></TableSelecter>,
  205. // // onOk: () => {
  206. // // return ref.current && ref.current.save();
  207. // // }
  208. // })
  209. }
  210. const TableSelecter = React.forwardRef(({ tableSelecterColumn, record }: TableSelecterProps, ref) => {
  211. const [datasource, set_datasource] = useState<any[]>([]);
  212. const [selectedKeys, setSelectedKeys] = useState<React.Key[]>([]);
  213. const [showList, set_showList] = useState<any[]>([]);
  214. //获取表格数据
  215. const getFuncList = async () => {
  216. const resp = await getMedicalAllEmp({ medicalGroupCode: currentSelectedType.code });
  217. if (resp) {
  218. set_datasource(resp);
  219. set_showList(resp);
  220. }
  221. }
  222. const onSelectChange = (newSelectedRowKeys: React.Key[]) => {
  223. setSelectedKeys([...newSelectedRowKeys]);
  224. };
  225. const save = async () => {
  226. const needData = datasource.filter(item => selectedKeys.includes(item.userId));
  227. const result = {
  228. medicalGroupCode: currentSelectedType.code as string,
  229. employee: needData as MedicalEmpInfoType[]
  230. };
  231. const resp = await addMedicalGroupEmp(result);
  232. if (resp) {
  233. message.success('添加成功!');
  234. set_ifShowModal(false);
  235. tableRef.current?.reload();
  236. }
  237. }
  238. useEffect(() => {
  239. getFuncList();
  240. }, [])
  241. return (
  242. <div className='TableSelecter'>
  243. <Input placeholder={'请输入'} allowClear
  244. suffix={
  245. <IconFont type="iconsousuo" />
  246. }
  247. style={{ marginBottom: 8 }}
  248. onChange={(e) => {
  249. if (e.target.value.length != 0) {
  250. const result = datasource.filter(item => item.name.indexOf(e.target.value) != -1);
  251. set_showList(result);
  252. } else {
  253. set_showList(datasource);
  254. }
  255. }}
  256. />
  257. <BMSTable columns={tableSelecterColumn}
  258. options={{
  259. density: true,
  260. setting: {
  261. listsHeight: 100,
  262. },
  263. }}
  264. rowKey='userId'
  265. tableAlertRender={false}
  266. rowSelection={{
  267. // 自定义选择项参考: https://ant.design/components/table-cn/#components-table-demo-row-selection-custom
  268. // 注释该行则默认不显示下拉选项
  269. selections: [Table.SELECTION_ALL, Table.SELECTION_INVERT],
  270. onChange: onSelectChange,
  271. }}
  272. pagination={{ showSizeChanger: false, pageSize: 10, simple: true, showTitle: false }}
  273. dataSource={showList}
  274. />
  275. <div className='footer'>
  276. <span className='cancel' onClick={() => set_ifShowModal(false)}>取消</span>
  277. <span className='ok' onClick={() => save()}>{`确认(${selectedKeys.length > 0 && selectedKeys.length})`}</span>
  278. </div>
  279. </div>
  280. )
  281. });
  282. const moreItems: MenuProps['items'] = [
  283. {
  284. key: '1',
  285. label: <UpDataActBtn key={'act'} record={currentEditLeftData} type='EDIT_LEFTDATA' />,
  286. },
  287. {
  288. key: '2',
  289. label: (
  290. <a onClick={async (e) => {
  291. e.preventDefault();
  292. const resp = await delLeftReportData(currentEditLeftData.id);
  293. if (resp) {
  294. getPageLeftData();
  295. }
  296. }}>
  297. 删除
  298. </a>
  299. ),
  300. }
  301. ];
  302. const onTableSelectChange = (newSelectedRowKeys: React.Key[]) => {
  303. set_tableSelectedKeys([...newSelectedRowKeys]);
  304. };
  305. useEffect(() => {
  306. if (currentSelectedType) {
  307. set_tableDataFilterParams({ ...tableDataFilterParams, medicalGroupCode: currentSelectedType.code });
  308. }
  309. }, [currentSelectedType])
  310. useEffect(() => {
  311. if (showTypeListArr.length > 0) {
  312. set_currentSelectedType(showTypeListArr[0]);
  313. //set_tableDataFilterParams({ ...tableDataFilterParams, medicalGroupCode: showTypeListArr[0].code });
  314. }
  315. }, [showTypeListArr]);
  316. useEffect(() => {
  317. getPageLeftData();
  318. }, [])
  319. return (
  320. <BMSPagecontainer title={false} className='MedicalGroupSet'>
  321. <ModalForm title={'添加医疗组人员信息'} width={400} submitter={{
  322. render: (props, defaultDoms) => []
  323. }} open={ifShowModal} modalProps={{
  324. closable: false,
  325. }}>
  326. <TableSelecter
  327. ref={ref}
  328. record={undefined}
  329. tableSelecterColumn={tableSelecterColumn}
  330. ></TableSelecter>
  331. </ModalForm>
  332. <div className='left'>
  333. <div className='toolbar'>
  334. <Input placeholder={'医疗组名称'} allowClear
  335. suffix={
  336. <IconFont type="iconsousuo" />
  337. }
  338. style={{ width: 156 }}
  339. onChange={(e) => {
  340. const result = typeList.filter(item => item.name.indexOf(e.target.value) != -1);
  341. set_showTypeListArr(result);
  342. }}
  343. />
  344. <UpDataActBtn key={'act'} record={undefined} type='ADD_LEFTDATA' />
  345. </div>
  346. <div className='wrap'>
  347. {
  348. showTypeListArr.map((item, index) => {
  349. return (
  350. <div className={currentSelectedType ? currentSelectedType.id == item.id ? 'type on' : 'type' : 'type'}
  351. key={index}
  352. onClick={() => {
  353. if (ifEditTable) {
  354. //编辑状态还未保存
  355. Modal.confirm({
  356. title: '当前存在编辑未保存,请保存后再操作!',
  357. okText: '放弃编辑',
  358. cancelText: '继续编辑',
  359. onOk(...args) {
  360. set_ifEditTable(false);
  361. set_currentSelectedType(item);
  362. },
  363. })
  364. } else {
  365. set_currentSelectedType(item)
  366. }
  367. }}
  368. >
  369. <div className='content'>
  370. <div className='name'>{item.name}</div>
  371. </div>
  372. <Dropdown menu={{ items: moreItems }} placement="bottom" onOpenChange={(bool) => { bool && set_currentEditLeftData(item) }}>
  373. <div className='more'>
  374. <img src={require('../../../../../static/more_point_gray.png')} alt="" />
  375. </div>
  376. </Dropdown>
  377. </div>
  378. )
  379. })
  380. }
  381. </div>
  382. </div>
  383. <div className='right'>
  384. <div className='toolBar'>
  385. <div className='filter'>
  386. <span style={{ fontSize: 16, color: '#17181A', fontWeight: 500 }}>{currentSelectedType ? currentSelectedType.name : ''}</span>
  387. </div>
  388. <div className='btnGroup'>
  389. {<span className='manaBtn' onClick={() => addGroupEmpHandle()}>添加</span>}
  390. </div>
  391. </div>
  392. <div style={{ marginTop: 16 }}>
  393. {currentSelectedType && <BMSTable actionRef={tableRef} columns={tableColumn}
  394. rowKey='id'
  395. pagination={false}
  396. tableAlertRender={false}
  397. rowSelection={{
  398. // 自定义选择项参考: https://ant.design/components/table-cn/#components-table-demo-row-selection-custom
  399. // 注释该行则默认不显示下拉选项
  400. //selections: [Table.SELECTION_ALL, Table.SELECTION_INVERT, Table.SELECTION_NONE,],
  401. onChange: onTableSelectChange,
  402. }}
  403. tableAlertOptionRender={() => {
  404. return (
  405. <Space size={16}>
  406. <Popconfirm
  407. title="是否确认删除?"
  408. key="del"
  409. onConfirm={() => delTableDataHanfle()}
  410. >
  411. <a>批量删除</a>
  412. </Popconfirm>
  413. </Space>
  414. );
  415. }}
  416. params={tableDataFilterParams}
  417. request={(params, sort, filter) => getTableData(params, sort, filter)}
  418. />}
  419. </div>
  420. </div>
  421. {
  422. tableSelectedKeys.length > 0 && (
  423. <div className='bottomToolbar'>
  424. <span className='leftAccount'>已选择<a>{tableSelectedKeys.length}</a>项</span>
  425. <div className='btnGroup'>
  426. <span className='cancel' onClick={() => tableRef.current?.clearSelected&&tableRef.current?.clearSelected()}>取消选择</span>
  427. <Popconfirm
  428. title="是否确认删除?"
  429. key="del"
  430. onConfirm={() => delTableDataHanfle()}
  431. >
  432. <span className='batchDel'>批量删除</span>
  433. </Popconfirm>
  434. </div>
  435. </div>
  436. )
  437. }
  438. </BMSPagecontainer >
  439. )
  440. }
  441. export default MedicalGroupSet;