useScripts.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import MemberItem from '../components/MemberItem'
  2. import consts from '@/utils/consts'
  3. import { useState } from 'react'
  4. import { useRequest } from 'ahooks'
  5. import { addExecutor, delExecutor, queryExecutorList, updateExecutor } from '@/services/api/business'
  6. import { ApprovalType, BusinessType, ExecutorSetType } from '@/enums/gc'
  7. import { QuestionCircleFilled } from '@ant-design/icons'
  8. import { Form, message, Tooltip } from 'antd'
  9. import ProForm, { ProFormDependency, ProFormRadio, ProFormSelect, ProFormText } from '@ant-design/pro-form'
  10. import type { ModalAction } from '@/components/Modal'
  11. const setTypeOptions = [
  12. {
  13. label: (
  14. <div>
  15. <span className="mr-1">预置成员</span>
  16. <Tooltip title="审批用户为该角色绑定成员">
  17. <QuestionCircleFilled style={{ color: 'orange' }} />
  18. </Tooltip>
  19. </div>
  20. ),
  21. value: ExecutorSetType.PRESET_MEMBER
  22. },
  23. {
  24. label: (
  25. <div>
  26. <span className="mr-1">步骤设置</span>
  27. <Tooltip title="审批用户为该角色动态配置">
  28. <QuestionCircleFilled style={{ color: 'orange' }} />
  29. </Tooltip>
  30. </div>
  31. ),
  32. value: ExecutorSetType.STEP_SETTING
  33. }
  34. ]
  35. type iState = {
  36. items: API.ExecutorItem[]
  37. total: number
  38. }
  39. export default function useScripts(modal: ModalAction, business: BusinessType) {
  40. const [state, seState] = useState<iState>({
  41. items: [],
  42. total: 0
  43. })
  44. const { refresh, loading } = useRequest(() => queryExecutorList({ businessType: BusinessType.BUDGET }), {
  45. onSuccess: result => {
  46. seState(result.data)
  47. }
  48. })
  49. const addOrEdit = (mode: 'add' | 'edit', initialValues?: API.ExecutorItem) => {
  50. const text = mode === 'add' ? '新增执行者' : '编辑执行者'
  51. modal.open({
  52. title: text,
  53. okText: '确定',
  54. cancelText: '取消',
  55. type: 'form',
  56. initialValues: initialValues ?? {
  57. setType: ExecutorSetType.PRESET_MEMBER,
  58. approvalType: ApprovalType.TARGET
  59. },
  60. children: (
  61. <ProForm submitter={false} layout="horizontal" labelCol={{ span: 5 }} isKeyPressSubmit>
  62. <ProFormText hidden name="ID" />
  63. <ProFormText
  64. label="执行者名称"
  65. name="name"
  66. rules={[{ required: true, message: '请输入' }]}
  67. placeholder="请输入"
  68. />
  69. <ProFormRadio.Group
  70. label="配置方式"
  71. name="setType"
  72. options={setTypeOptions}
  73. rules={[{ required: true, message: '请选择' }]}
  74. />
  75. <ProFormDependency name={['setType']}>
  76. {({ name }) => {
  77. if (name === ExecutorSetType.PRESET_MEMBER)
  78. return (
  79. <Form.Item label="成员" name="members" rules={[{ required: true, message: '请选择' }]}>
  80. <MemberItem />
  81. </Form.Item>
  82. )
  83. return <ProFormSelect name="" label="范围选择" />
  84. }}
  85. </ProFormDependency>
  86. </ProForm>
  87. ),
  88. onOk: async (values: API.ExecutorItem) => {
  89. let requestFn: Nullable<() => Promise<viod>> = null
  90. if (mode === 'add') {
  91. requestFn = addExecutor
  92. values.businessType = business
  93. } else {
  94. requestFn = updateExecutor
  95. }
  96. try {
  97. await requestFn?.(values)
  98. refresh()
  99. modal.close()
  100. message.success(text + '成功')
  101. } catch (error) {}
  102. }
  103. })
  104. }
  105. const del = (ID: string) => {
  106. modal.open({
  107. title: '删除执行者',
  108. okText: '确定',
  109. cancelText: '取消',
  110. children: <div>确定删除该执行者吗?</div>,
  111. onOk: async () => {
  112. try {
  113. const { code = -1 } = await delExecutor({ ID })
  114. if (code === consts.RET_CODE.SUCCESS) {
  115. refresh()
  116. modal.close()
  117. message.success('删除成功')
  118. }
  119. } catch (error) {}
  120. }
  121. })
  122. }
  123. return { data: state, loading, addOrEdit, del }
  124. }