AddSubOrg.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. import {useEffect,useState,useContext} from 'react';
  2. import { Form, Input, Checkbox, Button, Select,Steps,Tabs ,InputNumber,Space,Switch,Breadcrumb } from 'antd';
  3. import MenuTree from './MenuTree';
  4. import './index.less';
  5. import OrgContext from './org-context';
  6. import apiObj from '@api/index';
  7. import backIcon from "@images/back.png";
  8. const {post,api,xPost} = apiObj;
  9. const { Step } = Steps;
  10. const { TabPane } = Tabs;
  11. const { Option } = Select;
  12. function AddSubOrg(props){
  13. const [current, setCurrent] = useState(0);
  14. const { back } = props;
  15. const steps = [
  16. {
  17. title: '基础信息',
  18. content: 'First-content',
  19. },
  20. {
  21. title: '设置管理员',
  22. content: 'Second-content',
  23. },
  24. {
  25. title: '分配权限',
  26. content: 'Last-content',
  27. },
  28. ];
  29. const next = () => {
  30. setCurrent(current + 1);
  31. };
  32. const pre = () => {
  33. setCurrent(current - 1);
  34. };
  35. return (
  36. <>
  37. <Breadcrumb separator="">
  38. <Breadcrumb.Item><img className='back-icon' src={backIcon} onClick={back} alt="返回上一页"/></Breadcrumb.Item>
  39. <Breadcrumb.Item>组织管理</Breadcrumb.Item>
  40. <Breadcrumb.Separator />
  41. <Breadcrumb.Item>新增子组织</Breadcrumb.Item>
  42. </Breadcrumb>
  43. <div className="add-container">
  44. <Steps current={current}>
  45. {steps.map(item => (
  46. <Step key={item.title} title={item.title} />
  47. ))}
  48. </Steps>
  49. <div className="steps-content">
  50. <StepContent current={current}
  51. pre={pre}
  52. next={next}
  53. />
  54. </div>
  55. </div>
  56. </>
  57. )
  58. }
  59. function StepContent(props){
  60. const [form] = Form.useForm();
  61. const [treeDatas, setTreeDatas] = useState([]);
  62. const [tabDatas, setTabDatas] = useState([]);
  63. const [activeTab, setActiveTab] = useState('');
  64. const [sysCheckeds, setSysCheckeds] = useState([]);
  65. const {orgId,orgName,typeList,save} = useContext(OrgContext);
  66. const {current,pre,next} = props;
  67. const initialValues={
  68. parentId:orgId,
  69. parentName:orgName,
  70. status:1
  71. };
  72. const vilidateRules = {
  73. required: '${label}不能为空!',
  74. types: {
  75. email: '${label} is not a valid email!',
  76. number: '${label} is not a valid number!',
  77. },
  78. };
  79. //获取菜单数据
  80. function getTreeData(){
  81. xPost(api.getUserMenuResourceTree,{type:0}).then((res)=>{
  82. if(res.data.code===200){
  83. const data = res.data.data;
  84. const treeDatas = structureTreeData(data);
  85. setTreeDatas(treeDatas);
  86. setTabDatas([treeDatas[0]]);
  87. setActiveTab(treeDatas[0].key);
  88. }
  89. })
  90. }
  91. //数据转换为树形结构所需字段
  92. function structureTreeData(data){
  93. const arr = [];
  94. let obj={};
  95. data.map((it,i)=>{
  96. obj =JSON.stringify(it.children).replace(/softwareMenuId/g,"key").replace(/menuName/g,'title');
  97. arr[i]={
  98. title:it.softwareName,
  99. key:it.softwareId,
  100. children:JSON.parse(obj)
  101. }
  102. });
  103. setSysCheckeds(arr[0]?[arr[0].key]:[]);
  104. //form.setFieldsValue({softwares:[{id:arr[0]?[arr[0].key]:''}]}); //默认选中第一个
  105. return arr;
  106. }
  107. useEffect(()=>{
  108. getTreeData();
  109. },[]);
  110. function handlePre(){
  111. pre();
  112. }
  113. function handleNext(){
  114. const validateKeys = {
  115. 0:['parentId','name','code',['addHospitalUserVO','name'],['addHospitalUserVO','mobilePhone'],'type','orderNo'],
  116. 1:[['addHospitalUserVO','username'],['addHospitalUserVO','password'],'confirmPsd'],
  117. };
  118. form.validateFields(validateKeys[current]).then((res)=>{
  119. //console.log(res,form)
  120. next(form);
  121. });
  122. }
  123. function handleSave(){
  124. form.validateFields([['softwares',0,'id'],['softwares',0,'softwareMenuIds'],['softwares',0,'softwareResourceIds']]).then((res)=>{
  125. save(form.getFieldsValue())
  126. });
  127. }
  128. //树形结构选中事件
  129. function checkTreeEvent(i,idsArr,sourceIds){
  130. console.log(32,i,idsArr,sourceIds,activeTab)
  131. const formData=form.getFieldsValue();
  132. const arr=formData.softwares;
  133. arr[i]={
  134. id:activeTab,
  135. softwareMenuIds:idsArr,
  136. softwareResourceIds:sourceIds
  137. };
  138. form.setFieldsValue({
  139. softwares:arr
  140. });
  141. }
  142. function onTabChange(activeTab){
  143. setActiveTab(activeTab)
  144. }
  145. //状态开关
  146. function switchStatus(checked){
  147. form.setFieldsValue({
  148. status:checked?1:0
  149. });
  150. }
  151. //开放系统勾选事件
  152. function softwareChange(checkedValue){
  153. let arr = [],item;
  154. setSysCheckeds(checkedValue);
  155. for(let i=0;i<checkedValue.length;i++){
  156. item=treeDatas.find((it)=>it.key===checkedValue[i]);
  157. if(item){
  158. arr.push(item);
  159. }
  160. }
  161. setTabDatas(arr);
  162. }
  163. return (
  164. <>
  165. <Form
  166. labelCol={{ span: 6 }}
  167. wrapperCol={{ span: 16 }}
  168. layout="horizontal"
  169. validateMessages={vilidateRules}
  170. initialValues={initialValues}
  171. form={form}
  172. >
  173. <Form.Item
  174. label="上级组织ID"
  175. hidden={true}
  176. name='parentId'>
  177. <Input placeholder='请输入上级组织ID'/>
  178. </Form.Item>
  179. <Form.Item
  180. label="上级组织"
  181. name='parentName'
  182. hidden={current!==0}
  183. rules={[{ required: true}]}>
  184. <Input disabled/>
  185. </Form.Item>
  186. <Form.Item
  187. label="组织名称"
  188. name='name'
  189. hidden={current!==0}
  190. rules={[{ required: true},({ getFieldValue }) => ({
  191. validator(_, value) {
  192. if (value.length<51) {
  193. return Promise.resolve();
  194. }
  195. return Promise.reject(new Error('格式错误!'));
  196. },
  197. }),]}>
  198. <Input placeholder='请输入组织名称'/>
  199. </Form.Item>
  200. <Form.Item
  201. label="组织编码"
  202. hidden={current!==0}
  203. name='code'>
  204. <Input placeholder='请输入组织编码' />
  205. </Form.Item>
  206. <Form.Item
  207. label="联系人"
  208. hidden={current!==0}
  209. name={['addHospitalUserVO','name']}>
  210. <Input placeholder='请输入联系人'/>
  211. </Form.Item>
  212. <Form.Item
  213. label="手机号码"
  214. hidden={current!==0}
  215. name={['addHospitalUserVO','mobilePhone']}>
  216. <Input placeholder='请输入手机号码'/>
  217. </Form.Item>
  218. <Form.Item
  219. label="类型"
  220. name='type'
  221. hidden={current!==0}
  222. rules={[{ required: true }]}>
  223. <Select placeholder='请选择类型'>
  224. {typeList.map((item,i)=>{
  225. return (
  226. <Option value={item.name} key={i}>{item.val}</Option>
  227. )
  228. })}
  229. </Select>
  230. </Form.Item>
  231. <Form.Item
  232. label="排序"
  233. hidden={current!==0}
  234. name='orderNo'>
  235. <InputNumber placeholder='大于0的整数' min={0}/>
  236. </Form.Item>
  237. <Form.Item
  238. label="用户名"
  239. hidden={current!==1}
  240. name={['addHospitalUserVO','username']}
  241. rules={[{ required: true}]}>
  242. <Input placeholder='请输入用户名'/>
  243. </Form.Item>
  244. <Form.Item
  245. label="初始密码"
  246. type="password"
  247. hidden={current!==1}
  248. name={['addHospitalUserVO','password']}
  249. rules={[{ required: true}]}>
  250. <Input placeholder='请输入初始密码'/>
  251. </Form.Item>
  252. <Form.Item
  253. label="确认密码"
  254. type="password"
  255. name='confirmPsd'
  256. dependencies={['addHospitalUserVO','password']}
  257. hidden={current!==1}
  258. rules={[{ required: true},({ getFieldValue }) => ({
  259. validator(_, value) {
  260. if (!value || getFieldValue(['addHospitalUserVO','password']) === value) {
  261. return Promise.resolve();
  262. }
  263. return Promise.reject(new Error('两次密码输入不一致!'));
  264. },
  265. }),]}>
  266. <Input placeholder='请输入确认密码'/>
  267. </Form.Item>
  268. <Form.Item
  269. label="开放系统"
  270. type="password"
  271. hidden={current!==2}
  272. rules={[{ required: true}]}>
  273. <Checkbox.Group value={sysCheckeds} onChange={softwareChange}>
  274. {
  275. treeDatas.map((it, i) => {
  276. return (
  277. <Form.Item key={it.key} noStyle>
  278. <Checkbox key={i} value={it.key}>{it.title}</Checkbox>
  279. </Form.Item>
  280. )
  281. })
  282. }
  283. </Checkbox.Group>
  284. </Form.Item>
  285. <Form.Item
  286. label="菜单权限"
  287. hidden={current!==2}
  288. required>
  289. <Tabs onChange={onTabChange} type="card">
  290. {
  291. tabDatas.map((it,i)=>{
  292. console.log(0,it,i,tabDatas)
  293. return (
  294. <TabPane tab={it.title} key={i}>
  295. <Form.Item key={i} name={['softwares', i, 'softwareMenuIds']} noStyle>
  296. <MenuTree data={it} checkEv={(checkedKeys,sourceIds)=>checkTreeEvent(i,checkedKeys,sourceIds)}/>
  297. </Form.Item>
  298. <Form.Item key={i+"a"} hidden={true} name={['softwares', i, 'id']} noStyle>
  299. <Input/>
  300. </Form.Item>
  301. <Form.Item key={i+"b"} hidden={true} name={['softwares', i, 'softwareResourceIds']} noStyle>
  302. <Input/>
  303. </Form.Item>
  304. </TabPane>
  305. )
  306. })
  307. }
  308. </Tabs>
  309. </Form.Item>
  310. <Form.Item
  311. label="当前状态"
  312. hidden={current!==2}>
  313. <Space>
  314. <Form.Item
  315. name='status'
  316. noStyle>
  317. <Switch checked={form.status} onChange={switchStatus} />
  318. </Form.Item>
  319. <span>启用</span>
  320. </Space>
  321. </Form.Item>
  322. </Form>
  323. <div className="button-box">
  324. {current!==0?<Button onClick={handlePre}>上一步</Button>:null}
  325. {current!==2?<Button onClick={handleNext} type='primary'>下一步</Button>:null}
  326. {current===2?<Button onClick={handleSave} type='primary'>保存</Button>:null}
  327. </div>
  328. </>
  329. )
  330. }
  331. export default AddSubOrg;