index.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. import {useEffect,useState} from 'react';
  2. import { useSelector } from 'react-redux'
  3. import { Table,Modal, message, Menu, Breadcrumb, Dropdown, Space, Form, Input, Button, Row, Col, Select } from 'antd';
  4. import { DownOutlined,PlusOutlined } from '@ant-design/icons';
  5. import AddSubOrg from './AddSubOrg';
  6. import './index.less';
  7. import apiObj from '@api/index';
  8. import OrgContext from './org-context';
  9. const {post,api,xPost} = apiObj;
  10. const { Option } = Select;
  11. function OrgManager(){
  12. useEffect(() => {
  13. //监听resize事件
  14. setTableHt(window.innerHeight-260);
  15. window.addEventListener('resize',()=>{
  16. setTableHt(window.innerHeight-260);
  17. });
  18. //刷新列表
  19. getTableData();
  20. //解绑事件
  21. return function clear(){
  22. window.removeEventListener("resize");
  23. }
  24. },[]);
  25. const [dataSource, setDataSource] = useState([]); //列表数据
  26. const [orgDetail, setOrgDetail] = useState([]); //组织详情数据
  27. const [tableHt, setTableHt] = useState(300); //表格滚动高度
  28. const [visible,setVisible] = useState(false); //删除禁用确认弹窗显示
  29. const [addVisible,setAddVisible] = useState(false); //新增页面显示
  30. const [confirmLoading, setConfirmLoading] = useState(false);
  31. //弹窗类型:1删除 2有子组织、用户删除 3禁用 4有子组织、用户禁用 5重置密码
  32. const [modalType,setModalType] = useState(1);
  33. const [operId,setOperId] = useState(''); //当前操作的组织id
  34. const [orgId,setOrgId] = useState(''); //上级组织id
  35. const [orgName,setOrgName] = useState(''); //上级组织名称,新增修改用
  36. //从state中取出状态、类型列表
  37. const staticInfo =useSelector(state => {
  38. return state.staticInfo;
  39. });
  40. const {hisTypeList,statusList} = staticInfo;
  41. const tipText={
  42. 1:'确定要删除该组织?',
  43. 2:'当前组织内可能包含子组织或其相关用户,删除后所包含信息将一并被删除',
  44. 3:'确定要禁用该组织?',
  45. 4:'当前组织内可能包含子组织或其相关用户,禁用后所包含信息将一并被禁用',
  46. 5:'确定要重置该组织密码?',
  47. };
  48. //获取表格数据
  49. function getTableData(param={}){
  50. post(api.getHospitalListInfo,param).then((res)=>{
  51. if(res.data.code===200){
  52. const data = res.data.data;
  53. setOrgId(data[0]?data[0].hospitalId:'');
  54. setOrgName(data[0]?data[0].hospitalName:'')
  55. setDataSource(data);
  56. }
  57. })
  58. }
  59. //启用/禁用
  60. function enable(flag,id) {
  61. const param = {HospitalId:id||operId,status:flag};
  62. xPost(api.disableHospital,param).then((res)=>{
  63. if(res.data.code===200){
  64. getTableData();
  65. setVisible(false);
  66. message.success((flag?'启用':'禁用')+"成功");
  67. }else{
  68. message.warning(res.data.msg||'操作失败');
  69. }
  70. }).catch(()=>{
  71. message.error("接口出错");
  72. });
  73. }
  74. //重置密码
  75. function onResetPsd(){
  76. const param = {HospitalId:operId};
  77. xPost(api.resetPassword,param).then((res)=>{
  78. if(res.data.code===200){
  79. getTableData();
  80. setVisible(false)
  81. message.success("重置成功");
  82. }else{
  83. message.warning(res.data.msg||'操作失败');
  84. }
  85. }).catch(()=>{
  86. message.error("接口出错");
  87. });
  88. }
  89. //删除
  90. function onDelete(){
  91. const param = {HospitalId:operId};
  92. xPost(api.deleteHospital,param).then((res)=>{
  93. if(res.data.code===200){
  94. getTableData();
  95. setVisible(false);
  96. message.success("删除成功");
  97. }else{
  98. message.warning(res.data.msg||'操作失败');
  99. }
  100. }).catch(()=>{
  101. message.error("接口出错");
  102. });
  103. }
  104. //显示弹窗
  105. function showModal(type,id){
  106. setModalType(type);
  107. setOperId(id);
  108. setVisible(true);
  109. }
  110. //弹窗确认事件
  111. function handleOk(){
  112. if("1,2".indexOf(modalType)>-1){
  113. onDelete();
  114. }else if("3,4".indexOf(modalType)>-1){
  115. enable(0);
  116. }else if(modalType===5){
  117. onResetPsd();
  118. }
  119. }
  120. //弹窗取消
  121. function handleCancel(){
  122. setVisible(false);
  123. setAddVisible(false);
  124. }
  125. //新增子组织弹窗
  126. function showAddOrg(){
  127. setAddVisible(true);
  128. }
  129. function getOrgDetail(id,type){
  130. xPost(api.getHospitalById,{HospitalId:id,type}).then((res)=>{
  131. const {data,code}=res.data;
  132. if(code===200){
  133. console.log(data)
  134. structDetail(data);
  135. //setOrgDetail(res.data.data);
  136. }else{
  137. message.warning(res.data.msg||'获取详情失败')
  138. }
  139. });
  140. }
  141. function structDetail(data){
  142. let obj = Object.assign({},data);
  143. //obj.addHospitalUserVO=Object.assign({},data.getHospitalUserDTO);
  144. //obj.softwares=Object.assign({},data.loginUserMenuResourceTree);
  145. }
  146. //修改子组织
  147. function editSubOrg(id,type){
  148. getOrgDetail(id,type);
  149. setAddVisible(true);
  150. }
  151. //保存
  152. function addSubOrg(formData){
  153. console.log('保存参数:',formData);
  154. const param = formData;
  155. post(api.addHospital,param).then((res)=>{
  156. if(res.data.code===200){
  157. getTableData();
  158. setAddVisible(false);
  159. message.success("添加成功");
  160. }else{
  161. message.warning(res.data.msg||'操作失败');
  162. }
  163. }).catch(()=>{
  164. message.error("接口出错");
  165. });
  166. }
  167. function goBack(){
  168. setAddVisible(false);
  169. }
  170. //表格渲染
  171. function RenderTable(){
  172. const columns = [
  173. { title: '组织机构层级', dataIndex: 'hospitalName', key: 'hospitalName' },
  174. { title: '类型',width:150, key: 'type',render:(row)=>{
  175. if(row.children){
  176. return '-'
  177. }else{
  178. return row.typeName;
  179. }
  180. } },
  181. { title: '状态',width:120, key: 'status',render:(row)=>{
  182. if(row.children){
  183. return '-'
  184. }else{
  185. return (<span className={ (row.status==='1')?'Enable':'Disable' }>{row.statusName}</span>);
  186. }
  187. } },
  188. { title: '创建时间',width:240, dataIndex: 'gmtCreate', key: 'gmtCreate' },
  189. { title: '操作',width:240, key: 'operation', render: (row) => {
  190. //console.log(21,row)
  191. if(row.rootFlag){
  192. return '-'
  193. }
  194. const menu = (
  195. <Menu>
  196. <Menu.Item key="0" onClick={()=>showModal(5,row.hospitalId)}>重置密码</Menu.Item>
  197. <Menu.Item key="1" onClick={()=>showModal((row.hasUserFlag||row.hasHospitalFlag?2:1),row.hospitalId)}>删除</Menu.Item>
  198. </Menu>
  199. );
  200. return (<Space size="middle">
  201. <a onClick={()=>editSubOrg(row.hospitalId,row.type)}>修改</a>
  202. {row.status==='1'?(<a onClick={()=>showModal(row.hasUserFlag||row.hasHospitalFlag?4:3,row.hospitalId)}>禁用</a>):(<a onClick={()=>enable(1,row.hospitalId)}>启用</a>)}
  203. <Dropdown overlay={menu} trigger={['click']}>
  204. <a className="ant-dropdown-link">
  205. 更多 <DownOutlined />
  206. </a>
  207. </Dropdown>
  208. </Space>) }},
  209. ];
  210. return (
  211. <Table
  212. scroll={{ y: tableHt }}
  213. pagination={false}
  214. className="components-table-demo-nested"
  215. rowKey={record => record.hospitalId}
  216. expandable={{defaultExpandAllRows:true}}
  217. columns={columns}
  218. dataSource={dataSource}
  219. />
  220. )
  221. }
  222. //筛选项渲染
  223. const [form] = Form.useForm();
  224. const onFinish = (values: any) => {
  225. getTableData(values);
  226. console.log('筛选项:',values);
  227. };
  228. const onReset = () => {
  229. form.resetFields();
  230. getTableData();
  231. };
  232. if(addVisible){
  233. return (
  234. <OrgContext.Provider value={{orgId,orgName,hisTypeList,save:addSubOrg}}>
  235. <AddSubOrg back={goBack}/>
  236. </OrgContext.Provider>
  237. )
  238. }
  239. return (
  240. <div className='wrapper'>
  241. <div className="filter-box">
  242. <Form form={form} name="control-hooks" onFinish={onFinish}>
  243. <Row gutter={24}>
  244. <Col span={5} key={0}>
  245. <Form.Item name="hospitalName" label="组织名称">
  246. <Input placeholder='组织名称'/>
  247. </Form.Item>
  248. </Col>
  249. <Col span={5} key={1}>
  250. <Form.Item name="type" label="类型">
  251. <Select
  252. allowClear
  253. >
  254. {hisTypeList.map((item)=>{
  255. return (
  256. <Option value={item.name} key={item.name}>{item.val}</Option>
  257. )
  258. })}
  259. </Select>
  260. </Form.Item>
  261. </Col>
  262. <Col span={5} key={2}>
  263. <Form.Item name="status" label="当前状态">
  264. <Select
  265. allowClear
  266. >
  267. {statusList.map((item)=>{
  268. return (
  269. <Option value={item.name} key={item.name}>{item.val}</Option>
  270. )
  271. })}
  272. </Select>
  273. </Form.Item>
  274. </Col>
  275. <Col span={9} key={3}>
  276. <Form.Item>
  277. <Button type="primary" htmlType="submit">
  278. 查询
  279. </Button>
  280. <Button htmlType="button" onClick={onReset}>
  281. 重置
  282. </Button>
  283. </Form.Item>
  284. </Col>
  285. </Row>
  286. </Form>
  287. </div>
  288. <div className="table">
  289. <div className="table-header">
  290. <h2 className="table-title">组织管理</h2>
  291. <Button type="primary" icon={<PlusOutlined />} onClick={()=> showAddOrg()}>新增子组织</Button>
  292. </div>
  293. <RenderTable />
  294. </div>
  295. <Modal
  296. title="提示"
  297. okText='确定'
  298. cancelText='取消'
  299. width={400}
  300. visible={visible}
  301. onOk={handleOk}
  302. confirmLoading={confirmLoading}
  303. onCancel={handleCancel}
  304. >
  305. <p>{tipText[modalType]}</p>
  306. </Modal>
  307. </div>
  308. )
  309. }
  310. export default OrgManager;