index.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. import React, { useState, useEffect } from 'react';
  2. import { Form, Input, Button, Table, Select, Space, Modal, message, Row, Col } from 'antd';
  3. import { DownOutlined, PlusOutlined, ExclamationCircleOutlined } from '@ant-design/icons';
  4. // import NormalPlayer from './testComponent/testComponent'
  5. import '@common/common.less';
  6. import apiObj from '@api/index';
  7. import utils from '@utils/index';
  8. import DataContext from './data-context';
  9. import AddData from './AddData';
  10. const { post, api, xPost } = apiObj;
  11. const { Option } = Select;
  12. const {filterIds }=utils;
  13. function DataManager() {
  14. useEffect(() => {
  15. getDataAuthPage();
  16. }, []);
  17. const [userList, setUserList] = useState([]);
  18. const [currentId, setCurrentId] = useState(""); //编辑数据的id
  19. const [modalType, setModalType] = useState("");
  20. const [msvisible, setMsvisible] = useState(false);
  21. const [operType, setOperType] = useState(""); //操作类型:1新增 3修改
  22. const [addVisible, setaddVisible] = useState(false);
  23. const [formData, setFormData] = useState(null);
  24. const [total, setTotal] = useState(0);
  25. const [authChecksArr, setAuthChecksArr] = useState({}); //选中数据
  26. const [tag, setTag] = useState([[]]);
  27. const [val, setVal] = useState([]);
  28. const [size, setSize] = useState(15);
  29. const [current, setCurrent] = useState(1);
  30. const [params, setParams] = useState({
  31. pages: 1,
  32. current: 1,
  33. size: 15
  34. });
  35. const [form] = Form.useForm();
  36. const tipText = {
  37. 1: '确定要删除该数据权限?',
  38. 2: '确定要禁用该数据权限?',
  39. };
  40. let data = {
  41. pages: 1,
  42. current: 1,
  43. size: size
  44. }
  45. const showModal = (flag, id) => {
  46. setOperType(flag)
  47. setCurrentId(id)
  48. //新增
  49. if (flag == 1) {
  50. setaddVisible(true)
  51. //新增时状态默认启用
  52. setFormData({
  53. status: '1'
  54. });
  55. setVal([])
  56. }
  57. //修改
  58. if (flag == 3) {
  59. getDataAuthById(id)
  60. }
  61. }
  62. //表格数据
  63. function getDataAuthPage(param) {
  64. //const param = filterData;
  65. post(api.getDataAuthPage, param || params).then((res) => {
  66. if (res.data.code === 200) {
  67. const data = res.data.data;
  68. setUserList(data.records);
  69. setTotal(data.total)
  70. }
  71. })
  72. }
  73. //禁用启用
  74. const disableAuth = (id, status) => {
  75. let params = {
  76. id: id,
  77. status: status
  78. }
  79. xPost(api.disableAuth, params).then((res) => {
  80. if (res.data.code === 200) {
  81. getDataAuthPage();
  82. setMsvisible(false);
  83. message.success((status ? '启用' : '禁用') + "成功");
  84. } else {
  85. message.warning(res.data.msg || '操作失败');
  86. }
  87. })
  88. };
  89. //删除
  90. const deleteAuth = (id) => {
  91. let params = {
  92. id: id,
  93. }
  94. xPost(api.deleteAuth, params).then((res) => {
  95. if (res.data.code === 200) {
  96. getDataAuthPage();
  97. setMsvisible(false);
  98. message.success("删除成功");
  99. } else {
  100. message.warning(res.data.msg || '操作失败');
  101. }
  102. })
  103. };
  104. //查看
  105. function getDataAuthById(id) {
  106. xPost(api.getDataAuthById, { id: id }).then((res) => {
  107. if (res.data.code === 200) {
  108. const data = res.data.data;
  109. structEditData(data);
  110. }else{
  111. message.warning(res.data.msg || '详情获取失败');
  112. }
  113. })
  114. }
  115. //重组成提交需要的数据
  116. function structEditData(data){
  117. const {id,name,status,softwares} = data;console.log('id:',id)
  118. let formObj = {
  119. id,
  120. name,
  121. status,
  122. softwareVOS:[]
  123. };
  124. let tempArr = [],authArr=[],checkedsObj={}; //权限数据
  125. softwares.map((software,i)=>{
  126. const {id,name,roles,dataAuthDetail,dataType} = software;
  127. const {depts,doctors,hospitals} = dataAuthDetail||{};
  128. tempArr = [...depts||[],...doctors||[],...hospitals||[]];
  129. checkedsObj[i] = fullfillVals(dataAuthDetail);
  130. authArr[i] = {
  131. id,name,dataType:(dataType||'')+''||'7',roles:filterIds(roles||[]),dataAuthDetails:dataType==='7'?tempArr:null
  132. };
  133. //setTag[i] = tempArr;
  134. });
  135. formObj.softwareVOS = authArr;
  136. /*let roles = []
  137. let dataAuthDetails = []
  138. let selectedRowKeys = []
  139. let softwareMenuIds = []
  140. let arr = JSON.parse(JSON.stringify(data).replace(/softwares/g, 'softwareVOS').replace(/dataAuthDetail/g, 'dataAuthDetails'))
  141. arr.softwareVOS.map((it, i) => {
  142. roles[i] = []
  143. dataAuthDetails[i] = []
  144. selectedRowKeys[i] = []
  145. softwareMenuIds[i] = []
  146. tag[i] = []
  147. //所属角色数据另存
  148. arr.softwareVOS[i].roles.forEach(item => {
  149. roles[i].push(item.id)
  150. })
  151. //遍历出权限范围数据,已选中的数据遍历出来
  152. const authDetails = arr.softwareVOS[i].dataAuthDetails
  153. authDetails && authDetails.depts && authDetails.depts.forEach(item => {
  154. dataAuthDetails[i].push({
  155. dataType: 7,
  156. detailId: item.hospitalId,
  157. detailType: item.detailType
  158. })
  159. tag[i].push({
  160. id: item.id,
  161. name: item.name,
  162. type: item.detailType
  163. })
  164. //科室树形结构选中的id
  165. softwareMenuIds[i].push(item.hospitalId + '-' + item.id + '-' + item.name)
  166. })
  167. authDetails && authDetails.doctors && authDetails.doctors.forEach(item => {
  168. dataAuthDetails[i].push({
  169. dataType: 7,
  170. detailId: item.id,
  171. detailType: item.detailType
  172. })
  173. tag[i].push({
  174. id: item.id,
  175. name: item.name,
  176. type: item.detailType
  177. })
  178. selectedRowKeys[i].push(item.id + '-' + item.name)
  179. })
  180. authDetails && authDetails.hospitals && authDetails.hospitals.forEach(item => {
  181. dataAuthDetails[i].push({
  182. dataType: 7,
  183. detailId: item.id,
  184. detailType: item.detailType
  185. })
  186. tag[i].push({
  187. id: item.id,
  188. name: item.name,
  189. type: item.detailType
  190. })
  191. softwareMenuIds[i].push(item.id + '-' + item.name)
  192. })
  193. arr.softwareVOS[i].roles = roles[i]
  194. arr.softwareVOS[i].dataAuthDetails = dataAuthDetails[i] && dataAuthDetails[i].length > 0 ? dataAuthDetails[i] : [{ dataType: it.dataType }]
  195. arr.softwareVOS[i].selectedRowKeys = selectedRowKeys[i]
  196. arr.softwareVOS[i].softwareMenuIds = softwareMenuIds[i]
  197. if (arr.softwareVOS[i].dataAuthDetails && arr.softwareVOS[i].dataAuthDetails.length > 0) {
  198. arr.softwareVOS[i].datatype = JSON.stringify(arr.softwareVOS[i].dataAuthDetails[0].dataType)
  199. val[i] = arr.softwareVOS[i].dataAuthDetails[0].dataType
  200. } else {
  201. arr.softwareVOS[i].datatype = JSON.stringify(arr.softwareVOS[i].dataType)
  202. val[i] = arr.softwareVOS[i].dataType
  203. }
  204. });
  205. console.log(tag);
  206. setTag(tag) //要显示的标签数据
  207. setVal(val) //数据权限类型*/
  208. setAuthChecksArr(checkedsObj);
  209. setFormData(formObj) //表单数据
  210. setaddVisible(true);
  211. }
  212. function fullfillVals(data){
  213. data.map((it)=>{
  214. return Object.assign(it,{dataType:'7',detailId:it.id});
  215. })
  216. }
  217. //保存
  218. function addData(formData) {
  219. let url = api.addAuth;
  220. delete formData.roles
  221. const arr = formData.softwareVOS.filter((it) => {
  222. if (Object.keys(it).length && it.id ) {
  223. return it;
  224. }
  225. });
  226. formData.softwareVOS = arr;
  227. let param = {
  228. addDataAuthVO: formData,
  229. }
  230. if (operType == 3) {
  231. url = api.updateAuth
  232. param = {
  233. updateDataAuthVO: {
  234. ...formData,
  235. id: currentId
  236. },
  237. }
  238. }
  239. post(url, param).then((res) => {
  240. if (res.data.code === 200) {
  241. getDataAuthPage();
  242. setaddVisible(false)
  243. setFormData(null)
  244. message.success("修改成功");
  245. } else {
  246. message.warning(res.data.msg || '操作失败');
  247. }
  248. }).catch(() => {
  249. message.error("接口出错");
  250. });
  251. }
  252. const onFinish = (value) => {
  253. const param = {
  254. ...value,
  255. ...params
  256. }
  257. setCurrent(1)
  258. setParams(param)
  259. getDataAuthPage(param);
  260. };
  261. const onReset = () => {
  262. setCurrent(1)
  263. setParams(data)
  264. form.resetFields();
  265. getDataAuthPage(data);
  266. };
  267. const messageBox = (type, id) => {
  268. setMsvisible(true)
  269. setCurrentId(id)
  270. setModalType(type)
  271. };
  272. const columns = [
  273. { title: '数据权限名称', dataIndex: 'name', key: 'index' },
  274. { title: '所属角色', dataIndex: 'roleName', key: 'index' },
  275. {
  276. title: '状态', dataIndex: 'status', key: 'status', render: (text, record) => (
  277. <Space size="middle">
  278. {record.status == 1 ?
  279. <span className="Enable">启用</span>
  280. :
  281. <span className="Disable">禁用</span>
  282. }
  283. </Space>
  284. )
  285. },
  286. {
  287. title: '操作', dataIndex: 'key', render: (text, record) => (
  288. <Space size="middle">
  289. <a onClick={e => showModal(3, record.id)}>修改</a>
  290. {record.status === '1' ? (<a className="disable" onClick={() => messageBox(2, record.id)}>禁用</a>) : (<a onClick={() => disableAuth(record.id, 1)}>启用</a>)}
  291. <a className="delete" onClick={() => messageBox(1, record.id)} >删除</a>
  292. </Space>
  293. )
  294. }
  295. ]
  296. function showAddData() {
  297. setaddVisible(true)
  298. }
  299. //提示框确认事件
  300. function handleOk() {
  301. if (modalType == 1) {
  302. deleteAuth(currentId, 0)
  303. } else if (modalType == 2) {
  304. disableAuth(currentId, 0)
  305. }
  306. }
  307. //提示框取消
  308. function handleCancel() {
  309. setMsvisible(false);
  310. }
  311. function goBack() {
  312. setaddVisible(false)
  313. setFormData(null)
  314. getDataAuthPage()
  315. }
  316. function onSizeChange(current, pageSize) {
  317. params.current = current
  318. params.size = pageSize
  319. setSize(pageSize)
  320. setCurrent(current)
  321. setParams(params)
  322. getDataAuthPage()
  323. }
  324. function changePage(page, pageSize) {
  325. params.current = page
  326. params.size = pageSize
  327. setCurrent(page)
  328. setParams(params)
  329. getDataAuthPage()
  330. }
  331. if (addVisible && formData) { //新增/修改界面
  332. return (
  333. <DataContext.Provider value={{ save: addData, formData: formData, operType,authChecksArr, val, tag }}>
  334. <AddData back={goBack} />
  335. </DataContext.Provider>
  336. )
  337. }
  338. return (
  339. <div className="wrapper">
  340. <div className="filter-box">
  341. <Form
  342. form={form}
  343. name="normal_login"
  344. onFinish={onFinish}
  345. initialValues={{ status: '' }}
  346. >
  347. <Row gutter={24}>
  348. <Col span={5} key={0}>
  349. <Form.Item label="数据权限名称" name="username">
  350. <Input placeholder="用户名" autoComplete='off'/>
  351. </Form.Item>
  352. </Col>
  353. <Col span={5} key={1}>
  354. <Form.Item label="所属角色" name="name">
  355. <Input placeholder="姓名" autoComplete='off'/>
  356. </Form.Item>
  357. </Col>
  358. <Col span={5} key={2}>
  359. <Form.Item label="当前状态" name="status">
  360. <Select
  361. placeholder="Select a person"
  362. >
  363. <Option value="">全部</Option>
  364. <Option value="1">启用</Option>
  365. <Option value="0" >禁用</Option>
  366. </Select>
  367. </Form.Item>
  368. </Col>
  369. <Col span={6} key={3}>
  370. <Form.Item>
  371. <Button type="primary" htmlType="submit">
  372. 查询
  373. </Button>
  374. <Button onClick={onReset}>
  375. 重置
  376. </Button>
  377. </Form.Item>
  378. </Col>
  379. </Row>
  380. </Form>
  381. </div>
  382. <div className="table">
  383. <div className="table-header">
  384. <h2 className="table-title">数据权限</h2>
  385. <Button type="primary" icon={<PlusOutlined />} onClick={e => showModal(1)}>新增数据权限</Button>
  386. </div>
  387. <Table
  388. columns={columns}
  389. dataSource={userList}
  390. scroll={{ y: 'calc(100vh - 320px)' }}
  391. rowKey={record => record.id + record.roleName}
  392. pagination={{
  393. current: current,
  394. pageSize: size,
  395. size: 'small',
  396. showSizeChanger: true,
  397. pageSizeOptions: ['15', '30', '60', '120'],
  398. showTotal: (total, range) => `第${range[0]}-${range[1]} 条/共 ${total} 条数据`,
  399. onShowSizeChange: (current, pageSize) => onSizeChange(current, pageSize), // 改变每页数量时更新显示
  400. onChange: (page, pageSize) => changePage(page, pageSize),//点击页码事件
  401. total: total
  402. }} />
  403. </div>
  404. <Modal
  405. title="提示"
  406. okText='确定'
  407. cancelText='取消'
  408. width={400}
  409. visible={msvisible}
  410. onOk={handleOk}
  411. onCancel={handleCancel}
  412. >
  413. <p>{tipText[modalType]}</p>
  414. </Modal>
  415. </div >
  416. )
  417. }
  418. export default DataManager;