index.js 11 KB

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