123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. import React, { useState, useEffect, useRef } from 'react';
  2. import {
  3. Button,
  4. Popconfirm,
  5. Modal,
  6. Form,
  7. Input,
  8. message,
  9. Radio,
  10. Select,
  11. List,
  12. Row,
  13. Col,
  14. Card,
  15. Tree,
  16. Checkbox,
  17. } from 'antd';
  18. import { PlusOutlined } from '@ant-design/icons';
  19. import { getCooperativeList } from '@/services/cooperative';
  20. import {
  21. getUserList,
  22. addUser,
  23. deleteUser,
  24. updateUser,
  25. getDefaultPassword,
  26. getUserDetail,
  27. } from '@/services/user';
  28. import { getRoleList } from '@/services/role';
  29. import { getUserRoleList, addUserUserRole, deleteUserRole } from '@/services/userRole';
  30. import { PageHeaderWrapper } from '@ant-design/pro-layout';
  31. import PageTable from '@/components/PageTable';
  32. import moment from 'moment';
  33. import Search from '@/components/CooperativeSearch';
  34. import './index.less';
  35. const FormItem = Form.Item;
  36. const { Option } = Select;
  37. const formatterTime = (val) => {
  38. return val && val !== '-' ? moment(val).format('YYYY-MM-DD') : '-';
  39. };
  40. export default (props) => {
  41. //编辑弹窗
  42. const formItemLayout = { labelCol: { span: 6 }, wrapperCol: { span: 14 } };
  43. const [form] = Form.useForm();
  44. const [editModal, setEditModal] = useState(false);
  45. const [loading, setLoading] = useState(false);
  46. const [userId, setuserId] = useState();
  47. const [password, setPassWord] = useState('');
  48. const [cooperativeList, setCooperativeList] = useState([]);
  49. const [editRoleModal, setEditRoleModal] = useState(false);
  50. const [rLoading, setRLoading] = useState(false);
  51. const [rUserId, setRUserId] = useState();
  52. const [roleList, setRoleList] = useState([]);
  53. const [currentCheckbox, setCurrentCheckbox] = useState();
  54. //列表数据
  55. const actionRef = useRef();
  56. const [data, setData] = useState([]);
  57. const [orgId, setOrgId] = useState();
  58. // 动态生成树
  59. const handelNode = (item) => {
  60. let node = (
  61. <div
  62. key={item.orgId}
  63. style={{
  64. justifyContent: 'space-between',
  65. display: 'flex',
  66. padding: '8px 0',
  67. }}
  68. >
  69. <span>{item.title}</span>
  70. </div>
  71. );
  72. return node;
  73. };
  74. const onSelect = (checkedKeys, info) => {
  75. if (info.selected) {
  76. setOrgId(info.node.key);
  77. } else {
  78. setOrgId();
  79. }
  80. };
  81. // 编辑弹窗的表单提交
  82. const Submit = (values) => {
  83. const newData = { ...values };
  84. if (!newData.sex && newData.sex !== 0) {
  85. newData.sex = 1;
  86. }
  87. setLoading(true);
  88. if (!/^1[0-9]{10}$/.test(newData.phone)) {
  89. message.warning('请输入正确的十一位手机号');
  90. setLoading(false);
  91. return false;
  92. }
  93. if (
  94. !/^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/.test(
  95. newData.idCard,
  96. )
  97. ) {
  98. message.warning('请输入正确的身份证号');
  99. setLoading(false);
  100. return false;
  101. }
  102. if (userId) {
  103. updateUser(userId, newData)
  104. .then(() => {
  105. setLoading(false);
  106. message.success(`修改成功`);
  107. onCancel();
  108. actionRef.current.reload();
  109. })
  110. .catch((err) => {
  111. setLoading(false);
  112. console.log(err.message);
  113. });
  114. } else {
  115. addUser(newData)
  116. .then(() => {
  117. setLoading(false);
  118. message.success(`保存成功`);
  119. onCancel();
  120. actionRef.current.reload();
  121. })
  122. .catch((err) => {
  123. setLoading(false);
  124. message.error(err.message || err);
  125. });
  126. }
  127. };
  128. //表单点击取消按钮
  129. const onCancel = () => {
  130. setuserId();
  131. form.resetFields();
  132. setEditModal(false);
  133. };
  134. // 弹窗表单中合作社搜索框改变事件目前没用
  135. const handelChange = () => {};
  136. // 列表点击编辑按钮
  137. const handleEdit = (val) => {
  138. setuserId(val.userId);
  139. setEditModal(true);
  140. };
  141. //列表点击删除按钮
  142. const handleDelete = (id) => {
  143. deleteUser(id)
  144. .then(() => {
  145. message.success('删除成功');
  146. actionRef.current.reload();
  147. })
  148. .catch((err) => {
  149. console.log(err.message);
  150. });
  151. };
  152. //列表切换人员状态方法
  153. const handleOK = (record, data) => {
  154. const title = record.status
  155. ? '您确定要将该人员状态变更为禁用吗? 禁用后该人员将不能登录'
  156. : '您确定要将该人员状态变更为启用吗? 启用后该人员可以登录!';
  157. Modal.confirm({
  158. title: title,
  159. okText: '确认',
  160. cancelText: '取消',
  161. onOk() {
  162. updateUser(record.userId, { ...record, status: record.status === 1 ? 0 : 1 })
  163. .then((res) => {
  164. message.success('操作成功');
  165. actionRef.current.reload();
  166. })
  167. .catch((err) => {
  168. console.log(err.message);
  169. });
  170. },
  171. });
  172. };
  173. //点击授权角色方法
  174. const handleRole = (val) => {
  175. setRUserId(val.userId);
  176. getUserRoleList({ user_id: val.userId })
  177. .then((res) => {
  178. if (res.length !== 0) {
  179. setCurrentCheckbox(res.map((item) => item.roleId));
  180. }
  181. })
  182. .catch((err) => {
  183. console.log(err.message);
  184. });
  185. setEditRoleModal(true);
  186. };
  187. //授权弹窗点击取消按钮
  188. const onRoleCancel = () => {
  189. setRUserId();
  190. setCurrentCheckbox();
  191. form.resetFields();
  192. setEditRoleModal(false);
  193. };
  194. const handelOk = () => {
  195. if (!currentCheckbox) {
  196. message.info('请选择角色');
  197. return;
  198. }
  199. setRLoading(true);
  200. if (currentCheckbox.length === 0) {
  201. deleteUserRole(rUserId)
  202. .then(() => {
  203. message.success('取消授权角色成功');
  204. setRLoading(false);
  205. onRoleCancel();
  206. })
  207. .catch((err) => {
  208. console.log(err.message);
  209. setRLoading(false);
  210. });
  211. } else {
  212. addUserUserRole(
  213. rUserId,
  214. currentCheckbox.map((item) => {
  215. return { userId: rUserId, roleId: item };
  216. }),
  217. )
  218. .then(() => {
  219. message.success('授权角色成功');
  220. setRLoading(false);
  221. onRoleCancel();
  222. })
  223. .catch((err) => {
  224. console.log(err.message);
  225. setRLoading(false);
  226. });
  227. }
  228. };
  229. const handleCheckboxChange = (list) => {
  230. setCurrentCheckbox(list);
  231. };
  232. useEffect(() => {
  233. //获取账号默认密码
  234. getDefaultPassword()
  235. .then((res) => {
  236. setPassWord(res);
  237. })
  238. .catch((err) => {
  239. console.log(err.message);
  240. });
  241. //获取合作社列表数据
  242. getCooperativeList({ pageSize: 999 })
  243. .then((res) => {
  244. setCooperativeList(res.records);
  245. const list = res.records?.map((item) => {
  246. return { title: item.name, key: item.orgId };
  247. });
  248. setData(list);
  249. })
  250. .catch((err) => {
  251. console.log(err.message);
  252. });
  253. //获取角色列表数据
  254. getRoleList({ pageSize: 999 })
  255. .then((res) => {
  256. setRoleList(res.records);
  257. })
  258. .catch((err) => {
  259. console.log(err.message);
  260. });
  261. }, []);
  262. useEffect(() => {
  263. if (userId) {
  264. getUserDetail(userId)
  265. .then((res) => {
  266. if (res.orgId === '-1') {
  267. form.setFieldsValue({ ...res, orgId: cooperativeList[0].orgId });
  268. } else {
  269. form.setFieldsValue(res);
  270. }
  271. })
  272. .catch((err) => {
  273. console.log(err.message);
  274. });
  275. } else {
  276. form.resetFields();
  277. }
  278. }, [userId]);
  279. const actions = () => [
  280. <Button key="add" type="primary" icon={<PlusOutlined />} onClick={() => setEditModal(true)}>
  281. 新增
  282. </Button>,
  283. ];
  284. const columns = [
  285. {
  286. title: '姓名',
  287. dataIndex: 'userName',
  288. key: 'userName',
  289. },
  290. {
  291. title: '昵称',
  292. dataIndex: 'nickName',
  293. key: 'nickName',
  294. search: false,
  295. },
  296. {
  297. title: '性别',
  298. dataIndex: 'sex',
  299. key: 'sex',
  300. width: 80,
  301. render: (_, record) => {
  302. return record.sex === 1 ? '男' : record.sex === 0 ? '女' : '未知';
  303. },
  304. search: false,
  305. },
  306. {
  307. title: '手机号',
  308. dataIndex: 'phone',
  309. key: 'phone',
  310. width: 120,
  311. },
  312. {
  313. title: '注册时间',
  314. dataIndex: 'createDate',
  315. key: 'createDate',
  316. render: formatterTime,
  317. search: false,
  318. width: 80,
  319. },
  320. {
  321. title: '状态',
  322. dataIndex: 'status',
  323. key: 'status',
  324. width: 80,
  325. search: false,
  326. render: (_, record) => {
  327. return record.status === 1 ? '启用' : '未启用';
  328. },
  329. },
  330. {
  331. title: '管理员',
  332. dataIndex: 'isOrgManager',
  333. key: 'isOrgManager',
  334. width: 80,
  335. search: false,
  336. render: (_, record) => {
  337. return record.isOrgManager && record.isOrgManager == 1 ? '管理员' : '非管理员';
  338. },
  339. },
  340. {
  341. title: '操作',
  342. valueType: 'option',
  343. width: 160,
  344. render: (_, record) => [
  345. <Button style={{ padding: 0 }} type="link" key={1} onClick={() => handleOK(record)}>
  346. {record.status === 0 ? '启用' : '禁用'}
  347. </Button>,
  348. <Button style={{ padding: 0 }} type="link" key={2} onClick={() => handleEdit(record)}>
  349. 编辑
  350. </Button>,
  351. <Button style={{ padding: 0 }} type="link" key={3} onClick={() => handleRole(record)}>
  352. 授权角色
  353. </Button>,
  354. <Popconfirm
  355. key={4}
  356. title="您是否确认删除 ?"
  357. onConfirm={() => handleDelete(record.userId)}
  358. okText="确定"
  359. cancelText="取消"
  360. >
  361. <Button style={{ padding: 0 }} type="link">
  362. 删除
  363. </Button>
  364. </Popconfirm>,
  365. ],
  366. },
  367. ];
  368. return (
  369. <PageHeaderWrapper>
  370. <Row gutter={16}>
  371. <Col span={6}>
  372. <Card title="合作社列表">
  373. <Tree
  374. onSelect={onSelect}
  375. className="treeClass"
  376. titleRender={(data) => handelNode(data)}
  377. treeData={data}
  378. />
  379. </Card>
  380. </Col>
  381. <Col span={18}>
  382. <PageTable
  383. request={getUserList}
  384. params={{ org_id: orgId }}
  385. // expfunc={exportPersonList}
  386. columns={columns}
  387. actionRef={actionRef}
  388. rowKey="userId"
  389. options={false}
  390. toolBarRender={actions}
  391. scroll={{ x: 1000 }}
  392. />
  393. </Col>
  394. </Row>
  395. <Modal
  396. forceRender
  397. title={userId ? '人员编辑' : '人员新增'}
  398. visible={editModal}
  399. onCancel={onCancel}
  400. keyboard={false}
  401. maskClosable={false}
  402. destroyOnClose={true}
  403. footer={null}
  404. >
  405. <Form {...formItemLayout} onFinish={Submit} form={form}>
  406. <FormItem label="用户名" name="userName" rules={[{ required: true, message: '请输入' }]}>
  407. <Input placeholder="请输入" />
  408. </FormItem>
  409. <FormItem label="性别" name="sex">
  410. <Radio.Group>
  411. <Radio value={1}>男</Radio>
  412. <Radio value={0}>女</Radio>
  413. </Radio.Group>
  414. </FormItem>
  415. <FormItem label="手机号" name="phone" rules={[{ required: true, message: '请输入' }]}>
  416. <Input maxLength="11" placeholder="请输入" />
  417. </FormItem>
  418. <FormItem label="身份证" name="idCard" rules={[{ required: true, message: '请输入' }]}>
  419. <Input placeholder="请输入" />
  420. </FormItem>
  421. <FormItem
  422. label="登录账号"
  423. name="loginName"
  424. rules={[{ required: true, message: '请输入登录账号' }]}
  425. >
  426. <Input placeholder="请输入" />
  427. </FormItem>
  428. <FormItem label=" " colon={false} style={{ height: '4px', marginTop: '-28px' }}>
  429. <span style={{ opacity: '0.7' }}>默认密码{password}</span>
  430. </FormItem>
  431. <FormItem label="所属合作社" name="orgId" rules={[{ required: true, message: '请输入' }]}>
  432. <Search placeholder="请输入合作社" onChange={handelChange} />
  433. </FormItem>
  434. {userId && (
  435. <FormItem
  436. label="合作社管理员"
  437. name="isOrgManager"
  438. rules={[{ required: true, message: '请选择' }]}
  439. >
  440. <Select placeholder="请选择是否启用">
  441. <Option value={false}>否</Option>
  442. <Option value={true}>是</Option>
  443. </Select>
  444. </FormItem>
  445. )}
  446. <FormItem label="状态" name="status" rules={[{ required: true, message: '请选择' }]}>
  447. <Select placeholder="请选择是否启用">
  448. <Option value={1}>启用</Option>
  449. <Option value={0}>禁用</Option>
  450. </Select>
  451. </FormItem>
  452. <FormItem label=" " colon={false}>
  453. <Button type="default" onClick={onCancel}>
  454. 取消
  455. </Button>
  456. <Button
  457. type="primary"
  458. loading={loading}
  459. htmlType="Submit"
  460. style={{ marginLeft: '4em' }}
  461. >
  462. 确认
  463. </Button>
  464. </FormItem>
  465. </Form>
  466. </Modal>
  467. <Modal
  468. forceRender
  469. title="授权角色"
  470. visible={editRoleModal}
  471. onCancel={onRoleCancel}
  472. keyboard={false}
  473. maskClosable={false}
  474. destroyOnClose={true}
  475. onOk={handelOk}
  476. confirmLoading={rLoading}
  477. >
  478. <Checkbox.Group
  479. style={{ width: '100%' }}
  480. value={currentCheckbox}
  481. onChange={handleCheckboxChange}
  482. >
  483. <List
  484. dataSource={roleList}
  485. renderItem={(item) => (
  486. <List.Item>
  487. <Checkbox value={item.roleId}>{item.name}</Checkbox>
  488. </List.Item>
  489. )}
  490. />
  491. </Checkbox.Group>
  492. </Modal>
  493. </PageHeaderWrapper>
  494. );
  495. };