index.tsx 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. import { useModel, useRequest } from '@umijs/max'
  2. import { Delete, DataLock } from '@icon-park/react'
  3. import ProForm, { ProFormCheckbox, ProFormDependency, ProFormSwitch } from '@ant-design/pro-form'
  4. import type { FormInstance } from 'antd'
  5. import { message, Table, Tabs, Radio, Space, Popconfirm } from 'antd'
  6. import React, { useRef, useMemo, useState, useEffect } from 'react'
  7. import styles from '@/pages/Role/index.less'
  8. import classNames from 'classnames'
  9. import {
  10. fetchRoleStaffListByRoleId,
  11. updateRolePermission,
  12. getRolePermissions,
  13. updatePermDataByRoleId,
  14. deleteStaff
  15. } from '@/services/user/api'
  16. import type { ColumnsType } from 'antd/lib/table'
  17. import { formatPermission } from '@/utils/utils'
  18. import RoleMenu from '../System/components/RoleMenu'
  19. import ConnectModal from '../System/components/ConnectModal'
  20. import FormItem from 'antd/lib/form/FormItem'
  21. import { permData } from '../Customer'
  22. import { PageContainer } from '@ant-design/pro-layout'
  23. const Product = () => {
  24. const { TabPane } = Tabs
  25. const formRef = useRef<FormInstance>(null)
  26. const formRef2 = useRef<FormInstance>(null)
  27. const { initialState } = useModel('@@initialState')
  28. const menuId = useMemo(() => {
  29. return initialState?.menuList?.find(item => item.name === '产品')?.id
  30. }, initialState.menuList)
  31. const [state, setState] = useState({
  32. id: '',
  33. roleStaff: [],
  34. rolePermission: {},
  35. dataPermission: {},
  36. activeKey: ''
  37. })
  38. const onSelect = (id: string) => {
  39. setState({ ...state, id })
  40. }
  41. const { run: tryGetRoleStaffList } = useRequest((id: string) => fetchRoleStaffListByRoleId({ id }), {
  42. manual: true,
  43. onSuccess: result => {
  44. setState({ ...state, roleStaff: result })
  45. }
  46. })
  47. const { run: tryGetRolePermissions } = useRequest((id: string) => getRolePermissions({ id }), {
  48. manual: true,
  49. onSuccess: (result: API.GetRolePermissionResultModel) => {
  50. const values = {
  51. building: [],
  52. curing: [],
  53. highway: [],
  54. gs: [],
  55. personal: [],
  56. enterprise: [],
  57. ...formatPermission('init', result.permission)
  58. }
  59. // 特殊处理云版switch
  60. // if (values.showBuilding || values.showCuring || values.showHighway || values.showGs) {
  61. // values.showCloud = true
  62. // delete values.showBuilding
  63. // delete values.showCuring
  64. // delete values.showHighway
  65. // delete values.showGs
  66. // }
  67. // 特殊处理大司空2.0
  68. // if (values.showPersonal || values.showEnterprise) {
  69. // values.showRoad = true
  70. // delete values.showPersonal
  71. // delete values.showEnterprise
  72. // }
  73. setState({
  74. ...state,
  75. rolePermission: values,
  76. dataPermission: result.dataPermission ? JSON.parse(result.dataPermission) : null
  77. })
  78. formRef.current?.setFieldsValue({ ...values })
  79. formRef2.current?.setFieldsValue(result.dataPermission ? JSON.parse(result.dataPermission) : null)
  80. }
  81. })
  82. const { run: tryDeleteStaff } = useRequest(
  83. (params: API.DeleteStaff) => {
  84. return deleteStaff(params)
  85. },
  86. {
  87. manual: true,
  88. onSuccess: () => {
  89. message.success('移除员工成功')
  90. tryGetRoleStaffList(state.id)
  91. }
  92. }
  93. )
  94. useEffect(() => {
  95. if (state.id) {
  96. tryGetRoleStaffList(state.id)
  97. tryGetRolePermissions(state.id)
  98. }
  99. if (state.activeKey === '2') {
  100. formRef.current?.setFieldsValue({ ...state.rolePermission })
  101. }
  102. if (state.activeKey === '3') {
  103. formRef2.current?.setFieldsValue({ ...state.dataPermission })
  104. }
  105. }, [state.id, state.activeKey])
  106. const columns: ColumnsType<API.RoleStaffListItem> = [
  107. {
  108. title: '用户',
  109. dataIndex: 'username',
  110. width: '15%'
  111. },
  112. {
  113. title: '手机',
  114. dataIndex: 'phone',
  115. width: '20%'
  116. },
  117. {
  118. title: '部门',
  119. dataIndex: 'departmentName',
  120. width: '20%'
  121. },
  122. {
  123. title: '岗位',
  124. dataIndex: 'position',
  125. width: '15%'
  126. },
  127. {
  128. title: '角色',
  129. dataIndex: 'age',
  130. width: '20%'
  131. },
  132. {
  133. title: '操作',
  134. dataIndex: 'opreate',
  135. width: '20%',
  136. render: (_, record) => (
  137. <Popconfirm
  138. title="确认删除吗?"
  139. okText="确认"
  140. cancelText="取消"
  141. onConfirm={() => tryDeleteStaff({ id: state.id, staffId: record.staffId })}>
  142. <div className="pl-2 text-hex-fd3995 cursor-pointer hover:text-hex-e7026e">
  143. <Delete />
  144. </div>
  145. </Popconfirm>
  146. )
  147. }
  148. ]
  149. return (
  150. <PageContainer title={false} breadcrumb={false}>
  151. <div className="h-full w-full flex flex-row">
  152. <RoleMenu menuId={menuId} onSelect={onSelect} itemCount={state.roleStaff?.length || 0} />
  153. <div className={classNames('w-max-3/4 w-3/4', styles.formItemWrap)}>
  154. <div className="ml-8 bg-white p-4 shadow-md relative">
  155. <div className="absolute right-4 top-4 z-100">
  156. {state.id && (
  157. <ConnectModal
  158. title="关联员工"
  159. dataId={state.id}
  160. postUrl="/role/staff/add"
  161. closeAfterSelect={false}
  162. onReload={() => tryGetRoleStaffList(state.id)}
  163. />
  164. )}
  165. </div>
  166. <Tabs defaultActiveKey="1" type="card" onChange={key => setState({ ...state, activeKey: key })}>
  167. <TabPane tab="员工列表" key="1">
  168. <Table<API.RoleStaffListItem>
  169. dataSource={state.roleStaff}
  170. columns={columns}
  171. rowKey={row => row.staffId}
  172. />
  173. </TabPane>
  174. <TabPane tab="角色权限" key="2">
  175. <div className="ml-4">
  176. {state.id && (
  177. <ProForm
  178. formRef={formRef}
  179. layout="horizontal"
  180. onFinish={async values => {
  181. const newValues = formatPermission('submit', values)
  182. await updateRolePermission({
  183. permission: JSON.stringify(newValues),
  184. id: state.id
  185. })
  186. message.success('设置成功')
  187. }}>
  188. <ProFormSwitch
  189. fieldProps={{
  190. onChange(checked) {
  191. if (!checked) {
  192. formRef.current?.setFieldsValue({ lockstore: [] })
  193. }
  194. }
  195. }}
  196. name="showLockstore"
  197. label={
  198. <span className="flex items-center">
  199. <DataLock theme="outline" className="flex items-baseline mr-1" />
  200. 软件锁-公共锁库
  201. </span>
  202. }
  203. />
  204. <ProFormDependency name={['showLockstore']}>
  205. {({ showLockstore }) => (
  206. <ProFormCheckbox.Group
  207. wrapperCol={{ offset: 1 }}
  208. name="lockstore"
  209. options={[
  210. { value: 'access', label: '查看', disabled: !showLockstore },
  211. {
  212. value: 'delete_record',
  213. label: '删除记录',
  214. disabled: !showLockstore
  215. }
  216. ]}
  217. />
  218. )}
  219. </ProFormDependency>
  220. <div className="text-lg font-bold">云版管理</div>
  221. <div className="ml-6">
  222. <ProFormSwitch
  223. fieldProps={{
  224. onChange(checked) {
  225. if (!checked) {
  226. formRef.current?.setFieldsValue({
  227. building: []
  228. })
  229. }
  230. }
  231. }}
  232. name="showBuilding"
  233. label={<span className="flex items-center">大司空云计价</span>}
  234. />
  235. <div>
  236. <ProFormDependency name={['showBuilding']}>
  237. {({ showBuilding }) => (
  238. <ProFormCheckbox.Group
  239. wrapperCol={{ offset: 1 }}
  240. name="building"
  241. options={[{ value: 'access', label: '查看', disabled: !showBuilding }]}
  242. />
  243. )}
  244. </ProFormDependency>
  245. </div>
  246. <ProFormSwitch
  247. fieldProps={{
  248. onChange(checked) {
  249. if (!checked) {
  250. formRef.current?.setFieldsValue({
  251. curing: []
  252. })
  253. }
  254. }
  255. }}
  256. name="showCuring"
  257. label={<span className="flex items-center">养护云造价</span>}
  258. />
  259. <div>
  260. <ProFormDependency name={['showCuring']}>
  261. {({ showCuring }) => (
  262. <ProFormCheckbox.Group
  263. wrapperCol={{ offset: 1 }}
  264. name="curing"
  265. options={[{ value: 'access', label: '查看', disabled: !showCuring }]}
  266. />
  267. )}
  268. </ProFormDependency>
  269. </div>
  270. <ProFormSwitch
  271. fieldProps={{
  272. onChange(checked) {
  273. if (!checked) {
  274. formRef.current?.setFieldsValue({
  275. highway: []
  276. })
  277. }
  278. }
  279. }}
  280. name="showHighway"
  281. label={<span className="flex items-center">公路云计价</span>}
  282. />
  283. <div>
  284. <ProFormDependency name={['showHighway']}>
  285. {({ showHighway }) => (
  286. <ProFormCheckbox.Group
  287. wrapperCol={{ offset: 1 }}
  288. name="highway"
  289. options={[{ value: 'access', label: '查看', disabled: !showHighway }]}
  290. />
  291. )}
  292. </ProFormDependency>
  293. </div>
  294. <ProFormSwitch
  295. fieldProps={{
  296. onChange(checked) {
  297. if (!checked) {
  298. formRef.current?.setFieldsValue({
  299. gs: []
  300. })
  301. }
  302. }
  303. }}
  304. name="showGs"
  305. label={<span className="flex items-center">大司空概算</span>}
  306. />
  307. <div>
  308. <ProFormDependency name={['showGs']}>
  309. {({ showGs }) => (
  310. <>
  311. <ProFormCheckbox.Group
  312. wrapperCol={{ offset: 1 }}
  313. name="gs"
  314. options={[{ value: 'access', label: '查看', disabled: !showGs }]}
  315. />
  316. </>
  317. )}
  318. </ProFormDependency>
  319. </div>
  320. </div>
  321. <div className="text-lg font-bold">大司空2.0</div>
  322. <div className="ml-6">
  323. <ProFormSwitch
  324. fieldProps={{
  325. onChange(checked) {
  326. if (!checked) {
  327. formRef.current?.setFieldsValue({ personal: [] })
  328. }
  329. }
  330. }}
  331. name="showPersonal"
  332. label={<span className="flex items-center">个人版</span>}
  333. />
  334. <div>
  335. <ProFormDependency name={['showPersonal']}>
  336. {({ showPersonal }) => (
  337. <ProFormCheckbox.Group
  338. wrapperCol={{ offset: 1 }}
  339. name="personal"
  340. options={[{ value: 'access', label: '查看', disabled: !showPersonal }]}
  341. />
  342. )}
  343. </ProFormDependency>
  344. </div>
  345. <ProFormSwitch
  346. fieldProps={{
  347. onChange(checked) {
  348. if (!checked) {
  349. formRef.current?.setFieldsValue({ enterprise: [] })
  350. }
  351. }
  352. }}
  353. name="showEnterprise"
  354. label={<span className="flex items-center">企业版</span>}
  355. />
  356. <div>
  357. <ProFormDependency name={['showEnterprise']}>
  358. {({ showEnterprise }) => (
  359. <>
  360. <ProFormCheckbox.Group
  361. wrapperCol={{ offset: 1 }}
  362. name="enterprise"
  363. options={[
  364. { value: 'access', label: '查看', disabled: !showEnterprise },
  365. { value: 'add', label: '添加企业', disabled: !showEnterprise }
  366. ]}
  367. />
  368. </>
  369. )}
  370. </ProFormDependency>
  371. </div>
  372. </div>
  373. </ProForm>
  374. )}
  375. </div>
  376. </TabPane>
  377. <TabPane tab="数据权限" key="3">
  378. {state.id && (
  379. <ProForm
  380. formRef={formRef2}
  381. layout="vertical"
  382. onFinish={async values => {
  383. try {
  384. await updatePermDataByRoleId({
  385. id: state.id,
  386. dataPermission: JSON.stringify(values)
  387. })
  388. } catch (error) {
  389. return message.error(error.toString())
  390. }
  391. message.success('设置成功')
  392. return true
  393. }}>
  394. <FormItem name="access" label="客户模块可见" required>
  395. <Radio.Group>
  396. <Space direction="vertical">
  397. {permData.map(item => (
  398. <Radio key={item.value} value={item.value}>
  399. {item.label}
  400. </Radio>
  401. ))}
  402. </Space>
  403. </Radio.Group>
  404. </FormItem>
  405. </ProForm>
  406. )}
  407. </TabPane>
  408. </Tabs>
  409. </div>
  410. </div>
  411. </div>
  412. </PageContainer>
  413. )
  414. }
  415. export default Product