edit.tsx 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. import React, { useEffect, useState } from 'react';
  2. import {
  3. Cascader,
  4. Checkbox,
  5. Col,
  6. Form,
  7. Input,
  8. InputNumber,
  9. message,
  10. Modal,
  11. Row,
  12. Select,
  13. } from 'antd';
  14. import { createUser, editUser, queryTreeList, queryUserList } from '@/services/setting';
  15. import md5 from 'js-md5';
  16. import { queryRoleList } from '@/services/role';
  17. interface userEditPros {
  18. visible: boolean;
  19. editCallback: () => void;
  20. detailData: any;
  21. }
  22. /**
  23. * 用户管理编辑
  24. * @param props
  25. * @constructor
  26. */
  27. const Edit: React.FC<userEditPros> = (props) => {
  28. const { visible, editCallback, detailData } = props;
  29. const [form] = Form.useForm();
  30. const [roleList, setRoleList] = useState([]);
  31. const [areaList, setAreaList] = useState([]);
  32. const [dealerList, setDealerList] = useState([]);
  33. const [roleCode, setRoleCode]: any = useState([]);
  34. useEffect(() => {
  35. if (detailData) {
  36. // 编辑时,根据角色判断是否显示配额和所属经销商
  37. const arr: any[] = [];
  38. detailData.user_role.forEach((el: any) => {
  39. arr.push(el.role_code);
  40. });
  41. setRoleCode(arr);
  42. }
  43. // 经销商列表
  44. queryUserList({ q: 'list', code_str: '21' }).then((res) => {
  45. if (res && res.code === 0) {
  46. setDealerList(res.data || []);
  47. }
  48. });
  49. // 角色列表
  50. queryRoleList({ q: 'list' }).then((res) => {
  51. if (res.code === 0) {
  52. setRoleList(res.data.list);
  53. }
  54. });
  55. // 地区列表
  56. queryTreeList({ q: 'tree', level: '3' }).then((res) => {
  57. if (res && res.code === 0) {
  58. setAreaList(res.data.list || []);
  59. }
  60. });
  61. }, []);
  62. // 角色选择
  63. const onRoleChange = (e: any, code: string) => {
  64. const {
  65. target: { checked },
  66. } = e;
  67. let arr: any = [...roleCode];
  68. if (checked) {
  69. if (!roleCode.includes(code)) {
  70. arr.push(code);
  71. }
  72. } else {
  73. arr = arr.filter((item: any) => item !== code);
  74. }
  75. setRoleCode(arr);
  76. };
  77. /**
  78. * 确定
  79. */
  80. const onOk = () => {
  81. form.validateFields().then((values) => {
  82. if (values) {
  83. const data = { ...values };
  84. if (values?.password) {
  85. data.password = md5(values.password);
  86. }
  87. if (values?.role_id) {
  88. const user_role: { role_id: any }[] = [];
  89. values?.role_id.forEach((el: any) => {
  90. user_role.push({ role_id: el });
  91. });
  92. data.user_role = user_role;
  93. delete data.role_id;
  94. }
  95. if (values.districts) {
  96. const arr: any[] = [];
  97. values.districts.forEach((el: any) => {
  98. arr.push({
  99. province_id: el[0],
  100. district_id: el[1],
  101. });
  102. });
  103. data.districts = arr;
  104. }
  105. if (values?.parent_id) {
  106. data.parent_id = values?.parent_id;
  107. }
  108. if (detailData) {
  109. data.record_id = detailData.record_id;
  110. // 编辑
  111. editUser(data)
  112. .then((res) => {
  113. if (res.code === 0) {
  114. message.success('编辑成功');
  115. editCallback();
  116. } else {
  117. message.error(res?.message);
  118. editCallback();
  119. }
  120. })
  121. .catch((e) => {
  122. message.error(e?.message);
  123. editCallback();
  124. });
  125. } else {
  126. // 新增
  127. createUser(data)
  128. .then((res) => {
  129. if (res.code === 0) {
  130. message.success('保存成功');
  131. editCallback();
  132. } else {
  133. message.error(res?.message);
  134. editCallback();
  135. }
  136. })
  137. .catch((e) => {
  138. message.error(e?.message);
  139. editCallback();
  140. });
  141. }
  142. }
  143. });
  144. };
  145. /**
  146. * 取消
  147. */
  148. const onCancel = () => {
  149. editCallback();
  150. };
  151. const formItemLayout = {
  152. labelCol: {
  153. span: 6,
  154. },
  155. wrapperCol: {
  156. span: 16,
  157. },
  158. };
  159. const formItemLayoutTwo = {
  160. labelCol: {
  161. span: 3,
  162. },
  163. wrapperCol: {
  164. span: 21,
  165. },
  166. };
  167. return (
  168. <Modal
  169. title={`${detailData ? '编辑' : '新增'}`}
  170. open={visible}
  171. onOk={onOk}
  172. onCancel={onCancel}
  173. width={800}
  174. >
  175. <Form form={form}>
  176. <Row>
  177. <Col span={12}>
  178. <Form.Item
  179. {...formItemLayout}
  180. name="user_name"
  181. label="用户姓名"
  182. rules={[{ required: true, message: '请输入用户姓名' }]}
  183. initialValue={detailData?.user_name || ''}
  184. >
  185. <Input placeholder="请输入用户姓名" />
  186. </Form.Item>
  187. </Col>
  188. <Col span={12}>
  189. <Form.Item {...formItemLayout} name="password" label="密码">
  190. <Input type="password" placeholder="请输入密码" />
  191. </Form.Item>
  192. </Col>
  193. <Col span={12}>
  194. <Form.Item
  195. {...formItemLayout}
  196. name="phone"
  197. label="手机号"
  198. rules={[
  199. { required: true, message: '请输入手机号' },
  200. {
  201. pattern:
  202. /^1((34[0-8])|(8\d{2})|(([35][0-35-9]|4[579]|66|7[35678]|9[1389])\d{1}))\d{7}$/,
  203. message: '请输入正确的手机号',
  204. },
  205. ]}
  206. initialValue={detailData?.phone || ''}
  207. >
  208. <Input placeholder="请输入手机号" />
  209. </Form.Item>
  210. </Col>
  211. <Col span={12}>
  212. <Form.Item
  213. {...formItemLayout}
  214. name="company"
  215. label="公司名称"
  216. initialValue={detailData?.company || ''}
  217. >
  218. <Input placeholder="请输入公司名称" />
  219. </Form.Item>
  220. </Col>
  221. <Col span={24}>
  222. <Form.Item
  223. {...formItemLayoutTwo}
  224. name="role_id"
  225. label="角色名称"
  226. rules={[{ required: true, message: '请选择角色名称' }]}
  227. initialValue={
  228. detailData && detailData?.user_role && detailData?.user_role.length
  229. ? detailData?.user_role?.map((item: any) => item.role_id)
  230. : []
  231. }
  232. >
  233. <Checkbox.Group>
  234. {roleList && roleList.length
  235. ? roleList.map((res: any) => {
  236. return (
  237. <Checkbox
  238. key={res.record_id}
  239. value={res.record_id}
  240. onChange={(e) => onRoleChange(e, res.code)}
  241. >
  242. {res.name}
  243. </Checkbox>
  244. );
  245. })
  246. : null}
  247. </Checkbox.Group>
  248. </Form.Item>
  249. </Col>
  250. {roleCode.includes('21') || roleCode.includes('22') ? (
  251. <Col span={12}>
  252. <Form.Item
  253. {...formItemLayout}
  254. name="quota"
  255. label="配额"
  256. initialValue={detailData?.quota || ''}
  257. rules={[{ required: true, message: '请输入配额' }]}
  258. >
  259. <InputNumber min={0} placeholder="请输入配额" style={{ width: '100%' }} />
  260. </Form.Item>
  261. </Col>
  262. ) : null}
  263. <Col span={12}>
  264. <Form.Item
  265. {...formItemLayout}
  266. name="districts"
  267. label="地区"
  268. rules={[{ required: true, message: '请选择地区' }]}
  269. initialValue={
  270. detailData?.districts.map((item: any) => [item.province_id, item.district_id]) || []
  271. }
  272. >
  273. <Cascader
  274. style={{ width: '100%' }}
  275. options={areaList}
  276. multiple
  277. placeholder="请选择地区"
  278. maxTagCount="responsive"
  279. fieldNames={{ label: 'name', value: 'record_id', children: 'children' }}
  280. />
  281. </Form.Item>
  282. </Col>
  283. {roleCode.includes('22') ? (
  284. <Col span={12}>
  285. <Form.Item
  286. {...formItemLayout}
  287. name="parent_id"
  288. label="所属经销商"
  289. initialValue={detailData?.parent_id || undefined}
  290. rules={[{ required: true, message: '请选择所属经销商' }]}
  291. >
  292. <Select placeholder="请选择所属经销商">
  293. {dealerList && dealerList.length
  294. ? dealerList.map((res: any) => {
  295. return (
  296. <Select.Option key={res.record_id} value={res.record_id}>
  297. {res.user_name}
  298. </Select.Option>
  299. );
  300. })
  301. : null}
  302. </Select>
  303. </Form.Item>
  304. </Col>
  305. ) : null}
  306. </Row>
  307. </Form>
  308. </Modal>
  309. );
  310. };
  311. export default Edit;