|
@@ -1,9 +1,10 @@
|
|
-import { queryAccountList } from '@/services/api/institution'
|
|
|
|
|
|
+import { queryAcountListByInstitutionID } from '@/services/api/institution'
|
|
import { queryInstitutionRoleList } from '@/services/api/project'
|
|
import { queryInstitutionRoleList } from '@/services/api/project'
|
|
import consts from '@/utils/consts'
|
|
import consts from '@/utils/consts'
|
|
|
|
+import { isArray } from '@/utils/is'
|
|
import { useRequest } from '@umijs/max'
|
|
import { useRequest } from '@umijs/max'
|
|
import { Select, TreeSelect } from 'antd'
|
|
import { Select, TreeSelect } from 'antd'
|
|
-import { useState } from 'react'
|
|
|
|
|
|
+import { useEffect, useState } from 'react'
|
|
|
|
|
|
enum AuditType {
|
|
enum AuditType {
|
|
ACCOUNT = 'account',
|
|
ACCOUNT = 'account',
|
|
@@ -11,6 +12,11 @@ enum AuditType {
|
|
ROLE = 'role'
|
|
ROLE = 'role'
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+const auditAbbr = {
|
|
|
|
+ a_: AuditType.ACCOUNT,
|
|
|
|
+ i_: AuditType.INSTITUTION,
|
|
|
|
+ r_: AuditType.ROLE
|
|
|
|
+}
|
|
const auditTypeOptions = [
|
|
const auditTypeOptions = [
|
|
{ label: '用户', value: AuditType.ACCOUNT },
|
|
{ label: '用户', value: AuditType.ACCOUNT },
|
|
{ label: '单位角色', value: AuditType.INSTITUTION }
|
|
{ label: '单位角色', value: AuditType.INSTITUTION }
|
|
@@ -30,39 +36,48 @@ type iState = {
|
|
|
|
|
|
const filterTreeNodes = (mode: AuditType, tree: string[]) =>
|
|
const filterTreeNodes = (mode: AuditType, tree: string[]) =>
|
|
tree.map(item => {
|
|
tree.map(item => {
|
|
- const newItem = { ...item }
|
|
|
|
|
|
+ const newItem = { title: item.name || item.institutionName }
|
|
// 重新拼装id, 根据AuditType加上不同的前缀(后端同步前缀格式)
|
|
// 重新拼装id, 根据AuditType加上不同的前缀(后端同步前缀格式)
|
|
switch (mode) {
|
|
switch (mode) {
|
|
case AuditType.ACCOUNT:
|
|
case AuditType.ACCOUNT:
|
|
- newItem.ID = `a_${newItem.ID}`
|
|
|
|
|
|
+ newItem.value = `a_${item.ID}`
|
|
|
|
+ newItem.key = `a_${item.ID}`
|
|
break
|
|
break
|
|
case AuditType.INSTITUTION:
|
|
case AuditType.INSTITUTION:
|
|
- newItem.ID = `i_${newItem.ID}`
|
|
|
|
|
|
+ newItem.value = `i_${item.ID}`
|
|
break
|
|
break
|
|
default:
|
|
default:
|
|
- newItem.ID = `r_${newItem.ID}`
|
|
|
|
|
|
+ newItem.value = `r_${item.ID}`
|
|
break
|
|
break
|
|
}
|
|
}
|
|
- if (newItem.children) {
|
|
|
|
|
|
+ if (isArray(item.children)) {
|
|
newItem.disabled = true
|
|
newItem.disabled = true
|
|
- newItem.children = filterTreeNodes(newItem.children)
|
|
|
|
|
|
+ newItem.children = filterTreeNodes(mode, item.children)
|
|
return newItem
|
|
return newItem
|
|
}
|
|
}
|
|
return newItem
|
|
return newItem
|
|
})
|
|
})
|
|
-
|
|
|
|
const MemberItem: React.FC<MemberItemProps> = ({ value, onChange }) => {
|
|
const MemberItem: React.FC<MemberItemProps> = ({ value, onChange }) => {
|
|
const [state, setState] = useState<iState>({
|
|
const [state, setState] = useState<iState>({
|
|
auditType: AuditType.ACCOUNT,
|
|
auditType: AuditType.ACCOUNT,
|
|
memberOptions: [],
|
|
memberOptions: [],
|
|
members: value
|
|
members: value
|
|
})
|
|
})
|
|
|
|
+ useEffect(() => {
|
|
|
|
+ const findAuditType = () => {
|
|
|
|
+ const abbr = value?.[0].slice(0, 2)
|
|
|
|
+ if (auditAbbr[abbr]) {
|
|
|
|
+ setState({ ...state, auditType: auditAbbr[abbr] })
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ findAuditType()
|
|
|
|
+ }, [])
|
|
useRequest(
|
|
useRequest(
|
|
() => {
|
|
() => {
|
|
let requestFn: Nullable<() => Promise<void>> = null
|
|
let requestFn: Nullable<() => Promise<void>> = null
|
|
switch (state.auditType) {
|
|
switch (state.auditType) {
|
|
case AuditType.ACCOUNT:
|
|
case AuditType.ACCOUNT:
|
|
- requestFn = () => queryAccountList({ pageSize: consts.MAX_PAGE_SIZE })
|
|
|
|
|
|
+ requestFn = () => queryAcountListByInstitutionID({ pageSize: consts.MAX_PAGE_SIZE })
|
|
break
|
|
break
|
|
case AuditType.INSTITUTION:
|
|
case AuditType.INSTITUTION:
|
|
requestFn = () => queryInstitutionRoleList({ pageSize: consts.MAX_PAGE_SIZE })
|
|
requestFn = () => queryInstitutionRoleList({ pageSize: consts.MAX_PAGE_SIZE })
|
|
@@ -75,7 +90,17 @@ const MemberItem: React.FC<MemberItemProps> = ({ value, onChange }) => {
|
|
{
|
|
{
|
|
refreshDeps: [state.auditType],
|
|
refreshDeps: [state.auditType],
|
|
onSuccess(data: { items: any[] }) {
|
|
onSuccess(data: { items: any[] }) {
|
|
- setState({ ...state, memberOptions: filterTreeNodes(state.auditType, data.items) })
|
|
|
|
|
|
+ console.log(
|
|
|
|
+ filterTreeNodes(state.auditType, state.auditType === AuditType.ACCOUNT ? data : data.items)
|
|
|
|
+ )
|
|
|
|
+
|
|
|
|
+ setState({
|
|
|
|
+ ...state,
|
|
|
|
+ memberOptions: filterTreeNodes(
|
|
|
|
+ state.auditType,
|
|
|
|
+ state.auditType === AuditType.ACCOUNT ? data : data.items
|
|
|
|
+ )
|
|
|
|
+ })
|
|
}
|
|
}
|
|
}
|
|
}
|
|
)
|
|
)
|
|
@@ -88,30 +113,31 @@ const MemberItem: React.FC<MemberItemProps> = ({ value, onChange }) => {
|
|
const toggleAuditType = (value: AuditType) => setState({ ...state, auditType: value, members: [] })
|
|
const toggleAuditType = (value: AuditType) => setState({ ...state, auditType: value, members: [] })
|
|
|
|
|
|
return (
|
|
return (
|
|
- <div className="ant-form-item">
|
|
|
|
- <div className="ant-row ant-form-item-row">
|
|
|
|
- <div className="ant-col ant-col-5 ant-form-item-label">
|
|
|
|
- <label className="ant-form-item-required">成员</label>
|
|
|
|
- </div>
|
|
|
|
- <div className="ant-col ant-form-item-control">
|
|
|
|
- <div className="ant-form-item-control-input">
|
|
|
|
- <div className="ant-form-item-control-input-content">
|
|
|
|
- <Select
|
|
|
|
- defaultValue={state.auditType}
|
|
|
|
- options={auditTypeOptions}
|
|
|
|
- onChange={toggleAuditType}
|
|
|
|
- style={{ width: '100%' }}
|
|
|
|
- />
|
|
|
|
- <TreeSelect
|
|
|
|
- value={state.members}
|
|
|
|
- options={state.memberOptions}
|
|
|
|
- onChange={toggleChange}
|
|
|
|
- style={{ width: '100%', marginTop: '4px' }}
|
|
|
|
- />
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
|
|
+ <div>
|
|
|
|
+ <Select
|
|
|
|
+ value={state.auditType}
|
|
|
|
+ options={auditTypeOptions}
|
|
|
|
+ onChange={toggleAuditType}
|
|
|
|
+ style={{ width: '100%' }}
|
|
|
|
+ />
|
|
|
|
+ {state.auditType === AuditType.ACCOUNT ? (
|
|
|
|
+ <TreeSelect
|
|
|
|
+ value={state.members}
|
|
|
|
+ treeData={state.memberOptions}
|
|
|
|
+ onChange={toggleChange}
|
|
|
|
+ multiple
|
|
|
|
+ maxTagCount="responsive"
|
|
|
|
+ style={{ width: '100%', marginTop: '4px' }}
|
|
|
|
+ />
|
|
|
|
+ ) : (
|
|
|
|
+ <Select
|
|
|
|
+ value={state.members}
|
|
|
|
+ options={state.memberOptions}
|
|
|
|
+ onChange={toggleChange}
|
|
|
|
+ fieldNames={{ label: 'title' }}
|
|
|
|
+ style={{ width: '100%', marginTop: '4px' }}
|
|
|
|
+ />
|
|
|
|
+ )}
|
|
</div>
|
|
</div>
|
|
)
|
|
)
|
|
}
|
|
}
|