Commit 5702bedc authored by XieZhiXiong's avatar XieZhiXiong

对接完毕会员审核流程

parent 53b29f93
...@@ -17,7 +17,6 @@ const getPrevTime = (num, flag) => { ...@@ -17,7 +17,6 @@ const getPrevTime = (num, flag) => {
const DateSelect = (props) => { const DateSelect = (props) => {
const { value = [], mutators } = props const { value = [], mutators } = props
console.log('value', value)
const todayStartTime = moment().startOf('day').format('x') const todayStartTime = moment().startOf('day').format('x')
const nowTime = moment().format('x').valueOf() const nowTime = moment().format('x').valueOf()
const dateMemo = useMemo(() => [ const dateMemo = useMemo(() => [
......
...@@ -242,6 +242,27 @@ const addMember: React.FC<any> = props => { ...@@ -242,6 +242,27 @@ const addMember: React.FC<any> = props => {
FormPath.setIn(state, 'props.enum', channelType); FormPath.setIn(state, 'props.enum', channelType);
}); });
// 如果会员信息存在渠道代理城市信息,设置一下每项的 市级数据
setTimeout(() => {
console.log('memberInfo1', memberInfo)
if (memberInfo && memberInfo.areas.length) {
memberInfo.areas.forEach((area, index) => {
const { pcode, ccode } = area;
const province = areas.find(item => item.code === pcode);
if (province && province.children) {
const city = province.children.find((item: any) => item.code === ccode);
formActions.setFieldState(
`areas.${index}.ccode`,
state => {
FormPath.setIn(state, 'props.enum', city);
}
);
}
});
}
}, 2000);
areasData = areas; areasData = areas;
}); });
}); });
...@@ -292,6 +313,16 @@ const addMember: React.FC<any> = props => { ...@@ -292,6 +313,16 @@ const addMember: React.FC<any> = props => {
} }
}); });
// 主动的渠道信息省级变化,重置市级 value
onFieldInputChange$('areas.*.pcode').subscribe(fieldState => {
formActions.setFieldState(
FormPath.transform(fieldState.name, /\d/, $1 => `areas.${$1}.ccode`),
state => {
FormPath.setIn(state, 'value', undefined);
}
);
});
// 渠道信息省级变化,筛选出对应的市级数据 // 渠道信息省级变化,筛选出对应的市级数据
onFieldValueChange$('areas.*.pcode').subscribe(fieldState => { onFieldValueChange$('areas.*.pcode').subscribe(fieldState => {
const province = areasData.find(item => item.code === fieldState.value); const province = areasData.find(item => item.code === fieldState.value);
...@@ -302,13 +333,14 @@ const addMember: React.FC<any> = props => { ...@@ -302,13 +333,14 @@ const addMember: React.FC<any> = props => {
formActions.setFieldState( formActions.setFieldState(
FormPath.transform(fieldState.name, /\d/, $1 => `areas.${$1}.ccode`), FormPath.transform(fieldState.name, /\d/, $1 => `areas.${$1}.ccode`),
state => { state => {
FormPath.setIn(state, 'value', undefined);
FormPath.setIn(state, 'props.enum', city); FormPath.setIn(state, 'props.enum', city);
} }
); );
}); });
} }
console.log('memberInfo2', memberInfo)
return ( return (
<Spin spinning={infoLoading}> <Spin spinning={infoLoading}>
<PageHeaderWrapper <PageHeaderWrapper
......
...@@ -96,7 +96,7 @@ export const importSchema: ISchema = { ...@@ -96,7 +96,7 @@ export const importSchema: ISchema = {
allowClear: true, allowClear: true,
}, },
}, },
'[starTime, endTime]': { '[startDate, endDate]': {
type: 'string', type: 'string',
default: '', default: '',
'x-component': 'dateSelect', 'x-component': 'dateSelect',
......
...@@ -90,23 +90,14 @@ export const maintianSchema: ISchema = { ...@@ -90,23 +90,14 @@ export const maintianSchema: ISchema = {
allowClear: true, allowClear: true,
}, },
}, },
timeRange: { '[startDate, endDate]': {
type: 'string', type: 'string',
default: 0, default: '',
'x-component': 'dateSelect',
'x-component-props': { 'x-component-props': {
placeholder: '请选择', placeholder: '时间范围(全部)',
allowClear: true, allowClear: true,
}, },
enum: [
{ label: '时间范围(全部)', value: 0 },
{ label: '今天', value: 1 },
{ label: '一周内', value: 2 },
{ label: '一个月内', value: 3 },
{ label: '三个月内', value: 4 },
{ label: '六个月内', value: 5 },
{ label: '一年内', value: 6 },
{ label: '一年前', value: 7 },
],
}, },
submit: { submit: {
'x-component': 'Submit', 'x-component': 'Submit',
......
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import { history } from 'umi'; import { history } from 'umi';
import { PageHeaderWrapper } from '@ant-design/pro-layout'; import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { PageHeader, Tag, Descriptions, Button } from 'antd'; import {
import { FormOutlined, StopOutlined } from '@ant-design/icons'; PageHeader,
import { STATUS_COLOR_MAP, STATUS_COLOR_TXT } from '../constant'; Tag,
import { usePageStatus } from '@/hooks/usePageStatus'; Descriptions,
Button,
Badge,
Spin,
Modal,
} from 'antd';
import { FormOutlined } from '@ant-design/icons';
import { usePageStatus, PageStatus } from '@/hooks/usePageStatus';
import { PublicApi } from '@/services/api'; import { PublicApi } from '@/services/api';
import MellowCard from '@/components/MellowCard'; import { GetMemberAbilityValidateStep1DetailResponse } from '@/services/MemberApi';
import { createFormActions, FormEffectHooks, FormPath } from '@formily/antd';
import NiceForm from '@/components/NiceForm';
import { MEMBER_INNER_STATUS_BADGE_COLOR, MEMBER_STATUS_TAG_MAP, MEMBER_OUTER_STATUS_TYPE } from '../constant';
import { auditModalSchema } from './schema';
import HeadInfo from '../components/HeadInfo'; import HeadInfo from '../components/HeadInfo';
import AuditProcess from '../components/AuditProcess'; import AuditProcess from '../components/AuditProcess';
import BasicInfo from '../components/BasicInfo'; import BasicInfo from '../components/BasicInfo';
import StatusTag from '../components/StatusTag';
import styles from './index.less'; import styles from './index.less';
const auditPr1: React.FC<{}> = () => { interface AreaItem {
const { pageStatus, id, validateId } = usePageStatus(); name: string;
const [detailed, setDetailed] = useState<any>({}); code: string;
children: AreaItem[];
};
interface MemberInfo extends GetMemberAbilityValidateStep1DetailResponse {
channelTypeName?: string;
areasInfo?: string[];
};
useEffect(() => { const modalFormActions = createFormActions();
const {
onFieldValueChange$,
onFieldInputChange$,
} = FormEffectHooks;
const AuditPr1: React.FC<{}> = () => {
const { id, validateId, pageStatus } = usePageStatus();
const [memberInfo, setMemberInfo] = useState<MemberInfo>(null);
const [modalVisible, setModalVisible] = useState(false);
const [infoLoading, setInfoLoading] = useState(false);
const [confirmLoading, setConfirmLoading] = useState(false);
const getAreasInfo = (
vals: { pcode: string, ccode: string }[] = [],
source: AreaItem[] = []
) => {
const ret = [];
vals.forEach(val => {
const { pcode, ccode } = val;
const province = source.find(item => item.code === pcode);
let str = province.name;
// 存在 市级
if (ccode && province && province.children) {
const city = province.children.find(item => item.code === ccode);
str += `/${city.name}`;
}
ret.push(str);
});
return ret;
};
const getDetailedInfo = () => {
if (id && validateId) {
setInfoLoading(true);
PublicApi.getMemberAbilityValidateStep1Detail({
memberId: id,
validateId,
}).then(res => {
if (res.code !== 1000) {
return;
}
setMemberInfo(res.data || null);
}).finally(() => {
setInfoLoading(false);
});
}
};
useEffect(() => {
getDetailedInfo();
}, []); }, []);
// 提交审核
const handleSubmit = values => {
setConfirmLoading(true);
// 调用渠道 Form 的 submit
const promises: any = [
PublicApi.postMemberAbilityValidateStep1Submit({
memberId: id,
validateId: validateId,
...values,
}),
];
Promise.all(promises).then(res => {
setConfirmLoading(false);
setModalVisible(false);
setTimeout(() => {
history.goBack();
}, 1000);
}).catch(err => {
setConfirmLoading(false);
});
};
return ( return (
<PageHeaderWrapper <Spin spinning={infoLoading}>
title={ <PageHeaderWrapper
<> title={
<PageHeader <>
style={{ padding: 0 }} <PageHeader
onBack={() => history.goBack()} style={{ padding: 0 }}
title={ onBack={() => history.goBack()}
<HeadInfo title={
info={{ <HeadInfo
name: '广州市极致皮具有限公司', info={{
level: 1, name: memberInfo?.name,
}} level: 1,
/> }}
} />
extra={( }
<> extra={(
<Button <>
icon={<StopOutlined />} {pageStatus === PageStatus.EDIT && (
onClick={() => {}} <Button
> type="primary"
审核不通过 icon={<FormOutlined />}
</Button> onClick={() => setModalVisible(true)}
<Button >
type="primary" 提交审核
icon={<FormOutlined />} </Button>
onClick={() => {}} )}
> </>
提交审核 )}
</Button>
</>
)}
>
<Descriptions
size="small"
column={3}
style={{
padding: '0 32px',
}}
> >
<Descriptions.Item label="会员类型">{123}</Descriptions.Item> <Descriptions
<Descriptions.Item label="会员角色" span={2}>{123}</Descriptions.Item> size="small"
<Descriptions.Item label="会员状态"> column={3}
<Tag color={STATUS_COLOR_MAP[1]}>{STATUS_COLOR_TXT[1]}</Tag> style={{
</Descriptions.Item> padding: '0 32px',
<Descriptions.Item label="外部状态"> }}
<Tag color={STATUS_COLOR_MAP[2]}>{STATUS_COLOR_TXT[2]}</Tag> >
</Descriptions.Item> <Descriptions.Item label="会员类型">{memberInfo?.memberTypeName}</Descriptions.Item>
</Descriptions> <Descriptions.Item label="会员角色" span={2}>{memberInfo?.roleName}</Descriptions.Item>
</PageHeader> <Descriptions.Item label="会员状态">
</> <StatusTag type={MEMBER_STATUS_TAG_MAP[memberInfo?.status]} title={memberInfo?.statusName} />
} </Descriptions.Item>
> <Descriptions.Item label="外部状态">
<div <StatusTag type={MEMBER_OUTER_STATUS_TYPE[memberInfo?.outerStatus]} title={memberInfo?.outerStatusName} />
style={{ </Descriptions.Item>
marginBottom: 24, <Descriptions.Item label="内部状态">
}} <Badge color={MEMBER_INNER_STATUS_BADGE_COLOR[memberInfo?.innerStatus]} text={memberInfo?.innerStatusName} />
</Descriptions.Item>
</Descriptions>
</PageHeader>
</>
}
> >
<AuditProcess /> <div
</div> style={{
marginBottom: 24,
}}
>
<AuditProcess
outerVerifySteps={memberInfo?.outerVerifySteps}
innerVerifySteps={memberInfo?.innerVerifySteps}
/>
</div>
<BasicInfo
basic={{
account: memberInfo?.account,
phone: memberInfo?.phone,
email: memberInfo?.email,
created: memberInfo?.registerTime,
}}
channel={{
memberType: memberInfo?.memberTypeEnum,
level: memberInfo?.channelLevelTag,
type: memberInfo?.channelTypeName,
areas: memberInfo?.areas,
desc: memberInfo?.remark,
}}
extra={memberInfo?.groups}
outerHistory={memberInfo?.outerHistory}
innerHistory={memberInfo?.innerHistory}
/>
<BasicInfo /> <Modal
</PageHeaderWrapper> title="提交审核"
visible={modalVisible}
confirmLoading={confirmLoading}
onOk={() => modalFormActions.submit()}
onCancel={() => setModalVisible(false)}
destroyOnClose
>
<NiceForm
effects={($, { setFieldState }) => {
onFieldValueChange$('agree').subscribe(fieldState => {
setFieldState('reason', state => {
state.visible = !fieldState.value;
});
});
}}
actions={modalFormActions}
schema={auditModalSchema}
onSubmit={handleSubmit}
/>
</Modal>
</PageHeaderWrapper>
</Spin>
); );
}; };
export default auditPr1; export default AuditPr1;
import React from 'react'; import React, { useState, useEffect, useRef } from 'react';
import AuditList from '../components/auditList'; import { history } from 'umi';
import { Card, Space, Button, Badge, Popconfirm } from 'antd';
import { ClockCircleOutlined } from '@ant-design/icons';
import { StandardTable } from 'god';
import { ColumnType } from 'antd/lib/table/interface';
import { createFormActions } from '@formily/antd';
import EyePreview from '@/components/EyePreview';
import NiceForm from '@/components/NiceForm';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect';
import { PublicApi } from '@/services/api';
import { auditSchema } from './schema';
import {
MEMBER_STATUS_TAG_MAP,
MEMBER_INNER_STATUS_BADGE_COLOR,
MEMBER_OUTER_STATUS_TYPE,
} from '../constant';
import { coverColFiltersItem } from '../utils';
import StatusTag from '../components/StatusTag';
const memberPr = () => { const formActions = createFormActions();
return <AuditList pageType="2" />;
const MemberPr1: React.FC<{}> = props => {
const ref = useRef<any>({});
const [searchItems, setSearchItems] = useState<any>({});
const [filteredInfo, setFilteredInfo] = useState<any>({});
const [selectedRowKeys, setSelectedRowKeys] = useState<Array<string>>([]);
const [selectedList, setSelectList] = useState<any>([]);
const handleJumpAudit = record => {
history.push(`/memberCenter/memberAbility/manage/auditPr1?id=${record.memberId}&validateId=${record.validateId}`);
};
const defaultColumns: ColumnType<any>[] = [
{
title: 'ID',
dataIndex: 'memberId',
align: 'center',
},
{
title: '会员名称',
dataIndex: 'name',
align: 'center',
render: (text: any, record: any) => (
<EyePreview
url={`/memberCenter/memberAbility/manage/auditPr1?id=${record.memberId}&validateId=${record.validateId}&preview=1`}
>
{text}
</EyePreview>
),
},
{
title: '会员类型',
dataIndex: 'memberTypeName',
align: 'center',
render: (text: any, record: any) => <span>{text}</span>,
},
{
title: '会员角色',
dataIndex: 'roleName',
align: 'center',
render: (text: any, record: any) => <span>{text}</span>,
},
{
title: '申请来源/时间',
dataIndex: 'sourceName',
align: 'center',
render: (text, record) => (
<>
<div>{text}</div>
<div>
<ClockCircleOutlined /> {record.registerTime}
</div>
</>
),
},
{
title: '会员状态',
dataIndex: 'statusName',
align: 'center',
filters: [],
onFilter: (value, record) => record.status === value,
render: (text, record) => (
<StatusTag type={MEMBER_STATUS_TAG_MAP[record.status]} title={text} />
),
},
{
title: '外部状态',
dataIndex: 'outerStatusName',
align: 'center',
filters: [],
onFilter: (value, record) => record.outerStatus === value,
render: (text, record) => (
<StatusTag type={MEMBER_OUTER_STATUS_TYPE[record.outerStatus]} title={text} />
),
},
{
title: '内部状态',
dataIndex: 'innerStatusName',
align: 'center',
filters: [],
onFilter: (value, record) => record.innerStatus === value,
render: (text, record) => <Badge color={MEMBER_INNER_STATUS_BADGE_COLOR[record.innerStatus]} text={text} />,
},
{
title: '操作',
dataIndex: 'option',
align: 'center',
render: (text: any, record: any) => (
<Button
type="link"
onClick={() => handleJumpAudit(record)}
>
审核
</Button>
),
},
];
const [columns, setColumns] = useState<any[]>(defaultColumns);
const rowSelection = {
onChange: (selectedRowKeys: any, selectedRows: any) => {
let result = selectedRows.map(v => ({
memberId: v.memberId,
validateId: v.validateId,
}));
setSelectedRowKeys(selectedRowKeys);
setSelectList(result);
},
selectedRowKeys: selectedRowKeys,
};
const fetchListData = async (params: any) => {
let res = await PublicApi.getMemberAbilityValidateStep1Page(params);
return res.data;
};
const handleBatch = () => {
console.log('批量')
};
// 初始化高级筛选选项
const fetchSearchItems = async () => {
const res = await PublicApi.getMemberAbilityValidateStep1Pageitems();
if (res.code === 1000) {
const { data = {} }: any = res;
const {
memberTypes = [],
status = [],
roles = [],
levels = [],
sources = [],
outerStatus = [],
innerStatus = [],
} = data;
const newColumns = columns.slice();
// filter 0 过滤掉全部选项
coverColFiltersItem(
newColumns,
'statusName',
status.map(item => ({ text: item.text, value: item.id })).filter(item => item.value !== 0),
);
coverColFiltersItem(
newColumns,
'outerStatusName',
outerStatus.map(item => ({ text: item.text, value: item.id })).filter(item => item.value !== 0),
);
coverColFiltersItem(
newColumns,
'innerStatusName',
innerStatus.map(item => ({ text: item.text, value: item.id })).filter(item => item.value !== 0),
);
setColumns(newColumns);
return {
memberTypeId: memberTypes.map(item => ({ label: item.memberTypeName, value: item.memberTypeId })),
status: status.map(item => ({ label: item.text, value: item.id })),
roleId: roles.map(item => ({ label: item.roleName, value: item.roleId })),
level: levels.map(item => ({ label: item.level, value: item.levelTag })),
source: sources.map(item => ({ label: item.text, value: item.id })),
};
}
return {};
};
const controllerBtns = (
<Space>
<Popconfirm
title="是否继续操作 ?"
placement="bottom"
onConfirm={handleBatch}
okText="是"
cancelText="否"
>
<Button>
批量提交审核
</Button>
</Popconfirm>
</Space>
);
return (
<Card>
<StandardTable
tableProps={{
rowKey: 'memberId',
}}
columns={columns}
currentRef={ref}
fetchTableData={(params: any) => fetchListData(params)}
rowSelection={rowSelection}
controlRender={
<NiceForm
actions={formActions}
onSubmit={values => ref.current.reload(values)}
expressionScope={{
controllerBtns,
}}
effects={($, actions) => {
useStateFilterSearchLinkageEffect(
$,
actions,
'name',
FORM_FILTER_PATH,
);
useAsyncInitSelect(
['memberTypeId', 'status', 'level', 'roleId', 'level', 'source'],
fetchSearchItems,
);
}}
schema={auditSchema}
/>
}
/>
</Card>
);
}; };
export default memberPr; export default MemberPr1;
import { ISchema } from '@formily/antd';
import { FORM_FILTER_PATH } from '@/formSchema/const';
export const auditSchema: ISchema = {
type: 'object',
properties: {
MEGA_LAYOUT: {
type: 'object',
'x-component': 'mega-layout',
properties: {
topLayout: {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
grid: true,
},
properties: {
ctl: {
type: 'object',
'x-component': 'Children',
'x-component-props': {
children: '{{controllerBtns}}',
},
},
name: {
type: 'string',
'x-component': 'Search',
'x-component-props': {
placeholder: '搜索',
},
},
},
},
[FORM_FILTER_PATH]: {
type: 'object',
'x-component': 'flex-layout',
'x-component-props': {
colStyle: {
marginLeft: 20,
},
},
properties: {
memberTypeId: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '会员类型(全部)',
allowClear: true,
},
},
status: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '会员状态(全部)',
allowClear: true,
},
},
roleId: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '会员角色(全部)',
allowClear: true,
},
},
level: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '会员等级(全部)',
allowClear: true,
},
},
source: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '申请来源(全部)',
allowClear: true,
},
},
'[startDate, endDate]': {
type: 'string',
default: '',
'x-component': 'dateSelect',
'x-component-props': {
placeholder: '时间范围(全部)',
allowClear: true,
},
},
submit: {
'x-component': 'Submit',
'x-mega-props': {
span: 1,
},
'x-component-props': {
children: '查询',
},
},
},
},
},
},
},
};
export const auditModalSchema: ISchema = {
type: 'object',
properties: {
MEGA_LAYOUT: {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
labelAlign: 'top',
},
properties: {
agree: {
type: 'string',
default: 1,
enum: [
{ label: '审核通过', value: 1 },
{ label: '审核不通过', value: 0 },
],
'x-component': 'radio',
'x-component-props': {},
},
reason: {
type: 'string',
title: '审核不通过原因',
'x-component': 'textarea',
'x-component-props': {
placeholder: '在此输入你的内容,最长120个字符,60个汉字',
maxLength: 60,
rows: 5,
},
'x-rules': [
// {
// required: true,
// message: '请填写审核不通过原因',
// }
],
},
},
},
},
};
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import { history } from 'umi'; import { history } from 'umi';
import { PageHeaderWrapper } from '@ant-design/pro-layout'; import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { PageHeader, Tag, Descriptions, Button } from 'antd'; import {
import { FormOutlined, StopOutlined } from '@ant-design/icons'; PageHeader,
import { STATUS_COLOR_MAP, STATUS_COLOR_TXT } from '../constant'; Tag,
import { usePageStatus } from '@/hooks/usePageStatus'; Descriptions,
Button,
Badge,
Spin,
Modal,
} from 'antd';
import { FormOutlined } from '@ant-design/icons';
import { usePageStatus, PageStatus } from '@/hooks/usePageStatus';
import { PublicApi } from '@/services/api'; import { PublicApi } from '@/services/api';
import MellowCard from '@/components/MellowCard'; import { GetMemberAbilityValidateStep1DetailResponse } from '@/services/MemberApi';
import { createFormActions, FormEffectHooks, FormPath } from '@formily/antd';
import NiceForm from '@/components/NiceForm';
import { MEMBER_INNER_STATUS_BADGE_COLOR, MEMBER_STATUS_TAG_MAP, MEMBER_OUTER_STATUS_TYPE } from '../constant';
import { auditModalSchema } from './schema';
import HeadInfo from '../components/HeadInfo'; import HeadInfo from '../components/HeadInfo';
import AuditProcess from '../components/AuditProcess'; import AuditProcess from '../components/AuditProcess';
import BasicInfo from '../components/BasicInfo'; import BasicInfo from '../components/BasicInfo';
import StatusTag from '../components/StatusTag';
import styles from './index.less'; import styles from './index.less';
const auditPr2: React.FC<{}> = () => { interface AreaItem {
const { pageStatus, id, validateId } = usePageStatus(); name: string;
const [detailed, setDetailed] = useState<any>({}); code: string;
children: AreaItem[];
};
interface MemberInfo extends GetMemberAbilityValidateStep1DetailResponse {
channelTypeName?: string;
areasInfo?: string[];
};
useEffect(() => { const modalFormActions = createFormActions();
const {
onFieldValueChange$,
onFieldInputChange$,
} = FormEffectHooks;
const AuditPr2: React.FC<{}> = () => {
const { id, validateId, pageStatus } = usePageStatus();
const [memberInfo, setMemberInfo] = useState<MemberInfo>(null);
const [modalVisible, setModalVisible] = useState(false);
const [infoLoading, setInfoLoading] = useState(false);
const [confirmLoading, setConfirmLoading] = useState(false);
const getAreasInfo = (
vals: { pcode: string, ccode: string }[] = [],
source: AreaItem[] = []
) => {
const ret = [];
vals.forEach(val => {
const { pcode, ccode } = val;
const province = source.find(item => item.code === pcode);
let str = province.name;
// 存在 市级
if (ccode && province && province.children) {
const city = province.children.find(item => item.code === ccode);
str += `/${city.name}`;
}
ret.push(str);
});
return ret;
};
const getDetailedInfo = () => {
if (id && validateId) {
setInfoLoading(true);
PublicApi.getMemberAbilityValidateStep2Detail({
memberId: id,
validateId,
}).then(res => {
if (res.code !== 1000) {
return;
}
setMemberInfo(res.data || null);
}).finally(() => {
setInfoLoading(false);
});
}
};
useEffect(() => {
getDetailedInfo();
}, []); }, []);
// 提交审核
const handleSubmit = values => {
setConfirmLoading(true);
// 调用渠道 Form 的 submit
const promises: any = [
PublicApi.postMemberAbilityValidateStep2Submit({
memberId: id,
validateId: validateId,
...values,
}),
];
Promise.all(promises).then(res => {
setConfirmLoading(false);
setModalVisible(false);
setTimeout(() => {
history.goBack();
}, 1000);
}).catch(err => {
setConfirmLoading(false);
});
};
return ( return (
<PageHeaderWrapper <Spin spinning={infoLoading}>
title={ <PageHeaderWrapper
<> title={
<PageHeader <>
style={{ padding: 0 }} <PageHeader
onBack={() => history.goBack()} style={{ padding: 0 }}
title={ onBack={() => history.goBack()}
<HeadInfo title={
info={{ <HeadInfo
name: '广州市极致皮具有限公司', info={{
level: 1, name: memberInfo?.name,
}} level: 1,
/> }}
} />
extra={( }
<> extra={(
<Button <>
icon={<StopOutlined />} {pageStatus === PageStatus.EDIT && (
onClick={() => {}} <Button
> type="primary"
审核不通过 icon={<FormOutlined />}
</Button> onClick={() => setModalVisible(true)}
<Button >
type="primary" 提交审核
icon={<FormOutlined />} </Button>
onClick={() => {}} )}
> </>
提交审核 )}
</Button>
</>
)}
>
<Descriptions
size="small"
column={3}
style={{
padding: '0 32px',
}}
> >
<Descriptions.Item label="会员类型">{123}</Descriptions.Item> <Descriptions
<Descriptions.Item label="会员角色" span={2}>{123}</Descriptions.Item> size="small"
<Descriptions.Item label="会员状态"> column={3}
<Tag color={STATUS_COLOR_MAP[1]}>{STATUS_COLOR_TXT[1]}</Tag> style={{
</Descriptions.Item> padding: '0 32px',
<Descriptions.Item label="外部状态"> }}
<Tag color={STATUS_COLOR_MAP[2]}>{STATUS_COLOR_TXT[2]}</Tag> >
</Descriptions.Item> <Descriptions.Item label="会员类型">{memberInfo?.memberTypeName}</Descriptions.Item>
</Descriptions> <Descriptions.Item label="会员角色" span={2}>{memberInfo?.roleName}</Descriptions.Item>
</PageHeader> <Descriptions.Item label="会员状态">
</> <StatusTag type={MEMBER_STATUS_TAG_MAP[memberInfo?.status]} title={memberInfo?.statusName} />
} </Descriptions.Item>
> <Descriptions.Item label="外部状态">
<div <StatusTag type={MEMBER_OUTER_STATUS_TYPE[memberInfo?.outerStatus]} title={memberInfo?.outerStatusName} />
style={{ </Descriptions.Item>
marginBottom: 24, <Descriptions.Item label="内部状态">
}} <Badge color={MEMBER_INNER_STATUS_BADGE_COLOR[memberInfo?.innerStatus]} text={memberInfo?.innerStatusName} />
</Descriptions.Item>
</Descriptions>
</PageHeader>
</>
}
> >
<AuditProcess /> <div
</div> style={{
marginBottom: 24,
}}
>
<AuditProcess
outerVerifySteps={memberInfo?.outerVerifySteps}
innerVerifySteps={memberInfo?.innerVerifySteps}
/>
</div>
<BasicInfo
basic={{
account: memberInfo?.account,
phone: memberInfo?.phone,
email: memberInfo?.email,
created: memberInfo?.registerTime,
}}
channel={{
memberType: memberInfo?.memberTypeEnum,
level: memberInfo?.channelLevelTag,
type: memberInfo?.channelTypeName,
areas: memberInfo?.areas,
desc: memberInfo?.remark,
}}
extra={memberInfo?.groups}
outerHistory={memberInfo?.outerHistory}
innerHistory={memberInfo?.innerHistory}
/>
<BasicInfo /> <Modal
</PageHeaderWrapper> title="提交审核"
visible={modalVisible}
confirmLoading={confirmLoading}
onOk={() => modalFormActions.submit()}
onCancel={() => setModalVisible(false)}
destroyOnClose
>
<NiceForm
effects={($, { setFieldState }) => {
onFieldValueChange$('agree').subscribe(fieldState => {
setFieldState('reason', state => {
state.visible = !fieldState.value;
});
});
}}
actions={modalFormActions}
schema={auditModalSchema}
onSubmit={handleSubmit}
/>
</Modal>
</PageHeaderWrapper>
</Spin>
); );
}; };
export default auditPr2; export default AuditPr2;
import React from 'react'; import React, { useState, useEffect, useRef } from 'react';
import AuditList from '../components/auditList'; import { history } from 'umi';
import { Card, Space, Button, Badge, Popconfirm } from 'antd';
import { ClockCircleOutlined } from '@ant-design/icons';
import { StandardTable } from 'god';
import { ColumnType } from 'antd/lib/table/interface';
import { createFormActions } from '@formily/antd';
import EyePreview from '@/components/EyePreview';
import NiceForm from '@/components/NiceForm';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect';
import { PublicApi } from '@/services/api';
import { auditSchema } from './schema';
import {
MEMBER_STATUS_TAG_MAP,
MEMBER_INNER_STATUS_BADGE_COLOR,
MEMBER_OUTER_STATUS_TYPE,
} from '../constant';
import { coverColFiltersItem } from '../utils';
import StatusTag from '../components/StatusTag';
const memberPr = () => { const formActions = createFormActions();
return <AuditList pageType="3" />;
const MemberPr2: React.FC<{}> = props => {
const ref = useRef<any>({});
const [searchItems, setSearchItems] = useState<any>({});
const [filteredInfo, setFilteredInfo] = useState<any>({});
const [selectedRowKeys, setSelectedRowKeys] = useState<Array<string>>([]);
const [selectedList, setSelectList] = useState<any>([]);
const handleJumpAudit = record => {
history.push(`/memberCenter/memberAbility/manage/auditPr2?id=${record.memberId}&validateId=${record.validateId}`);
};
const defaultColumns: ColumnType<any>[] = [
{
title: 'ID',
dataIndex: 'memberId',
align: 'center',
},
{
title: '会员名称',
dataIndex: 'name',
align: 'center',
render: (text: any, record: any) => (
<EyePreview
url={`/memberCenter/memberAbility/manage/auditPr2?id=${record.memberId}&validateId=${record.validateId}&preview=1`}
>
{text}
</EyePreview>
),
},
{
title: '会员类型',
dataIndex: 'memberTypeName',
align: 'center',
render: (text: any, record: any) => <span>{text}</span>,
},
{
title: '会员角色',
dataIndex: 'roleName',
align: 'center',
render: (text: any, record: any) => <span>{text}</span>,
},
{
title: '申请来源/时间',
dataIndex: 'sourceName',
align: 'center',
render: (text, record) => (
<>
<div>{text}</div>
<div>
<ClockCircleOutlined /> {record.registerTime}
</div>
</>
),
},
{
title: '会员状态',
dataIndex: 'statusName',
align: 'center',
filters: [],
onFilter: (value, record) => record.status === value,
render: (text, record) => (
<StatusTag type={MEMBER_STATUS_TAG_MAP[record.status]} title={text} />
),
},
{
title: '外部状态',
dataIndex: 'outerStatusName',
align: 'center',
filters: [],
onFilter: (value, record) => record.outerStatus === value,
render: (text, record) => (
<StatusTag type={MEMBER_OUTER_STATUS_TYPE[record.outerStatus]} title={text} />
),
},
{
title: '内部状态',
dataIndex: 'innerStatusName',
align: 'center',
filters: [],
onFilter: (value, record) => record.innerStatus === value,
render: (text, record) => <Badge color={MEMBER_INNER_STATUS_BADGE_COLOR[record.innerStatus]} text={text} />,
},
{
title: '操作',
dataIndex: 'option',
align: 'center',
render: (text: any, record: any) => (
<Button
type="link"
onClick={() => handleJumpAudit(record)}
>
审核
</Button>
),
},
];
const [columns, setColumns] = useState<any[]>(defaultColumns);
const rowSelection = {
onChange: (selectedRowKeys: any, selectedRows: any) => {
let result = selectedRows.map(v => ({
memberId: v.memberId,
validateId: v.validateId,
}));
setSelectedRowKeys(selectedRowKeys);
setSelectList(result);
},
selectedRowKeys: selectedRowKeys,
};
const fetchListData = async (params: any) => {
let res = await PublicApi.getMemberAbilityValidateStep2Page(params);
return res.data;
};
const handleBatch = () => {
console.log('批量')
};
// 初始化高级筛选选项
const fetchSearchItems = async () => {
const res = await PublicApi.getMemberAbilityValidateStep2Pageitems();
if (res.code === 1000) {
const { data = {} }: any = res;
const {
memberTypes = [],
status = [],
roles = [],
levels = [],
sources = [],
outerStatus = [],
innerStatus = [],
} = data;
const newColumns = columns.slice();
// filter 0 过滤掉全部选项
coverColFiltersItem(
newColumns,
'statusName',
status.map(item => ({ text: item.text, value: item.id })).filter(item => item.value !== 0),
);
coverColFiltersItem(
newColumns,
'outerStatusName',
outerStatus.map(item => ({ text: item.text, value: item.id })).filter(item => item.value !== 0),
);
coverColFiltersItem(
newColumns,
'innerStatusName',
innerStatus.map(item => ({ text: item.text, value: item.id })).filter(item => item.value !== 0),
);
setColumns(newColumns);
return {
memberTypeId: memberTypes.map(item => ({ label: item.memberTypeName, value: item.memberTypeId })),
status: status.map(item => ({ label: item.text, value: item.id })),
roleId: roles.map(item => ({ label: item.roleName, value: item.roleId })),
level: levels.map(item => ({ label: item.level, value: item.levelTag })),
source: sources.map(item => ({ label: item.text, value: item.id })),
};
}
return {};
};
const controllerBtns = (
<Space>
<Popconfirm
title="是否继续操作 ?"
placement="bottom"
onConfirm={handleBatch}
okText="是"
cancelText="否"
>
<Button>
批量提交审核
</Button>
</Popconfirm>
</Space>
);
return (
<Card>
<StandardTable
tableProps={{
rowKey: 'memberId',
}}
columns={columns}
currentRef={ref}
fetchTableData={(params: any) => fetchListData(params)}
rowSelection={rowSelection}
controlRender={
<NiceForm
actions={formActions}
onSubmit={values => ref.current.reload(values)}
expressionScope={{
controllerBtns,
}}
effects={($, actions) => {
useStateFilterSearchLinkageEffect(
$,
actions,
'name',
FORM_FILTER_PATH,
);
useAsyncInitSelect(
['memberTypeId', 'status', 'level', 'roleId', 'level', 'source'],
fetchSearchItems,
);
}}
schema={auditSchema}
/>
}
/>
</Card>
);
}; };
export default memberPr; export default MemberPr2;
import { ISchema } from '@formily/antd';
import { FORM_FILTER_PATH } from '@/formSchema/const';
export const auditSchema: ISchema = {
type: 'object',
properties: {
MEGA_LAYOUT: {
type: 'object',
'x-component': 'mega-layout',
properties: {
topLayout: {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
grid: true,
},
properties: {
ctl: {
type: 'object',
'x-component': 'Children',
'x-component-props': {
children: '{{controllerBtns}}',
},
},
name: {
type: 'string',
'x-component': 'Search',
'x-component-props': {
placeholder: '搜索',
},
},
},
},
[FORM_FILTER_PATH]: {
type: 'object',
'x-component': 'flex-layout',
'x-component-props': {
colStyle: {
marginLeft: 20,
},
},
properties: {
memberTypeId: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '会员类型(全部)',
allowClear: true,
},
},
status: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '会员状态(全部)',
allowClear: true,
},
},
roleId: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '会员角色(全部)',
allowClear: true,
},
},
level: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '会员等级(全部)',
allowClear: true,
},
},
source: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '申请来源(全部)',
allowClear: true,
},
},
'[startDate, endDate]': {
type: 'string',
default: '',
'x-component': 'dateSelect',
'x-component-props': {
placeholder: '时间范围(全部)',
allowClear: true,
},
},
submit: {
'x-component': 'Submit',
'x-mega-props': {
span: 1,
},
'x-component-props': {
children: '查询',
},
},
},
},
},
},
},
};
export const auditModalSchema: ISchema = {
type: 'object',
properties: {
MEGA_LAYOUT: {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
labelAlign: 'top',
},
properties: {
agree: {
type: 'string',
default: 1,
enum: [
{ label: '审核通过', value: 1 },
{ label: '审核不通过', value: 0 },
],
'x-component': 'radio',
'x-component-props': {},
},
reason: {
type: 'string',
title: '审核不通过原因',
'x-component': 'textarea',
'x-component-props': {
placeholder: '在此输入你的内容,最长120个字符,60个汉字',
maxLength: 60,
rows: 5,
},
'x-rules': [
// {
// required: true,
// message: '请填写审核不通过原因',
// }
],
},
},
},
},
};
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import { history } from 'umi'; import { history } from 'umi';
import { PageHeaderWrapper } from '@ant-design/pro-layout'; import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { PageHeader, Tag, Descriptions, Button } from 'antd'; import {
import { FormOutlined, StopOutlined } from '@ant-design/icons'; PageHeader,
import { STATUS_COLOR_MAP, STATUS_COLOR_TXT } from '../constant'; Tag,
import { usePageStatus } from '@/hooks/usePageStatus'; Descriptions,
Button,
Badge,
Spin,
Modal,
} from 'antd';
import { FormOutlined } from '@ant-design/icons';
import { usePageStatus, PageStatus } from '@/hooks/usePageStatus';
import { PublicApi } from '@/services/api'; import { PublicApi } from '@/services/api';
import MellowCard from '@/components/MellowCard'; import { GetMemberAbilityValidateStep1DetailResponse } from '@/services/MemberApi';
import { createFormActions, FormEffectHooks, FormPath } from '@formily/antd';
import NiceForm from '@/components/NiceForm';
import { MEMBER_INNER_STATUS_BADGE_COLOR, MEMBER_STATUS_TAG_MAP, MEMBER_OUTER_STATUS_TYPE } from '../constant';
import { auditModalSchema } from './schema';
import HeadInfo from '../components/HeadInfo'; import HeadInfo from '../components/HeadInfo';
import AuditProcess from '../components/AuditProcess'; import AuditProcess from '../components/AuditProcess';
import BasicInfo from '../components/BasicInfo'; import BasicInfo from '../components/BasicInfo';
import StatusTag from '../components/StatusTag';
import styles from './index.less'; import styles from './index.less';
const auditPrComfirm: React.FC<{}> = () => { interface AreaItem {
const { pageStatus, id, validateId } = usePageStatus(); name: string;
const [detailed, setDetailed] = useState<any>({}); code: string;
children: AreaItem[];
};
interface MemberInfo extends GetMemberAbilityValidateStep1DetailResponse {
channelTypeName?: string;
areasInfo?: string[];
};
useEffect(() => { const modalFormActions = createFormActions();
const {
onFieldValueChange$,
onFieldInputChange$,
} = FormEffectHooks;
const AuditPrComfirm: React.FC<{}> = () => {
const { id, validateId, pageStatus } = usePageStatus();
const [memberInfo, setMemberInfo] = useState<MemberInfo>(null);
const [modalVisible, setModalVisible] = useState(false);
const [infoLoading, setInfoLoading] = useState(false);
const [confirmLoading, setConfirmLoading] = useState(false);
const getAreasInfo = (
vals: { pcode: string, ccode: string }[] = [],
source: AreaItem[] = []
) => {
const ret = [];
vals.forEach(val => {
const { pcode, ccode } = val;
const province = source.find(item => item.code === pcode);
let str = province.name;
// 存在 市级
if (ccode && province && province.children) {
const city = province.children.find(item => item.code === ccode);
str += `/${city.name}`;
}
ret.push(str);
});
return ret;
};
const getDetailedInfo = () => {
if (id && validateId) {
setInfoLoading(true);
PublicApi.getMemberAbilityValidateConfirmDetail({
memberId: id,
validateId,
}).then(res => {
if (res.code !== 1000) {
return;
}
setMemberInfo(res.data || null);
}).finally(() => {
setInfoLoading(false);
});
}
};
useEffect(() => {
getDetailedInfo();
}, []); }, []);
// 提交审核
const handleSubmit = values => {
setConfirmLoading(true);
// 调用渠道 Form 的 submit
const promises: any = [
PublicApi.postMemberAbilityValidateConfirmSubmit({
memberId: id,
validateId: validateId,
...values,
}),
];
Promise.all(promises).then(res => {
setConfirmLoading(false);
setModalVisible(false);
setTimeout(() => {
history.goBack();
}, 1000);
}).catch(err => {
setConfirmLoading(false);
});
};
return ( return (
<PageHeaderWrapper <Spin spinning={infoLoading}>
title={ <PageHeaderWrapper
<> title={
<PageHeader <>
style={{ padding: '0' }} <PageHeader
onBack={() => history.goBack()} style={{ padding: 0 }}
title={ onBack={() => history.goBack()}
<HeadInfo title={
info={{ <HeadInfo
name: '广州市极致皮具有限公司', info={{
level: 1, name: memberInfo?.name,
}} level: 1,
/> }}
} />
extra={( }
<> extra={(
<Button <>
icon={<StopOutlined />} {pageStatus === PageStatus.EDIT && (
onClick={() => {}} <Button
> type="primary"
审核不通过 icon={<FormOutlined />}
</Button> onClick={() => setModalVisible(true)}
<Button >
type="primary" 提交审核
icon={<FormOutlined />} </Button>
onClick={() => {}} )}
> </>
审核通过 )}
</Button>
</>
)}
>
<Descriptions
size="small"
column={3}
style={{
padding: '0 32px',
}}
> >
<Descriptions.Item label="会员类型">{123}</Descriptions.Item> <Descriptions
<Descriptions.Item label="会员角色" span={2}>{123}</Descriptions.Item> size="small"
<Descriptions.Item label="会员状态"> column={3}
<Tag color={STATUS_COLOR_MAP[1]}>{STATUS_COLOR_TXT[1]}</Tag> style={{
</Descriptions.Item> padding: '0 32px',
<Descriptions.Item label="外部状态"> }}
<Tag color={STATUS_COLOR_MAP[2]}>{STATUS_COLOR_TXT[2]}</Tag> >
</Descriptions.Item> <Descriptions.Item label="会员类型">{memberInfo?.memberTypeName}</Descriptions.Item>
</Descriptions> <Descriptions.Item label="会员角色" span={2}>{memberInfo?.roleName}</Descriptions.Item>
</PageHeader> <Descriptions.Item label="会员状态">
</> <StatusTag type={MEMBER_STATUS_TAG_MAP[memberInfo?.status]} title={memberInfo?.statusName} />
} </Descriptions.Item>
> <Descriptions.Item label="外部状态">
<div <StatusTag type={MEMBER_OUTER_STATUS_TYPE[memberInfo?.outerStatus]} title={memberInfo?.outerStatusName} />
style={{ </Descriptions.Item>
marginBottom: 24, <Descriptions.Item label="内部状态">
}} <Badge color={MEMBER_INNER_STATUS_BADGE_COLOR[memberInfo?.innerStatus]} text={memberInfo?.innerStatusName} />
</Descriptions.Item>
</Descriptions>
</PageHeader>
</>
}
> >
<AuditProcess /> <div
</div> style={{
marginBottom: 24,
}}
>
<AuditProcess
outerVerifySteps={memberInfo?.outerVerifySteps}
innerVerifySteps={memberInfo?.innerVerifySteps}
/>
</div>
<BasicInfo
basic={{
account: memberInfo?.account,
phone: memberInfo?.phone,
email: memberInfo?.email,
created: memberInfo?.registerTime,
}}
channel={{
memberType: memberInfo?.memberTypeEnum,
level: memberInfo?.channelLevelTag,
type: memberInfo?.channelTypeName,
areas: memberInfo?.areas,
desc: memberInfo?.remark,
}}
extra={memberInfo?.groups}
outerHistory={memberInfo?.outerHistory}
innerHistory={memberInfo?.innerHistory}
/>
<BasicInfo /> <Modal
</PageHeaderWrapper> title="提交审核"
visible={modalVisible}
confirmLoading={confirmLoading}
onOk={() => modalFormActions.submit()}
onCancel={() => setModalVisible(false)}
destroyOnClose
>
<NiceForm
effects={($, { setFieldState }) => {
onFieldValueChange$('agree').subscribe(fieldState => {
setFieldState('reason', state => {
state.visible = !fieldState.value;
});
});
}}
actions={modalFormActions}
schema={auditModalSchema}
onSubmit={handleSubmit}
/>
</Modal>
</PageHeaderWrapper>
</Spin>
); );
}; };
export default auditPrComfirm; export default AuditPrComfirm;
import React from 'react'; import React, { useState, useEffect, useRef } from 'react';
import AuditList from '../components/auditList'; import { history } from 'umi';
import { Card, Space, Button, Badge, Popconfirm } from 'antd';
import { ClockCircleOutlined } from '@ant-design/icons';
import { StandardTable } from 'god';
import { ColumnType } from 'antd/lib/table/interface';
import { createFormActions } from '@formily/antd';
import EyePreview from '@/components/EyePreview';
import NiceForm from '@/components/NiceForm';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect';
import { PublicApi } from '@/services/api';
import { auditSchema } from './schema';
import {
MEMBER_STATUS_TAG_MAP,
MEMBER_INNER_STATUS_BADGE_COLOR,
MEMBER_OUTER_STATUS_TYPE,
} from '../constant';
import { coverColFiltersItem } from '../utils';
import StatusTag from '../components/StatusTag';
const memberPrConfirm = () => { const formActions = createFormActions();
return <AuditList pageType="4" />;
const MemberPrConfirm: React.FC<{}> = props => {
const ref = useRef<any>({});
const [searchItems, setSearchItems] = useState<any>({});
const [filteredInfo, setFilteredInfo] = useState<any>({});
const [selectedRowKeys, setSelectedRowKeys] = useState<Array<string>>([]);
const [selectedList, setSelectList] = useState<any>([]);
const handleJumpAudit = record => {
history.push(`/memberCenter/memberAbility/manage/auditPrComfirm?id=${record.memberId}&validateId=${record.validateId}`);
};
const defaultColumns: ColumnType<any>[] = [
{
title: 'ID',
dataIndex: 'memberId',
align: 'center',
},
{
title: '会员名称',
dataIndex: 'name',
align: 'center',
render: (text: any, record: any) => (
<EyePreview
url={`/memberCenter/memberAbility/manage/auditPrComfirm?id=${record.memberId}&validateId=${record.validateId}&preview=1`}
>
{text}
</EyePreview>
),
},
{
title: '会员类型',
dataIndex: 'memberTypeName',
align: 'center',
render: (text: any, record: any) => <span>{text}</span>,
},
{
title: '会员角色',
dataIndex: 'roleName',
align: 'center',
render: (text: any, record: any) => <span>{text}</span>,
},
{
title: '申请来源/时间',
dataIndex: 'sourceName',
align: 'center',
render: (text, record) => (
<>
<div>{text}</div>
<div>
<ClockCircleOutlined /> {record.registerTime}
</div>
</>
),
},
{
title: '会员状态',
dataIndex: 'statusName',
align: 'center',
filters: [],
onFilter: (value, record) => record.status === value,
render: (text, record) => (
<StatusTag type={MEMBER_STATUS_TAG_MAP[record.status]} title={text} />
),
},
{
title: '外部状态',
dataIndex: 'outerStatusName',
align: 'center',
filters: [],
onFilter: (value, record) => record.outerStatus === value,
render: (text, record) => (
<StatusTag type={MEMBER_OUTER_STATUS_TYPE[record.outerStatus]} title={text} />
),
},
{
title: '内部状态',
dataIndex: 'innerStatusName',
align: 'center',
filters: [],
onFilter: (value, record) => record.innerStatus === value,
render: (text, record) => <Badge color={MEMBER_INNER_STATUS_BADGE_COLOR[record.innerStatus]} text={text} />,
},
{
title: '操作',
dataIndex: 'option',
align: 'center',
render: (text: any, record: any) => (
<Button
type="link"
onClick={() => handleJumpAudit(record)}
>
确认审核结果
</Button>
),
},
];
const [columns, setColumns] = useState<any[]>(defaultColumns);
const rowSelection = {
onChange: (selectedRowKeys: any, selectedRows: any) => {
let result = selectedRows.map(v => ({
memberId: v.memberId,
validateId: v.validateId,
}));
setSelectedRowKeys(selectedRowKeys);
setSelectList(result);
},
selectedRowKeys: selectedRowKeys,
};
const fetchListData = async (params: any) => {
let res = await PublicApi.getMemberAbilityValidateConfirmPage(params);
return res.data;
};
const handleBatch = () => {
console.log('批量')
};
// 初始化高级筛选选项
const fetchSearchItems = async () => {
const res = await PublicApi.getMemberAbilityValidateConfirmPageitems();
if (res.code === 1000) {
const { data = {} }: any = res;
const {
memberTypes = [],
status = [],
roles = [],
levels = [],
sources = [],
outerStatus = [],
innerStatus = [],
} = data;
const newColumns = columns.slice();
// filter 0 过滤掉全部选项
coverColFiltersItem(
newColumns,
'statusName',
status.map(item => ({ text: item.text, value: item.id })).filter(item => item.value !== 0),
);
coverColFiltersItem(
newColumns,
'outerStatusName',
outerStatus.map(item => ({ text: item.text, value: item.id })).filter(item => item.value !== 0),
);
coverColFiltersItem(
newColumns,
'innerStatusName',
innerStatus.map(item => ({ text: item.text, value: item.id })).filter(item => item.value !== 0),
);
setColumns(newColumns);
return {
memberTypeId: memberTypes.map(item => ({ label: item.memberTypeName, value: item.memberTypeId })),
status: status.map(item => ({ label: item.text, value: item.id })),
roleId: roles.map(item => ({ label: item.roleName, value: item.roleId })),
level: levels.map(item => ({ label: item.level, value: item.levelTag })),
source: sources.map(item => ({ label: item.text, value: item.id })),
};
}
return {};
};
const controllerBtns = (
<Space>
<Popconfirm
title="是否继续操作 ?"
placement="bottom"
onConfirm={handleBatch}
okText="是"
cancelText="否"
>
<Button>
批量提交审核
</Button>
</Popconfirm>
</Space>
);
return (
<Card>
<StandardTable
tableProps={{
rowKey: 'memberId',
}}
columns={columns}
currentRef={ref}
fetchTableData={(params: any) => fetchListData(params)}
rowSelection={rowSelection}
controlRender={
<NiceForm
actions={formActions}
onSubmit={values => ref.current.reload(values)}
expressionScope={{
controllerBtns,
}}
effects={($, actions) => {
useStateFilterSearchLinkageEffect(
$,
actions,
'name',
FORM_FILTER_PATH,
);
useAsyncInitSelect(
['memberTypeId', 'status', 'level', 'roleId', 'level', 'source'],
fetchSearchItems,
);
}}
schema={auditSchema}
/>
}
/>
</Card>
);
}; };
export default memberPrConfirm; export default MemberPrConfirm;
import { ISchema } from '@formily/antd';
import { FORM_FILTER_PATH } from '@/formSchema/const';
export const auditSchema: ISchema = {
type: 'object',
properties: {
MEGA_LAYOUT: {
type: 'object',
'x-component': 'mega-layout',
properties: {
topLayout: {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
grid: true,
},
properties: {
ctl: {
type: 'object',
'x-component': 'Children',
'x-component-props': {
children: '{{controllerBtns}}',
},
},
name: {
type: 'string',
'x-component': 'Search',
'x-component-props': {
placeholder: '搜索',
},
},
},
},
[FORM_FILTER_PATH]: {
type: 'object',
'x-component': 'flex-layout',
'x-component-props': {
colStyle: {
marginLeft: 20,
},
},
properties: {
memberTypeId: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '会员类型(全部)',
allowClear: true,
},
},
status: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '会员状态(全部)',
allowClear: true,
},
},
roleId: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '会员角色(全部)',
allowClear: true,
},
},
level: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '会员等级(全部)',
allowClear: true,
},
},
source: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '申请来源(全部)',
allowClear: true,
},
},
'[startDate, endDate]': {
type: 'string',
default: '',
'x-component': 'dateSelect',
'x-component-props': {
placeholder: '时间范围(全部)',
allowClear: true,
},
},
submit: {
'x-component': 'Submit',
'x-mega-props': {
span: 1,
},
'x-component-props': {
children: '查询',
},
},
},
},
},
},
},
};
export const auditModalSchema: ISchema = {
type: 'object',
properties: {
MEGA_LAYOUT: {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
labelAlign: 'top',
},
properties: {
agree: {
type: 'string',
default: 1,
enum: [
{ label: '审核通过', value: 1 },
{ label: '审核不通过', value: 0 },
],
'x-component': 'radio',
'x-component-props': {},
},
reason: {
type: 'string',
title: '审核不通过原因',
'x-component': 'textarea',
'x-component-props': {
placeholder: '在此输入你的内容,最长120个字符,60个汉字',
maxLength: 60,
rows: 5,
},
'x-rules': [
// {
// required: true,
// message: '请填写审核不通过原因',
// }
],
},
},
},
},
};
...@@ -11,7 +11,7 @@ import { ...@@ -11,7 +11,7 @@ import {
Modal, Modal,
} from 'antd'; } from 'antd';
import { FormOutlined } from '@ant-design/icons'; import { FormOutlined } from '@ant-design/icons';
import { usePageStatus } from '@/hooks/usePageStatus'; import { usePageStatus, PageStatus } from '@/hooks/usePageStatus';
import { PublicApi } from '@/services/api'; import { PublicApi } from '@/services/api';
import { GetMemberAbilityValidateCommitDetailResponse } from '@/services/MemberApi'; import { GetMemberAbilityValidateCommitDetailResponse } from '@/services/MemberApi';
import { createAsyncFormActions, createFormActions, FormEffectHooks, FormPath } from '@formily/antd'; import { createAsyncFormActions, createFormActions, FormEffectHooks, FormPath } from '@formily/antd';
...@@ -41,8 +41,8 @@ const { ...@@ -41,8 +41,8 @@ const {
onFieldInputChange$, onFieldInputChange$,
} = FormEffectHooks; } = FormEffectHooks;
const auditPrSubmit: React.FC<{}> = () => { const AuditPrSubmit: React.FC<{}> = () => {
const { id, validateId, preview } = usePageStatus(); const { id, validateId, pageStatus } = usePageStatus();
const [memberInfo, setMemberInfo] = useState<MemberInfo>(null); const [memberInfo, setMemberInfo] = useState<MemberInfo>(null);
const [modalVisible, setModalVisible] = useState(false); const [modalVisible, setModalVisible] = useState(false);
const [infoLoading, setInfoLoading] = useState(false); const [infoLoading, setInfoLoading] = useState(false);
...@@ -153,6 +153,8 @@ const auditPrSubmit: React.FC<{}> = () => { ...@@ -153,6 +153,8 @@ const auditPrSubmit: React.FC<{}> = () => {
memberId: id, memberId: id,
validateId, validateId,
...rest, ...rest,
}, {
ctlType: 'none',
}); });
}; };
...@@ -160,7 +162,6 @@ const auditPrSubmit: React.FC<{}> = () => { ...@@ -160,7 +162,6 @@ const auditPrSubmit: React.FC<{}> = () => {
const handleSubmit = values => { const handleSubmit = values => {
setConfirmLoading(true); setConfirmLoading(true);
// 调用渠道 Form 的 submit // 调用渠道 Form 的 submit
formActions.submit();
const promises: any = [ const promises: any = [
formActions.submit(), formActions.submit(),
PublicApi.postMemberAbilityValidateCommitSubmit({ PublicApi.postMemberAbilityValidateCommitSubmit({
...@@ -171,6 +172,7 @@ const auditPrSubmit: React.FC<{}> = () => { ...@@ -171,6 +172,7 @@ const auditPrSubmit: React.FC<{}> = () => {
]; ];
Promise.all(promises).then(res => { Promise.all(promises).then(res => {
setConfirmLoading(false);
setModalVisible(false); setModalVisible(false);
setTimeout(() => { setTimeout(() => {
history.goBack(); history.goBack();
...@@ -180,8 +182,6 @@ const auditPrSubmit: React.FC<{}> = () => { ...@@ -180,8 +182,6 @@ const auditPrSubmit: React.FC<{}> = () => {
}); });
}; };
console.log('preview', preview)
return ( return (
<Spin spinning={infoLoading}> <Spin spinning={infoLoading}>
<PageHeaderWrapper <PageHeaderWrapper
...@@ -199,13 +199,17 @@ const auditPrSubmit: React.FC<{}> = () => { ...@@ -199,13 +199,17 @@ const auditPrSubmit: React.FC<{}> = () => {
/> />
} }
extra={( extra={(
<Button <>
type="primary" {pageStatus === PageStatus.EDIT && (
icon={<FormOutlined />} <Button
onClick={() => setModalVisible(true)} type="primary"
> icon={<FormOutlined />}
提交审核 onClick={() => setModalVisible(true)}
</Button> >
提交审核
</Button>
)}
</>
)} )}
> >
<Descriptions <Descriptions
...@@ -303,4 +307,4 @@ const auditPrSubmit: React.FC<{}> = () => { ...@@ -303,4 +307,4 @@ const auditPrSubmit: React.FC<{}> = () => {
); );
}; };
export default auditPrSubmit; export default AuditPrSubmit;
...@@ -85,20 +85,14 @@ export const auditSchema: ISchema = { ...@@ -85,20 +85,14 @@ export const auditSchema: ISchema = {
allowClear: true, allowClear: true,
}, },
}, },
timeRange: { '[startDate, endDate]': {
type: 'string', type: 'string',
default: 0, default: '',
enum: [ 'x-component': 'dateSelect',
{ label: '时间范围(全部)', value: 0 }, 'x-component-props': {
{ label: '今天', value: 1 }, placeholder: '时间范围(全部)',
{ label: '一周内', value: 2 }, allowClear: true,
{ label: '一个月内', value: 3 }, },
{ label: '三个月内', value: 4 },
{ label: '六个月内', value: 5 },
{ label: '一年内', value: 6 },
{ label: '一年前', value: 7 },
],
'x-component-props': {},
}, },
submit: { submit: {
'x-component': 'Submit', 'x-component': 'Submit',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment