useRowScript.tsx 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. import ProForm, { ProFormSelect, ProFormText } from '@ant-design/pro-form'
  2. import type { ModalAction } from '@/components/Modal'
  3. import { message, Modal } from 'antd'
  4. import { addMatter, delMatter, queryMatterTree, updateMatter } from '@/services/api/business'
  5. import { useState } from 'react'
  6. import { useRequest } from '@umijs/max'
  7. import consts from '@/utils/consts'
  8. export enum MatterType {
  9. CATEGORY = 'category', // 分类
  10. MATTER = 'matter' // 事项
  11. }
  12. const MatterTitleEnum = {
  13. [MatterType.CATEGORY]: '分类名称',
  14. [MatterType.MATTER]: '事项名称'
  15. }
  16. interface IState {
  17. treeList?: API.MatterParams[]
  18. expandTreeIds: []
  19. }
  20. export function useRowScript(modal: ModalAction) {
  21. const [state, setState] = useState<IState>({})
  22. const {
  23. run: query,
  24. refresh,
  25. loading
  26. } = useRequest(queryMatterTree, {
  27. manual: true,
  28. onSuccess: (result?: API.MatterParams[]) => {
  29. function expandTreeList(data: API.MatterParams[]): string[] {
  30. let idArr: string[] = []
  31. data.forEach((item: API.MatterParams) => {
  32. if (item.children?.length) {
  33. idArr.push(item.ID)
  34. const childIDs = expandTreeList(item.children)
  35. idArr = [...idArr, ...childIDs]
  36. }
  37. })
  38. return idArr
  39. }
  40. setState({
  41. ...state,
  42. treeList: result,
  43. expandTreeIds: expandTreeList(result)
  44. })
  45. // setState({ ...state, treeList: result || [] })
  46. }
  47. })
  48. /** 新建 */
  49. const add = (mode: MatterType.CATEGORY | MatterType.MATTER, subjectParams) => {
  50. const text = mode === MatterType.CATEGORY ? '新建分类' : '新建事项'
  51. modal.open({
  52. title: text,
  53. okText: '确定',
  54. cancelText: '取消',
  55. type: 'form',
  56. children: (
  57. <ProForm submitter={false} layout="horizontal" labelCol={{ span: 5 }} isKeyPressSubmit>
  58. <ProFormText hidden name="ID" />
  59. {mode === MatterType.MATTER ? (
  60. <ProFormSelect
  61. name="parentID"
  62. label="分类名称"
  63. options={state.treeList
  64. ?.filter(item => MatterType.CATEGORY.includes(item.matterType))
  65. .map(data => ({ label: data.name, value: data.ID }))}
  66. rules={[{ required: true, message: '请选择' }]}
  67. />
  68. ) : null}
  69. <ProFormText
  70. name="name"
  71. label={MatterTitleEnum[mode]}
  72. rules={[{ required: true, message: '请输入' }]}
  73. />
  74. </ProForm>
  75. ),
  76. onOk: async (values: API.MatterItem) => {
  77. let requestFn: Nullable<() => Promise<viod>> = null
  78. requestFn = addMatter
  79. try {
  80. if (mode === MatterType.CATEGORY) {
  81. await requestFn?.({ ...values, ...subjectParams, matterType: MatterType.CATEGORY })
  82. } else {
  83. await requestFn?.({ ...values, ...subjectParams, matterType: MatterType.MATTER })
  84. }
  85. refresh()
  86. modal.close()
  87. message.success('新建成功')
  88. } catch (error) {}
  89. }
  90. })
  91. }
  92. /** 编辑 */
  93. const edit = (record, subjectParams) => {
  94. const text = record.matterType === MatterType.CATEGORY ? '编辑分类' : '编辑事项'
  95. modal.open({
  96. title: text,
  97. okText: '确定',
  98. cancelText: '取消',
  99. initialValues: { ...record },
  100. type: 'form',
  101. children: (
  102. <ProForm submitter={false} layout="horizontal" labelCol={{ span: 5 }} isKeyPressSubmit>
  103. <ProFormText hidden name="ID" />
  104. {record.matterType === MatterType.MATTER ? (
  105. <ProFormSelect
  106. name="parentID"
  107. label="分类名称"
  108. options={state.list?.map(item => ({ label: item.name, value: item.ID }))}
  109. rules={[{ required: true, message: '请选择' }]}
  110. />
  111. ) : null}
  112. <ProFormText
  113. name="name"
  114. label={MatterTitleEnum[record.matterType]}
  115. rules={[{ required: true, message: '请输入' }]}
  116. />
  117. </ProForm>
  118. ),
  119. onOk: async (values: API.MatterItem) => {
  120. let requestFn: Nullable<() => Promise<viod>> = null
  121. requestFn = updateMatter
  122. try {
  123. if (record.matterType === MatterType.CATEGORY) {
  124. await requestFn?.({ ...values, ...subjectParams, matterType: MatterType.CATEGORY })
  125. } else {
  126. await requestFn?.({ ...values, ...subjectParams, matterType: MatterType.MATTER })
  127. }
  128. refresh()
  129. modal.close()
  130. message.success('编辑成功')
  131. } catch (error) {}
  132. }
  133. })
  134. }
  135. /** 删除 */
  136. const deleteMatter = (ID: string, children: any[]) => {
  137. if (!children.length) {
  138. Modal.confirm({
  139. title: '删除',
  140. content: '确认删除该行数据?',
  141. okText: '确定',
  142. cancelText: '取消',
  143. onOk: async () => {
  144. // 进行删除的接口请求
  145. const { code = -1 } = await delMatter({ ID })
  146. if (code === consts.RET_CODE.SUCCESS) {
  147. message.success('删除成功')
  148. refresh()
  149. }
  150. }
  151. })
  152. } else {
  153. message.warning('请先移除该分类下的所有事项')
  154. }
  155. }
  156. return {
  157. query,
  158. loading,
  159. treeList: state.treeList,
  160. expandTreeIds: state.expandTreeIds,
  161. add,
  162. edit,
  163. deleteMatter
  164. }
  165. }