AddData.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  1. import { useEffect, useState, useContext } from 'react';
  2. import { Form, Input, Button, Steps, Tabs, Space, Switch, Breadcrumb, Radio, TreeSelect, Tree, Tag, Card, message } from 'antd';
  3. import './index.less';
  4. import DataContext from './data-context';
  5. import MenuTree from './MenuTree';
  6. import { useSelector } from 'react-redux'
  7. import apiObj from '@api/index';
  8. import utils from '@utils/index'
  9. import backIcon from "@images/back.png";
  10. import DoctorList from "./doctorList"
  11. import Item from 'antd/lib/list/Item';
  12. const { post, api, xPost } = apiObj;
  13. const { SHOW_PARENT } = TreeSelect;
  14. const { organizationData } = utils;
  15. const { Step } = Steps;
  16. const { TabPane } = Tabs;
  17. function AddData(props) {
  18. useEffect(() => {
  19. getCreateRoles()
  20. getHospitalTree()
  21. getOrgList()
  22. if (type == 3) {
  23. setValue(val)
  24. }
  25. }, []);
  26. const { back, } = props;
  27. const [form] = Form.useForm();
  28. const [value, setValue] = useState([]);
  29. const [key, setKey] = useState();
  30. const [index, setIndex] = useState('0');
  31. const [treeRloe, setTreeRloe] = useState([]);
  32. const [tags, setTags] = useState([[]]);
  33. const [treeData, setTreeData] = useState([]);
  34. const [selectedKeys, setSelectedKeys] = useState([]);
  35. const [orgList, setOrgList] = useState([]);
  36. const [selectedRowKeys, setSelectedRowKeys] = useState([]);
  37. const [autoExpandParent, setAutoExpandParent] = useState(true);
  38. const { save, formData, type, val, tag } = useContext(DataContext);
  39. const staticInfo = useSelector(state => {
  40. return state.staticInfo;
  41. });
  42. const { dataList } = staticInfo;
  43. const initialValues = formData
  44. const validateMessages = {
  45. required: '${label}不能为空',
  46. };
  47. //获取当前用于所属角色
  48. function getCreateRoles() {
  49. const params = {
  50. softwareId: ''
  51. }
  52. xPost(api.getCreateRoles, params).then((res) => {
  53. if (res.data.code === 200) {
  54. const data = res.data.data;
  55. let arr = JSON.parse(JSON.stringify(data).replaceAll(/name/g, 'title').replaceAll(/id/g, 'value'))
  56. setTreeRloe(arr)
  57. }
  58. })
  59. }
  60. //获取当前用户组织
  61. function getHospitalTree() {
  62. post(api.getHospitalTree).then((res) => {
  63. if (res.data.code === 200) {
  64. const data = res.data.data
  65. let arr = structureTreeData(data)
  66. setTreeData(arr)
  67. }
  68. })
  69. }
  70. //数据转换为树形结构所需字段
  71. function structureTreeData(arr) {
  72. arr.forEach(item => {
  73. item.key = item.hospitalId + '-' + item.hospitalName
  74. item.title = item.hospitalName
  75. if (!item.children && item.depts) {
  76. item.depts.forEach(it => {
  77. it.key = item.hospitalId + '-' + it.deptId + '-' + it.deptName
  78. })
  79. item.children = JSON.parse(JSON.stringify(item.depts).replaceAll(/deptName/g, 'title').replaceAll(/deptId/g, 'key'))
  80. return
  81. }
  82. if (item.children) {
  83. structureTreeData(item.children)
  84. }
  85. })
  86. return arr
  87. // let list = []
  88. // arr.forEach(it => {
  89. // it.key = it.hospitalId
  90. // it.title = it.hospitalName
  91. // list.push({
  92. // children: it.depts,
  93. // title: it.hospitalName,
  94. // key: it.parentId + '-' + it.hospitalId + '-' + it.hospitalName
  95. // })
  96. // it.depts.forEach(its => {
  97. // its.key = it.parentId + '-' + it.hospitalId + '-' + its.deptId + '-' + its.deptName
  98. // })
  99. // })
  100. // arr = JSON.parse(JSON.stringify(list).replaceAll(/deptName/g, 'title').replaceAll(/deptId/g, 'key'))
  101. // return arr
  102. }
  103. //获取组织列表
  104. function getOrgList() {
  105. xPost(api.getUserHospitals).then((res) => {
  106. if (res.data.code === 200) {
  107. const data = res.data.data;
  108. const { software } = data;
  109. setOrgList(software);
  110. setKey(software[0].id)
  111. if (type == 3) {
  112. setTags(tag)
  113. } else {
  114. software.forEach((it, index) => {
  115. tags[index] = []
  116. setTags([...tags])
  117. })
  118. }
  119. } else {
  120. message.warning(res.data.msg || '获取医院列表失败');
  121. }
  122. }).catch(() => {
  123. message.error("接口出错");
  124. });
  125. }
  126. const onChange = (e, i) => {
  127. let val = value
  128. const formData = form.getFieldsValue();
  129. let arr = formData.softwareVOS;
  130. arr[index].id = key
  131. arr[index].softwareMenuIds = []
  132. arr[index].dataAuthDetails = []
  133. arr[index].selectedRowKeys = []
  134. if (e.target.value != 7) {
  135. arr[index].dataAuthDetails = [{
  136. dataType: e.target.value
  137. }]
  138. }
  139. tags[index] = []
  140. val[i] = e.target.value
  141. selectedRowKeys[index] = []
  142. form.setFieldsValue({
  143. softwareVOS: arr
  144. });
  145. setTags([...tags])
  146. setValue([...val])
  147. setSelectedRowKeys([...selectedRowKeys])
  148. };
  149. // 删除选择标签
  150. function delTag(type, id, i) {
  151. const formData = form.getFieldsValue();
  152. if (type == 3) {
  153. formData.softwareVOS[index].selectedRowKeys.forEach((item, inx) => {
  154. if (item.split('-')[0] == id) {
  155. formData.softwareVOS[index].selectedRowKeys.splice(inx)
  156. }
  157. })
  158. } else if (type == 1) {
  159. formData.softwareVOS[index].softwareMenuIds.forEach((item, inx) => {
  160. if (item.split('-')[0] == id) {
  161. formData.softwareVOS[index].softwareMenuIds.splice(inx)
  162. }
  163. })
  164. } else if (type == 2) {
  165. formData.softwareVOS[index].softwareMenuIds.forEach((item, inx) => {
  166. if (item.split('-')[1] == id) {
  167. formData.softwareVOS[index].softwareMenuIds.splice(inx)
  168. }
  169. })
  170. }
  171. form.setFieldsValue({
  172. softwareVOS: formData.softwareVOS
  173. });
  174. tags[index].splice(i)
  175. setTags([...tags])
  176. console.log(form.getFieldsValue())
  177. }
  178. function callback(key) {
  179. setKey(key.split('-')[0])
  180. setIndex(key.split('-')[1])
  181. }
  182. function treeChange(value) {
  183. const formData = form.getFieldsValue();
  184. let arr = formData.softwareVOS;
  185. arr[index].roles = value
  186. form.setFieldsValue({
  187. softwareVOS: arr
  188. });
  189. console.log(form.getFieldsValue())
  190. }
  191. // 去重
  192. function unique(arr) {
  193. let result = {};
  194. let finalResult = [];
  195. for (let i = 0; i < arr.length; i++) {
  196. result[arr[i].detailId] = arr[i];
  197. }
  198. for (let item in result) {
  199. finalResult.push(result[item]);
  200. }
  201. return finalResult;
  202. }
  203. //医生选中
  204. function checkDoctEvent(selectedRowKeys) {
  205. const formData = form.getFieldsValue();
  206. let arr = formData.softwareVOS[index].dataAuthDetails ? formData.softwareVOS[index].dataAuthDetails : []
  207. selectedRowKeys.forEach(it => {
  208. arr.push({
  209. dataType: 7,
  210. detailId: it.split('-')[0],
  211. detailType: 3
  212. })
  213. });
  214. formData.softwareVOS[index].dataAuthDetails = unique(arr)
  215. formData.softwareVOS[index].selectedRowKeys = selectedRowKeys
  216. form.setFieldsValue({
  217. softwareVOS: formData.softwareVOS
  218. });
  219. getTags()
  220. console.log(form.getFieldsValue())
  221. }
  222. //树形结构选中事件
  223. function checkTreeEvent(idsArr) {
  224. const formData = form.getFieldsValue();
  225. let arr = formData.softwareVOS[index].dataAuthDetails ? formData.softwareVOS[index].dataAuthDetails : []
  226. let result = idsArr.find(ele => ele.split('-').length == 2)
  227. if (result) {
  228. arr.push({
  229. dataType: 7,
  230. detailId: result.split('-')[0],
  231. detailType: 1
  232. })
  233. } else {
  234. idsArr.forEach(it => {
  235. console.log(it)
  236. arr.push({
  237. dataType: 7,
  238. detailId: it.split('-')[1],
  239. detailType: 2
  240. })
  241. })
  242. }
  243. formData.softwareVOS[index].dataAuthDetails = unique(arr)
  244. formData.softwareVOS[index].softwareMenuIds = idsArr
  245. form.setFieldsValue({
  246. softwareVOS: formData.softwareVOS
  247. });
  248. getTags()
  249. }
  250. //获取已选中标签
  251. function getTags() {
  252. const formData = form.getFieldsValue();
  253. let tag = []
  254. let softwareMenuIds = formData.softwareVOS[index].softwareMenuIds
  255. let selectedRowKeys = formData.softwareVOS[index].selectedRowKeys
  256. selectedRowKeys && selectedRowKeys.forEach(it => {
  257. tag.push({
  258. id: it.split('-')[0],
  259. name: it.split('-')[1],
  260. type: 3
  261. })
  262. });
  263. if (softwareMenuIds) {
  264. let result = softwareMenuIds.find(ele => ele.split('-').length == 2)
  265. if (result) {
  266. tag.push({
  267. id: result.split('-')[0],
  268. name: result.split('-')[1],
  269. type: 1
  270. })
  271. } else {
  272. softwareMenuIds.forEach(it => {
  273. tag.push({
  274. id: it.split('-')[1],
  275. name: it.split('-')[2],
  276. type: 2
  277. })
  278. })
  279. }
  280. }
  281. tags[index] = tag
  282. setTags([...tags])
  283. }
  284. const onFinish = value => {
  285. save(form.getFieldsValue())
  286. };
  287. function swichChange(val) {
  288. form.setFieldsValue({ status: val ? 1 : 0 })
  289. }
  290. return (
  291. <>
  292. <Breadcrumb separator="">
  293. <Breadcrumb.Item><img className='back-icon' src={backIcon} onClick={back} alt="返回上一页" /></Breadcrumb.Item>
  294. <Breadcrumb.Item>数据权限</Breadcrumb.Item>
  295. <Breadcrumb.Separator />
  296. <Breadcrumb.Item>{type == 3 ? '修改' : '新增'}数据权限</Breadcrumb.Item>
  297. </Breadcrumb>
  298. <div className='form-center'>
  299. <Form labelCol={{ span: 4 }} wrapperCol={{ span: 18 }} form={form} name="nest-messages" onFinish={onFinish} initialValues={initialValues} validateMessages={validateMessages}>
  300. <Form.Item name="name" label="数据权限名称" rules={[{ required: true }]}>
  301. <Input placeholder="请填写数据权限名称" />
  302. </Form.Item>
  303. <Form.Item label="权限范围" rules={[{ required: true }]} >
  304. <Tabs type="card" onChange={callback}>
  305. {
  306. orgList.map((it, i) => {
  307. return (
  308. <TabPane tab={it.name} key={it.id + "-" + i} forceRender={type == 3 ? true : false}>
  309. <Form.Item
  310. key={i}
  311. name={['softwareVOS', i, 'datatype']} noStyle>
  312. <Radio.Group onChange={e => { onChange(e, i) }} className="radio">
  313. <Space direction="vertical">
  314. {dataList.map((Item) => {
  315. return (
  316. <Radio key={i} value={Item.name}>{Item.val}</Radio>
  317. )
  318. })
  319. }
  320. </Space>
  321. </Radio.Group>
  322. </Form.Item>
  323. <Form.Item key={i + "a"} hidden={true} name={['softwareVOS', i, 'id']} noStyle>
  324. <Input />
  325. </Form.Item>
  326. <Form.Item key={i + "b"} hidden={true} name={['softwareVOS', i, 'dataAuthDetails']} noStyle>
  327. <Input />
  328. </Form.Item>
  329. <Form.Item key={i + "c"} style={{ display: value[index] == 7 && it.id == key ? 'block' : 'none' }}>
  330. <Card title="已选中" extra={<a href="#">More</a>} >
  331. {tags[index].map((tag, i) => {
  332. return (
  333. <Tag key={i} closable onClose={e => delTag(tag.type, tag.id, i)}>{tag.name}</Tag>
  334. );
  335. })}
  336. </Card>
  337. </Form.Item>
  338. <Form.Item key={i + "d"} style={{ display: value[index] == 7 && it.id == key ? 'block' : 'none' }}>
  339. <Tabs defaultActiveKey="0">
  340. <TabPane tab="可看医生" key="0">
  341. <Form.Item
  342. key={i}
  343. name={['softwareVOS', i, 'selectedRowKeys']}
  344. >
  345. <DoctorList checkeds={form.getFieldValue().softwareVOS ? form.getFieldValue().softwareVOS[i] : []} checkDoct={(selectedRowKeys) => checkDoctEvent(selectedRowKeys)} />
  346. </Form.Item>
  347. </TabPane>
  348. <TabPane tab="可看科室" key="1">
  349. <Form.Item
  350. key={i}
  351. name={['softwareVOS', i, 'softwareMenuIds']}
  352. >
  353. <MenuTree data={treeData} checkeds={form.getFieldValue().softwareVOS ? form.getFieldValue().softwareVOS[i] : []} checkEv={(checkedKeys) => checkTreeEvent(checkedKeys)} />
  354. </Form.Item>
  355. </TabPane>
  356. </Tabs>
  357. </Form.Item>
  358. </TabPane>
  359. )
  360. })
  361. }
  362. </Tabs>
  363. </Form.Item>
  364. <Form.Item label="所属角色" required >
  365. {
  366. orgList.map((it, i) => {
  367. return (
  368. <Form.Item
  369. key={i}
  370. >
  371. {index == i ?
  372. <Form.Item key={i + "b"}
  373. name={['softwareVOS', i, 'roles']} rules={[
  374. {
  375. required: true,
  376. message: '请选择所属角色',
  377. },
  378. ]}>
  379. <TreeSelect
  380. showSearch={false}
  381. treeData={treeRloe}
  382. onChange={treeChange}
  383. maxTagCount={1}
  384. treeCheckable
  385. showCheckedStrategy={SHOW_PARENT}
  386. placeholder="请选择角色"
  387. style={{ width: '100%' }}
  388. />
  389. </Form.Item>
  390. : null}
  391. </Form.Item>
  392. )
  393. })
  394. }
  395. </Form.Item>
  396. <Form.Item
  397. name="status"
  398. valuePropName="checked"
  399. label="当前状态"
  400. rules={[{ required: true, message: '请选择状态' }]}
  401. >
  402. <Switch onChange={swichChange} />
  403. </Form.Item>
  404. <Form.Item wrapperCol={{ span: 20, offset: 8 }}>
  405. <Button type="primary" htmlType="submit">
  406. Submit
  407. </Button>
  408. </Form.Item>
  409. </Form>
  410. </div>
  411. </>
  412. )
  413. }
  414. export default AddData;