فهرست منبع

feat: 主体列表抽出独立dva逻辑

outaozhen 3 سال پیش
والد
کامیت
e8695d22f7
3فایلهای تغییر یافته به همراه42 افزوده شده و 15 حذف شده
  1. 21 14
      src/pages/Business/RuleCode/components/LeftMenu/index.tsx
  2. 15 1
      src/pages/Business/model.ts
  3. 6 0
      src/services/api/typings.d.ts

+ 21 - 14
src/pages/Business/RuleCode/components/LeftMenu/index.tsx

@@ -1,15 +1,15 @@
 import { Menu, MenuProps } from 'antd'
-import React, { useState } from 'react'
+import React, { useEffect, useState } from 'react'
 import styles from './index.less'
 import { BusinessType } from '@/enums/gc'
-import { querySubjectList } from '@/services/api/subject'
-import { useRequest } from '@umijs/max'
+import { connect } from '@umijs/max'
 import classNames from 'classnames'
 import { approvalTypeMap } from '../..'
 
 type LeftMenuProps = {
   title?: string
   onChange?: (key: string, option: { key: string; label: string }) => void
+  subjectList?: API.SubjectParams[]
 }
 
 export const businessOptions = [
@@ -18,14 +18,14 @@ export const businessOptions = [
   { label: '决算审核', key: BusinessType.DONE }
 ]
 
-const LeftMenu: React.FC<LeftMenuProps> = ({ title = '业务主体列表', onChange }) => {
+const LeftMenu: React.FC<LeftMenuProps> = ({ title = '业务主体列表', onChange, dispatch, subjectList }) => {
   const [state, setState] = useState({
     openKeys: [],
-    subjectList: [],
     /** 激活的业务主体id+业务类型 */
     activeKey: null,
     selectedKeysValue: ''
   })
+  console.log(state.activeKey)
 
   const handleOnSelect = ({ key }) => {
     const [value, label] = key.split('_')
@@ -37,19 +37,24 @@ const LeftMenu: React.FC<LeftMenuProps> = ({ title = '业务主体列表', onCha
       onChange(key, option)
     }
   }
-  useRequest(() => querySubjectList({ current: 1, pageSize: 214000 }), {
-    onSuccess: async result => {
-      const activeKey = `${result?.items[0]?.ID}_${businessOptions[0].key}`
+  useEffect(() => {
+    if (!subjectList.length) {
+      dispatch({
+        type: 'business/querySubject',
+        payload: { current: 1, pageSize: 214000 }
+      })
+    }
+    if (subjectList.length) {
+      const activeKey = `${subjectList[0]?.ID}_${businessOptions[0].key}`
       setState({
         ...state,
-        subjectList: result?.items,
         activeKey,
-        openKeys: [result?.items[0]?.ID]
+        openKeys: [subjectList[0]?.ID]
       })
       handleOnSelect({ key: activeKey })
     }
-  })
-  const rootSubmenuKeys = state.subjectList.map(item => item.ID)
+  }, [subjectList.length])
+  const rootSubmenuKeys = subjectList.map(item => item.ID)
   const onOpenChange: MenuProps['onOpenChange'] = keys => {
     const latestOpenKey = keys.find(key => state.openKeys.indexOf(key) === -1)
     if (rootSubmenuKeys.indexOf(latestOpenKey!) === -1) {
@@ -70,7 +75,7 @@ const LeftMenu: React.FC<LeftMenuProps> = ({ title = '业务主体列表', onCha
           onOpenChange={onOpenChange}
           onSelect={handleOnSelect}
           mode="inline"
-          items={state.subjectList.map(item => ({
+          items={subjectList.map(item => ({
             label: item.name,
             key: item.ID,
             children: businessOptions.map(business => ({
@@ -84,4 +89,6 @@ const LeftMenu: React.FC<LeftMenuProps> = ({ title = '业务主体列表', onCha
   )
 }
 
-export default LeftMenu
+export default connect(({ business }: { subjectList: BusinessModelState }) => ({
+  subjectList: business.subjectList
+}))(LeftMenu)

+ 15 - 1
src/pages/Business/model.ts

@@ -1,6 +1,7 @@
 // import { getProjectTypeList } from '@/services/api/project'
 // import consts from '@/utils/consts'
 import { queryInstitutionList } from '@/services/api/institution'
+import { querySubjectList } from '@/services/api/subject'
 import consts from '@/utils/consts'
 import type { Effect, Reducer } from '@umijs/max'
 
@@ -13,6 +14,7 @@ export interface BusinessModelType {
   state: BusinessModelState
   effects: {
     queryInstitution: Effect
+    querySubject: Effect
   }
   reducers: {
     save: Reducer<BusinessModelState>
@@ -24,7 +26,8 @@ export interface BusinessModelType {
 const BusinessModel: BusinessModelType = {
   namespace: 'business',
   state: {
-    institutionList: []
+    institutionList: [],
+    subjectList: []
   },
   effects: {
     *queryInstitution({ payload }, { call, put }) {
@@ -37,6 +40,17 @@ const BusinessModel: BusinessModelType = {
           }
         })
       }
+    },
+    *querySubject({ payload }, { call, put }) {
+      const response = yield call(querySubjectList, payload)
+      if (response?.code === consts.RET_CODE.SUCCESS) {
+        yield put({
+          type: 'save',
+          payload: {
+            subjectList: response.data.items
+          }
+        })
+      }
     }
   },
   reducers: {

+ 6 - 0
src/services/api/typings.d.ts

@@ -418,6 +418,12 @@ declare namespace API {
     rules: any[]
   }
 
+  type SubjectParams = {
+    ID: string
+    name: string
+    institutionIDs: any[]
+  }
+
   type RuleCodeParams = {
     tab: string
     subjectID: string