123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433 |
- import { useEffect, useState, useContext } from 'react';
- import { Form, Input, Button, Steps, Tabs, Space, Switch, Breadcrumb, Radio, TreeSelect, Tree, Tag, Card, message } from 'antd';
- import './index.less';
- import DataContext from './data-context';
- import MenuTree from './MenuTree';
- import { useSelector } from 'react-redux'
- import apiObj from '@api/index';
- import utils from '@utils/index'
- import backIcon from "@images/back.png";
- import DoctorList from "./doctorList"
- import Item from 'antd/lib/list/Item';
- const { post, api, xPost } = apiObj;
- const { SHOW_PARENT } = TreeSelect;
- const { organizationData } = utils;
- const { Step } = Steps;
- const { TabPane } = Tabs;
- function AddData(props) {
- useEffect(() => {
- getCreateRoles()
- getHospitalTree()
- getOrgList()
- if (type == 3) {
- setValue(val)
- setTags(tag)
- } else {
- orgList.forEach((it, index) => {
- tags[index] = []
- setTags([...tags])
- })
- }
- }, []);
- const { back, } = props;
- const [form] = Form.useForm();
- const [value, setValue] = useState([]);
- const [key, setKey] = useState();
- const [index, setIndex] = useState('0');
- const [treeRloe, setTreeRloe] = useState([]);
- const [tags, setTags] = useState([[]]);
- const [treeData, setTreeData] = useState([]);
- const [selectedKeys, setSelectedKeys] = useState([]);
- const [orgList, setOrgList] = useState([]);
- const [selectedRowKeys, setSelectedRowKeys] = useState([]);
- const [autoExpandParent, setAutoExpandParent] = useState(true);
- const { save, formData, type, val, tag } = useContext(DataContext);
- const staticInfo = useSelector(state => {
- return state.staticInfo;
- });
- const { dataList } = staticInfo;
- const initialValues = formData
- const validateMessages = {
- required: '${label}不能为空',
- };
-
- //获取当前用于所属角色
- function getCreateRoles() {
- const params = {
- softwareId: ''
- }
- xPost(api.getCreateRoles, params).then((res) => {
- if (res.data.code === 200) {
- const data = res.data.data;
- let arr = JSON.parse(JSON.stringify(data).replaceAll(/name/g, 'title').replaceAll(/id/g, 'value'))
- setTreeRloe(arr)
- }
- })
- }
- //获取当前用户组织
- function getHospitalTree() {
- post(api.getHospitalTree).then((res) => {
- if (res.data.code === 200) {
- const data = res.data.data
- let arr = structureTreeData(data)
- setTreeData(arr)
- }
- })
- }
- //数据转换为树形结构所需字段
- function structureTreeData(arr) {
- arr.forEach(item => {
- item.key = item.hospitalId + '-' + item.hospitalName
- item.title = item.hospitalName
- if (!item.children && item.depts) {
- item.depts.forEach(it => {
- it.key = item.hospitalId + '-' + it.deptId + '-' + it.deptName
- })
- item.children = JSON.parse(JSON.stringify(item.depts).replaceAll(/deptName/g, 'title').replaceAll(/deptId/g, 'key'))
- return
- }
- if (item.children) {
- structureTreeData(item.children)
- }
- })
- return arr
- // let list = []
- // arr.forEach(it => {
- // it.key = it.hospitalId
- // it.title = it.hospitalName
- // list.push({
- // children: it.depts,
- // title: it.hospitalName,
- // key: it.parentId + '-' + it.hospitalId + '-' + it.hospitalName
- // })
- // it.depts.forEach(its => {
- // its.key = it.parentId + '-' + it.hospitalId + '-' + its.deptId + '-' + its.deptName
- // })
- // })
- // arr = JSON.parse(JSON.stringify(list).replaceAll(/deptName/g, 'title').replaceAll(/deptId/g, 'key'))
- // return arr
- }
- //获取组织列表
- function getOrgList() {
- xPost(api.getUserHospitals).then((res) => {
- if (res.data.code === 200) {
- const data = res.data.data;
- const { software } = data;
- setOrgList(software);
- setKey(software[0].id)
- } else {
- message.warning(res.data.msg || '获取医院列表失败');
- }
- }).catch(() => {
- message.error("接口出错");
- });
- }
- const onChange = (e, i) => {
- let val = value
- const formData = form.getFieldsValue();
- let arr = formData.softwareVOS;
- arr[index].id = key
- arr[index].softwareMenuIds = []
- arr[index].dataAuthDetails = []
- arr[index].selectedRowKeys = []
- if (e.target.value != 7) {
- arr[index].dataAuthDetails = [{
- dataType: e.target.value
- }]
- }
- tags[index] = []
- val[i] = e.target.value
- selectedRowKeys[index] = []
- form.setFieldsValue({
- softwareVOS: arr
- });
- setTags([...tags])
- setValue([...val])
- setSelectedRowKeys([...selectedRowKeys])
- };
- // 删除选择标签
- function delTag(type, id, i) {
- const formData = form.getFieldsValue();
- if (type == 3) {
- formData.softwareVOS[index].selectedRowKeys.forEach((item, inx) => {
- if (item.split('-')[0] == id) {
- formData.softwareVOS[index].selectedRowKeys.splice(inx)
- }
- })
- } else if (type == 1) {
- formData.softwareVOS[index].softwareMenuIds.forEach((item, inx) => {
- if (item.split('-')[0] == id) {
- formData.softwareVOS[index].softwareMenuIds.splice(inx)
- }
- })
- } else if (type == 2) {
- formData.softwareVOS[index].softwareMenuIds.forEach((item, inx) => {
- if (item.split('-')[1] == id) {
- formData.softwareVOS[index].softwareMenuIds.splice(inx)
- }
- })
- }
- form.setFieldsValue({
- softwareVOS: formData.softwareVOS
- });
- tags[index].splice(i)
- setTags([...tags])
- console.log(form.getFieldsValue())
- }
- function callback(key) {
- setKey(key.split('-')[0])
- setIndex(key.split('-')[1])
- }
- function treeChange(value) {
- const formData = form.getFieldsValue();
- let arr = formData.softwareVOS;
- arr[index].roles = value
- form.setFieldsValue({
- softwareVOS: arr
- });
- console.log(form.getFieldsValue())
- }
- // 去重
- function unique(arr) {
- let result = {};
- let finalResult = [];
- for (let i = 0; i < arr.length; i++) {
- result[arr[i].detailId] = arr[i];
- }
- for (let item in result) {
- finalResult.push(result[item]);
- }
- return finalResult;
- }
- //医生选中
- function checkDoctEvent(selectedRowKeys) {
- const formData = form.getFieldsValue();
- let arr = formData.softwareVOS[index].dataAuthDetails ? formData.softwareVOS[index].dataAuthDetails : []
- selectedRowKeys.forEach(it => {
- arr.push({
- dataType: 7,
- detailId: it.split('-')[0],
- detailType: 3
- })
- });
- formData.softwareVOS[index].dataAuthDetails = unique(arr)
- formData.softwareVOS[index].selectedRowKeys = selectedRowKeys
- form.setFieldsValue({
- softwareVOS: formData.softwareVOS
- });
- getTags()
- console.log(form.getFieldsValue())
- }
- //树形结构选中事件
- function checkTreeEvent(idsArr) {
- const formData = form.getFieldsValue();
- let arr = formData.softwareVOS[index].dataAuthDetails ? formData.softwareVOS[index].dataAuthDetails : []
- let result = idsArr.find(ele => ele.split('-').length == 2)
- if (result) {
- arr.push({
- dataType: 7,
- detailId: result.split('-')[0],
- detailType: 1
- })
- } else {
- idsArr.forEach(it => {
- console.log(it)
- arr.push({
- dataType: 7,
- detailId: it.split('-')[1],
- detailType: 2
- })
- })
- }
- formData.softwareVOS[index].dataAuthDetails = unique(arr)
- formData.softwareVOS[index].softwareMenuIds = idsArr
- form.setFieldsValue({
- softwareVOS: formData.softwareVOS
- });
- getTags()
- }
- //获取已选中标签
- function getTags() {
- const formData = form.getFieldsValue();
- let tag = []
- let softwareMenuIds = formData.softwareVOS[index].softwareMenuIds
- let selectedRowKeys = formData.softwareVOS[index].selectedRowKeys
- selectedRowKeys && selectedRowKeys.forEach(it => {
- tag.push({
- id: it.split('-')[0],
- name: it.split('-')[1],
- type: 3
- })
- });
- if (softwareMenuIds) {
- let result = softwareMenuIds.find(ele => ele.split('-').length == 2)
- if (result) {
- tag.push({
- id: result.split('-')[0],
- name: result.split('-')[1],
- type: 1
- })
- } else {
- softwareMenuIds.forEach(it => {
- tag.push({
- id: it.split('-')[1],
- name: it.split('-')[2],
- type: 2
- })
- })
- }
- }
- tags[index] = tag
- setTags([...tags])
- }
- const onFinish = value => {
- save(form.getFieldsValue())
- };
- function swichChange(val) {
- form.setFieldsValue({ status: val ? 1 : 0 })
- }
- return (
- <>
- <Breadcrumb separator="">
- <Breadcrumb.Item><img className='back-icon' src={backIcon} onClick={back} alt="返回上一页" /></Breadcrumb.Item>
- <Breadcrumb.Item>数据权限</Breadcrumb.Item>
- <Breadcrumb.Separator />
- <Breadcrumb.Item>{type == 3 ? '修改' : '新增'}数据权限</Breadcrumb.Item>
- </Breadcrumb>
- <div className='form-center'>
- <Form labelCol={{ span: 4 }} wrapperCol={{ span: 18 }} form={form} name="nest-messages" onFinish={onFinish} initialValues={initialValues} validateMessages={validateMessages}>
- <Form.Item name="name" label="数据权限名称" rules={[{ required: true }]}>
- <Input placeholder="请填写数据权限名称" />
- </Form.Item>
- <Form.Item label="权限范围" rules={[{ required: true }]} >
- <Tabs type="card" onChange={callback}>
- {
- orgList.map((it, i) => {
- return (
- <TabPane tab={it.name} key={it.id + "-" + i}>
- <Form.Item
- key={i}
- name={['softwareVOS', i, 'datatype']} noStyle>
- <Radio.Group onChange={e => { onChange(e, i) }} className="radio">
- <Space direction="vertical">
- {dataList.map((Item) => {
- return (
- <Radio key={i} value={Item.name}>{Item.val}</Radio>
- )
- })
- }
- </Space>
- </Radio.Group>
- </Form.Item>
- <Form.Item key={i + "a"} hidden={true} name={['softwareVOS', i, 'id']} noStyle>
- <Input />
- </Form.Item>
- <Form.Item key={i + "b"} hidden={true} name={['softwareVOS', i, 'dataAuthDetails']} noStyle>
- <Input />
- </Form.Item>
- <Form.Item key={i + "c"} style={{ display: value[index] == 7 && it.id == key ? 'block' : 'none' }}>
- <Card title="已选中" extra={<a href="#">More</a>} >
- {tags[index].map((tag, i) => {
- return (
- <Tag key={i} closable onClose={e => delTag(tag.type, tag.id, i)}>{tag.name}</Tag>
- );
- })}
- </Card>
- </Form.Item>
- <Form.Item key={i + "d"} style={{ display: value[index] == 7 && it.id == key ? 'block' : 'none' }}>
- <Tabs defaultActiveKey="0">
- <TabPane tab="可看医生" key="0">
- <Form.Item
- key={i}
- name={['softwareVOS', i, 'selectedRowKeys']}
- >
- <DoctorList checkeds={form.getFieldValue().softwareVOS ? form.getFieldValue().softwareVOS[i] : []} checkDoct={(selectedRowKeys) => checkDoctEvent(selectedRowKeys)} />
- </Form.Item>
- </TabPane>
- <TabPane tab="可看科室" key="1">
- <Form.Item
- key={i}
- name={['softwareVOS', i, 'softwareMenuIds']}
- >
- <MenuTree data={treeData} checkeds={form.getFieldValue().softwareVOS ? form.getFieldValue().softwareVOS[i] : []} checkEv={(checkedKeys) => checkTreeEvent(checkedKeys)} />
- </Form.Item>
- </TabPane>
- </Tabs>
- </Form.Item>
- </TabPane>
- )
- })
- }
- </Tabs>
- </Form.Item>
- <Form.Item label="所属角色" required >
- {
- orgList.map((it, i) => {
- return (
- <Form.Item
- style={{ display: i == index ? 'block' : 'none' }}
- key={i}
- >
- <Form.Item style={{ display: i == index ? 'block' : 'none' }} key={i + "b"} hidden={true}
- name={['softwareVOS', i, 'roles']} rules={[
- {
- required: true,
- message: '请选择所属角色',
- },
- ]}>
- <TreeSelect
- showSearch={false}
- treeData={treeRloe}
- onChange={treeChange}
- maxTagCount={1}
- treeCheckable
- showCheckedStrategy={SHOW_PARENT}
- placeholder="请选择角色"
- style={{ width: '100%' }}
- />
- </Form.Item>
- <Form.Item key={i + "a"} hidden={true} name={['softwareVOS', i, 'datatype']} noStyle>
- <Input />
- </Form.Item>
- <Form.Item key={i + "c"} hidden={true} name={['softwareVOS', i, 'id']} noStyle>
- <Input />
- </Form.Item>
- <Form.Item key={i + "d"} hidden={true} name={['softwareVOS', i, 'dataAuthDetails']} noStyle>
- <Input />
- </Form.Item>
- <Form.Item key={i + "e"} hidden={true} name={['softwareVOS', i, 'selectedRowKeys']} noStyle>
- <Input />
- </Form.Item>
- <Form.Item key={i + "f"} hidden={true} name={['softwareVOS', i, 'softwareMenuIds']} noStyle>
- <Input />
- </Form.Item>
- </Form.Item>
- )
- })
- }
- </Form.Item>
- <Form.Item
- name="status"
- valuePropName="checked"
- label="当前状态"
- rules={[{ required: true, message: '请选择状态' }]}
- >
- <Switch onChange={swichChange} />
- </Form.Item>
- <Form.Item wrapperCol={{ span: 20, offset: 8 }}>
- <Button type="primary" htmlType="submit">
- Submit
- </Button>
- </Form.Item>
- </Form>
- </div>
- </>
- )
- }
- export default AddData;
|