modal.tsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. /*
  2. * @Author: your name
  3. * @Date: 2022-01-12 17:11:11
  4. * @LastEditTime: 2022-07-08 18:00:41
  5. * @LastEditors: code4eat awesomedema@gmail.com
  6. * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  7. * @FilePath: /KC-MiddlePlatform/src/pages/platform/setting/userManage/modal.tsx
  8. */
  9. import React, { useEffect, useState } from 'react';
  10. import KCModal from '@/components/KCModal';
  11. import KCProSelect from '@/components/KCProSelect';
  12. import { message, Button, Spin, Upload } from 'antd';
  13. import { userManageModelState, Dispatch } from 'umi';
  14. import { ProFormDateTimePicker, ProFormSelect, ProFormText, ProFormTextArea } from '@ant-design/pro-form';
  15. import { getShareHospList } from '@/service/hospList';
  16. import { AddUsersDataType, getUserRelaSeletData, UserRelaSeletDataListType, UserRelaSeletDataType } from '@/service/user';
  17. import { LoadingOutlined, UploadOutlined } from '@ant-design/icons';
  18. // import { TableActType } from "./typings";
  19. import './style.less';
  20. export enum TableActType {
  21. NOACT,
  22. ADD,
  23. DEL,
  24. EDIT,
  25. }
  26. interface ActModalProps extends userManageModelState {
  27. dispatch: Dispatch | undefined;
  28. }
  29. const antIcon = <LoadingOutlined style={{ fontSize: 24 }} spin />;
  30. const ActModal: React.FC<ActModalProps> = ({
  31. dispatch,
  32. isShowModal,
  33. tableAct,
  34. currentEditUser,
  35. }) => {
  36. const [avatarUrl, setAvatarUrl] = useState<string>('');
  37. const [loadAvatar, setLoadAvatar] = useState(false);
  38. //字典
  39. const [dirData, set_dirData] = useState<UserRelaSeletDataType[]>([]);
  40. // let dirData: UserRelaSeletDataType[] = []
  41. const props = {
  42. name: 'file',
  43. maxCount: 1,
  44. showUploadList: false,
  45. onChange(info: { file: { originFileObj: File, status: string; name: any; }; fileList: any; }) {
  46. setLoadAvatar(true);
  47. if (info.file.status !== 'uploading') {
  48. // console.log(info.file, info.fileList);
  49. const reader = new FileReader();
  50. reader.readAsDataURL(info.file.originFileObj);//读取图像文件 result 为 DataURL, DataURL 可直接 赋值给 img.src
  51. reader.onload = function (event) {
  52. if (event.target && typeof event.target.result == 'string') {
  53. setAvatarUrl(event.target.result);//base64
  54. }
  55. }
  56. }
  57. if (info.file.status === 'done') {
  58. setLoadAvatar(false);
  59. } else if (info.file.status === 'error') {
  60. message.error(`${info.file.name} 上传失败!`);
  61. }
  62. },
  63. }
  64. const onVisibleChangeHandle = (bool: boolean) => {
  65. // console.log({bool});
  66. if (!bool) {
  67. dispatch &&
  68. dispatch({
  69. type: 'userManageModel/cancelTableAct',
  70. });
  71. }
  72. };
  73. const onFinishHandle = (data: any & AddUsersDataType) => {
  74. if (tableAct == TableActType.ADD) {
  75. dispatch &&
  76. dispatch({
  77. type: 'userManageModel/postAddUserData',
  78. payload: data,
  79. });
  80. }
  81. if (tableAct == TableActType.EDIT) {
  82. dispatch &&
  83. dispatch({
  84. type: 'userManageModel/postEditUserData',
  85. payload: data,
  86. });
  87. }
  88. return true;
  89. };
  90. const getDirecData = async (key?: string) => {
  91. const data = await getUserRelaSeletData(key);
  92. if (data) {
  93. set_dirData(data);
  94. }
  95. }
  96. const setSelectorData = (key: string) => {
  97. let result = dirData.filter((t: any) => (t.code == key));
  98. if (result.length > 0) {
  99. let dataArr = result[0].dataVoList;
  100. let defaultValue = dataArr.filter(t=>t.defaultValue == 1);
  101. dataArr.sort((prev:UserRelaSeletDataListType,next:UserRelaSeletDataListType)=>{
  102. return next.sort - prev.sort;
  103. });
  104. // console.log({dataArr,defaultValue});
  105. return {
  106. defaultvalue:defaultValue[0]?defaultValue[0].value:'',
  107. list:dataArr.map(t=>({label:t.code,value:t.value}))
  108. }
  109. }
  110. return {
  111. defaultvalue:'',
  112. list:[]
  113. };
  114. }
  115. useEffect(() => {
  116. getDirecData();
  117. }, [])
  118. return (
  119. <KCModal
  120. visible={isShowModal}
  121. onVisibleChange={onVisibleChangeHandle}
  122. layout="horizontal"
  123. className='ProfileModal'
  124. initialValues={
  125. tableAct == TableActType.EDIT ? { ...currentEditUser } : {
  126. //设置当新增时的默认值
  127. major:(setSelectorData('PROFESSIONAL_TYPE')).defaultvalue,
  128. jobTitle:(setSelectorData('POSITION_TYPE')).defaultvalue,
  129. doctorLevel:(setSelectorData('PHYSICIAN_TYPE')).defaultvalue,
  130. practiceSubject:setSelectorData('PROCESSIONAL_SUBJECTS_TYPE').defaultvalue,
  131. title:setSelectorData('TITLE_TYPE').defaultvalue,
  132. practiceCate:setSelectorData('JOB_TYPE').defaultvalue,
  133. practiceStatus:setSelectorData('PROFESSIONAL_STATUS_TYPE').defaultvalue
  134. }
  135. }
  136. title={tableAct == TableActType.EDIT ? '编辑用户' : '新增用户'}
  137. labelCol={{ span: 5 }}
  138. wrapperCol={{ span: 18 }}
  139. onFinish={async (data) => onFinishHandle(data)}
  140. >
  141. {
  142. dirData ? (
  143. <div>
  144. <div className='wraper'>
  145. <div className='left'>
  146. <div className='avatarContainer'>
  147. <span>个人照片:</span>
  148. <div className='avatar'>
  149. {avatarUrl && <img src={avatarUrl} alt="avatar" />}
  150. {loadAvatar && <Spin className='spin' indicator={antIcon} />}
  151. </div>
  152. <Upload {...props} className='UploadBtn'>
  153. <Button icon={<UploadOutlined />}>上传照片(100*130)</Button>
  154. </Upload>
  155. </div>
  156. <div className='formItem'>
  157. <KCProSelect
  158. label="院区"
  159. width="md"
  160. name="hospId"
  161. request={async () => {
  162. const hospList = await getShareHospList();
  163. if (hospList) {
  164. return hospList.map((t) => ({
  165. label: t.name,
  166. value: t.id,
  167. }));
  168. }
  169. return [];
  170. }}
  171. rules={[
  172. {
  173. required: true,
  174. message: '请选择院区!',
  175. },
  176. ]}
  177. />
  178. </div>
  179. <div className='formItem'>
  180. <ProFormSelect
  181. name="major"
  182. label="所学专业:"
  183. options={(setSelectorData('PROFESSIONAL_TYPE')).list}
  184. placeholder="请选择"
  185. rules={[{ required: true, message: '请选择专业!' }]}
  186. />
  187. </div>
  188. <div className='formItem'>
  189. <ProFormSelect
  190. name="jobTitle"
  191. label="职务:"
  192. options={setSelectorData('POSITION_TYPE').list}
  193. placeholder="请选择"
  194. rules={[{ required: true, message: '请选择职务!' }]}
  195. />
  196. </div>
  197. <div className='formItem'>
  198. <ProFormText name="idCardNum" label="身份证号:" placeholder="请输入" />
  199. </div>
  200. <div className='formItem'>
  201. <ProFormText name="phoneNum" label="手机号:" placeholder="请输入" />
  202. </div>
  203. <div className='formItem'>
  204. <ProFormText name="qualificationCertificateNo" label="资格证号:" placeholder="请输入" />
  205. </div>
  206. <div className='formItem'>
  207. <ProFormSelect
  208. name="doctorLevel"
  209. label="医师级别:"
  210. options={setSelectorData('PHYSICIAN_TYPE').list}
  211. placeholder="请选择"
  212. />
  213. </div>
  214. <div className='formItem'>
  215. <ProFormSelect
  216. name="practiceSubject"
  217. label="执业科目:"
  218. options={setSelectorData('PROCESSIONAL_SUBJECTS_TYPE').list}
  219. placeholder="请选择"
  220. />
  221. </div>
  222. </div>
  223. <div className='right'>
  224. <div className='formItem'>
  225. <ProFormText name="name" label="姓名:" placeholder="请输入" rules={[{ required: true, message: '请输入姓名!' }]} />
  226. </div>
  227. <div className='formItem'>
  228. <ProFormText name="account" label="工号:" placeholder="请输入" rules={[{ required: true, message: '请输入工号!' }]} />
  229. </div>
  230. <div className='formItem'>
  231. <ProFormSelect
  232. name="gender"
  233. label="性别:"
  234. request={async () => [
  235. { label: '男', value: '男' },
  236. { label: '女', value: '女' },
  237. ]}
  238. placeholder="请选择"
  239. rules={[{ required: true, message: '请选择性别!' }]}
  240. />
  241. </div>
  242. <div className='formItem'>
  243. <ProFormText name="text" label="科室:" placeholder="请输入" rules={[{ required: true, message: '请输入工号!' }]} />
  244. </div>
  245. <div className='formItem'>
  246. <ProFormSelect
  247. name="title"
  248. label="职称:"
  249. options={setSelectorData('TITLE_TYPE').list}
  250. placeholder="请选择"
  251. rules={[{ required: true, message: '请选择职称!' }]}
  252. />
  253. </div>
  254. <div className='formItem'>
  255. <ProFormDateTimePicker name="entryTime" label="入职时间" placeholder={'请选择日期'} />
  256. </div>
  257. <div className='formItem'>
  258. <ProFormText name="practiceCertificateNo" label="执业证号:" placeholder="请输入" />
  259. </div>
  260. <div className='formItem'>
  261. <ProFormSelect
  262. name="practiceCate"
  263. label="执业类别:"
  264. options={setSelectorData('JOB_TYPE').list}
  265. placeholder="请选择"
  266. />
  267. </div>
  268. <div className='formItem'>
  269. <ProFormSelect
  270. name="practiceStatus"
  271. label="执业状态:"
  272. options={setSelectorData('PROFESSIONAL_STATUS_TYPE').list}
  273. placeholder="请选择"
  274. />
  275. </div>
  276. </div>
  277. </div>
  278. <div style={{display:'flex',flexDirection:'row',width:'100%'}}>
  279. <div style={{paddingLeft:36}}>备注:</div>
  280. <ProFormTextArea
  281. name="remark"
  282. width='xl'
  283. placeholder="请输入备注"
  284. />
  285. </div>
  286. </div>
  287. ) : ''
  288. }
  289. </KCModal>
  290. );
  291. };
  292. export default ActModal;