Commit 63517686 authored by XieZhiXiong's avatar XieZhiXiong

关闭按钮判断条件

parent 97ac30eb
......@@ -30,6 +30,13 @@ const memberAbility =
component: '@/pages/member/memberMaintain/memberDetail',
},
{
path: '/memberAbility/manage/frozen',
name: 'maintainFrozen',
key: 'maintainFrozen',
hideInMenu: true,
component: '@/pages/member/memberMaintain/frozen',
},
{
path: '/memberAbility/manage/memberPrSubmit',
name: 'memberPrSubmit',
component: '@/pages/member/memberPrSubmit/index',
......
/*
* @Author: LeeJiancong
* @Date: 2020-08-04 15:05:52
* @LastEditors: LeeJiancong
* @LastEditTime: 2020-08-07 16:07:31
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-09-10 11:28:44
*/
import utils from '@/utils'
import menu from '../en-US/menu'
......@@ -62,6 +62,7 @@ export default {
'menu.memberAbility.memberMaintain': '会员维护',
'menu.memberAbility.addMember': '新增会员',
'menu.memberAbility.memberDetail': '会员详情',
'menu.memberAbility.maintainFrozen': '会员冻结',
'menu.memberAbility.memberPrSubmit': '待提交审核',
'menu.memberAbility.auditPrSubmit': '待提交审核详情',
'menu.memberAbility.memberPr1': '待审核(一级)',
......
import React, { useState, useEffect } from 'react';
import { history } from 'umi';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { PageHeader, Tag, Descriptions, Button, Modal, Badge, Spin } from 'antd';
import { SettingOutlined, StopOutlined } from '@ant-design/icons';
import { createFormActions, FormEffectHooks } from '@formily/antd';
import { STATUS_COLOR_MAP, STATUS_COLOR_TXT } from '../constant';
import { usePageStatus } from '@/hooks/usePageStatus';
import { PublicApi } from '@/services/api';
import { GetMemberMaintenanceDetailBasicResponse } from '@/services/MemberApi';
import {
MEMBER_STATUS_NORMAL,
MEMBER_STATUS_FROZEN,
MEMBER_OUTER_STATUS,
} from '@/constants';
import NiceForm from '@/components/NiceForm';
import { auditModalSchema } from './schema';
import {
MEMBER_STATUS_TAG_MAP,
MEMBER_INNER_STATUS_BADGE_COLOR,
MEMBER_OUTER_STATUS_TYPE,
} from '../constant';
import HeadInfo from '../components/HeadInfo';
import AuditProcess from '../components/AuditProcess';
import BasicInfo from '../components/BasicInfo';
import StatusTag from '../components/StatusTag';
import styles from './index.less';
const formActions = createFormActions();
const Frozen: React.FC<{}> = () => {
const { pageStatus, id, validateId } = usePageStatus();
const [basicInfo, setBasicInfo] = useState<GetMemberMaintenanceDetailBasicResponse>();
const [modalVisible, setModalVisible] = useState(false);
const [infoLoading, setInfoLoaading] = useState(false);
const [confirmLoading, setConfirmLoading] = useState(false);
const getBasicInfo = () => {
if (!id || !validateId) {
return;
}
setInfoLoaading(true);
PublicApi.getMemberMaintenanceDetailBasic({
memberId: id,
validateId,
}).then(res => {
if (res.code === 1000) {
setBasicInfo(res.data);
}
}).finally(() => {
setInfoLoaading(false);
});
};
useEffect(() => {
getBasicInfo();
}, []);
// 冻结与解冻
const handleSubmit = (values: { reason: string }, oldStatus) => {
setConfirmLoading(true);
return PublicApi.postMemberMaintenanceStatus({
memberId: id,
validateId: validateId,
status: oldStatus === MEMBER_STATUS_NORMAL ? MEMBER_STATUS_FROZEN : MEMBER_STATUS_NORMAL,
remark: values.reason || '',
}).then(res => {
if (res.code !== 1000) {
return;
}
setModalVisible(false);
getBasicInfo();
}).finally(() => {
setConfirmLoading(false);
});
};
return (
<Spin spinning={infoLoading}>
<PageHeaderWrapper
title={
<>
<PageHeader
style={{ padding: '0' }}
onBack={() => history.goBack()}
title={
<HeadInfo
info={{
name: basicInfo?.name,
level: 1,
}}
/>
}
extra={(
<>
{basicInfo && (
basicInfo.status === MEMBER_STATUS_NORMAL ? (
<Button
icon={<StopOutlined />}
onClick={() => setModalVisible(true)}
>
冻结
</Button>
) : (
<Button
type="primary"
icon={<SettingOutlined />}
onClick={() => setModalVisible(true)}
>
解冻
</Button>
)
)}
</>
)}
>
<Descriptions
size="small"
column={3}
style={{
padding: '0 32px',
}}
>
<Descriptions.Item label="会员类型">{basicInfo?.memberTypeName}</Descriptions.Item>
<Descriptions.Item label="会员角色" span={2}>{basicInfo?.roleName}</Descriptions.Item>
<Descriptions.Item label="会员状态">
<StatusTag type={MEMBER_STATUS_TAG_MAP[basicInfo?.status]} title={basicInfo?.statusName} />
</Descriptions.Item>
<Descriptions.Item label="外部状态">
<StatusTag type={MEMBER_OUTER_STATUS_TYPE[basicInfo?.outerStatus]} title={basicInfo?.outerStatusName} />
</Descriptions.Item>
<Descriptions.Item label="内部状态">
<Badge color={MEMBER_INNER_STATUS_BADGE_COLOR[basicInfo?.innerStatus]} text={basicInfo?.innerStatusName} />
</Descriptions.Item>
</Descriptions>
</PageHeader>
</>
}
>
<div
style={{
marginBottom: 24,
}}
>
<AuditProcess
outerVerifyCurrent={basicInfo?.currentOuterStep}
innerVerifyCurrent={basicInfo?.currentInnerStep}
outerVerifySteps={basicInfo?.outerVerifySteps}
innerVerifySteps={basicInfo?.innerVerifySteps}
/>
</div>
<BasicInfo
basic={{
account: basicInfo?.account,
phone: basicInfo?.phone,
email: basicInfo?.email,
created: basicInfo?.createTime,
}}
channel={{
memberType: basicInfo?.memberTypeEnum,
level: basicInfo?.channelLevelTag,
type: basicInfo?.channelTypeName,
areas: basicInfo?.areas,
desc: basicInfo?.remark,
}}
extra={basicInfo?.groups}
outerHistory={basicInfo?.outerHistory}
innerHistory={basicInfo?.innerHistory}
/>
<Modal
title={basicInfo ? basicInfo.status === MEMBER_STATUS_NORMAL ? '会员冻结' : '会员解冻' : ''}
visible={modalVisible}
confirmLoading={confirmLoading}
onOk={() => formActions.submit()}
onCancel={() => setModalVisible(false)}
destroyOnClose
>
<NiceForm
previewPlaceholder="' '"
effects={($, { setFieldState }) => {
FormEffectHooks.onFieldInit$('reason').subscribe(state => {
setFieldState('reason', fieldState => {
fieldState.props.title = basicInfo ? `会员${basicInfo.status === MEMBER_STATUS_NORMAL ? '冻结' : '解冻'}原因` : '';
});
});
}}
actions={formActions}
schema={auditModalSchema}
onSubmit={value => handleSubmit(value, basicInfo.status)}
/>
</Modal>
</PageHeaderWrapper>
</Spin>
);
};
export default Frozen;
import React, { ReactNode, useState, useRef } from 'react';
import { history } from 'umi';
import { history, Link } from 'umi';
import {
Card,
Space,
......@@ -8,7 +8,8 @@ import {
Popconfirm,
Dropdown,
Badge,
Modal,
Modal,
message,
} from 'antd';
import {
PlusOutlined,
......@@ -25,23 +26,49 @@ import UploadModal from '@/components/UploadModal';
import NiceForm from '@/components/NiceForm';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { importSchema, auditModalSchema } from './schema';
import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect';
import { PublicApi } from '@/services/api';
import {
MEMBER_STATUS_NORMAL,
MEMBER_INNER_STATUS_SUCCESS,
MEMBER_OUTER_STATUS_SUCCESS,
MEMBER_OUTER_STATUS_UNCOMMITTED,
MEMBER_OUTER_STATUS_FAILED,
} from '@/constants';
import { importSchema, auditModalSchema } 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 formActions = createFormActions();
const fetchData = async (params: any) => {
let res = await PublicApi.getMemberMaintenancePage(params);
return res.data;
};
const memberMaintain: React.FC<[]> = () => {
const ref = useRef<any>({});
const [selectedRowKeys, setSelectedRowKeys] = useState<Array<string>>([]);
const [visibleModal, setVisibleModal] = useState(false);
const [modalVisible, setModalVisible] = useState(false);
const [currentItem, setCurrentItem] = useState<any>({});
const fetchData = async (params: any) => {
let res = await PublicApi.getMemberMaintenancePage(params);
return res.data;
};
const handleDelete = (memberId: number, validateId: number) => {
const mesInstance = message.loading('功能暂时没有,敬请期待');
// PublicApi.postMemberAbilitySubDelete({
// memberId,
// validateId,
// }).then(res => {
// if (res.code !== 1000) {
// return;
// }
// ref.current.reload();
// }).finally(() => {
// mesInstance();
// });
};
const defaultColumns: ColumnType<any>[] = [
{
......@@ -99,90 +126,85 @@ const memberMaintain: React.FC<[]> = () => {
title: '会员状态',
dataIndex: 'statusName',
align: 'center',
key: 'statusName',
filters: [],
// filteredValue: searchForm.memberStatus || ['0'],
filterMultiple: false,
render: (text: any, record: any) => (
<StatusSwitch
handleConfirm={() => handleModify(record)}
record={record}
fieldNames="status"
/>
onFilter: (value, record) => record.status === value,
render: (text, record) => (
<StatusTag type={MEMBER_STATUS_TAG_MAP[record.status]} title={text} />
),
},
{
title: '外部状态',
dataIndex: 'outerStatusName',
align: 'center',
key: 'outerStatus',
filters: [],
// filteredValue: searchForm.outerStatus || ['0'],
filterMultiple: false,
render: (text: any, record: any) => <span>{text}</span>,
onFilter: (value, record) => record.outerStatus === value,
render: (text, record) => (
<StatusTag type={MEMBER_OUTER_STATUS_TYPE[record.outerStatus]} title={text} />
),
},
{
title: '内部状态',
dataIndex: 'innerStatusName',
align: 'center',
key: 'innerStatus',
filters: [],
// filteredValue: searchForm.innerStatus || ['0'],
filterMultiple: false,
render: (text: any, record: any) => <Badge color="#FFC400" text={text} />,
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) => {
let component: ReactNode = null;
component = (
<>
{record.innerStatusName === '审核通过' ? (
render: (text: any, record: any) => (
<>
{(
record.innerStatus === MEMBER_INNER_STATUS_SUCCESS &&
record.outerStatus === MEMBER_OUTER_STATUS_SUCCESS
) && (
<Link to={`/memberAbility/manage/frozen?id=${record.memberId}&validateId=${record.validateId}`}>
<Button
type="link"
>
{record.status === MEMBER_STATUS_NORMAL ? '冻结' : '解冻'}
</Button>
</Link>
)}
{/* 外部审核状态等于 待提交 或者 审核失败 可进行编辑操作 */}
{(
record.outerStatus === MEMBER_OUTER_STATUS_UNCOMMITTED ||
record.outerStatus === MEMBER_OUTER_STATUS_FAILED
) && (
<>
<Button
type="link"
onClick={() => {
setCurrentItem(record), setModalVisible(true);
}}
style={{ color: '#00B37A' }}
onClick={() =>
history.push(`/memberAbility/manage/addMember?id=${record.memberId}&validateId=${record.validateId}`)
}
>
{record.status === 1 ? '解冻' : '冻结'}
编辑
</Button>
) : (
''
)}
{record.outerStatusName === '待审核' ? (
<>
<Button
type="link"
onClick={() =>
history.push('/memberAbility/manage/addMember?type=change')
}
>
编辑
</Button>
<Popconfirm title="确定要删除吗?" okText="是" cancelText="否">
<Button type="link">删除</Button>
</Popconfirm>
</>
) : (
''
)}
</>
);
return component;
},
</>
)}
{/* 外部审核状态不等于 审核通过 可进行删除操作 */}
{record.outerStatus !== MEMBER_OUTER_STATUS_SUCCESS && (
<Popconfirm
title="确定要删除吗?"
okText="是"
cancelText="否"
onConfirm={() => handleDelete(record.memberId, record.validateId)}
>
<Button
type="link"
danger
>
删除
</Button>
</Popconfirm>
)}
</>
),
},
];
const rowSelection = {
onChange: (selectedRowKeys: any, selectedRows: any) => {
setSelectedRowKeys(selectedRowKeys);
},
selectedRowKeys: selectedRowKeys,
};
const menu = (
<Menu onClick={e => handleMenuClick(e)}>
<Menu.Item key="1" icon={<DeleteOutlined />}>
......@@ -193,53 +215,58 @@ const memberMaintain: React.FC<[]> = () => {
const [columns, setColumns] = useState<any[]>(defaultColumns);
// 更改会员状态
const handleModify = record => {
PublicApi.postMemberMaintenanceStatus({
memberId: record.memberId,
validateId: record.validateId,
status: record.status === 1 ? 0 : 1,
}).then(res => {
if (res.code === 1000) return ref.current.reload();
});
};
// 冻结与解冻
const handleSubmit = (values: any, type?: string) => {
if (!type) {
PublicApi.postMemberMaintenanceStatus({
memberId: currentItem.memberId,
validateId: currentItem.validateId,
status: currentItem.status,
remark: values.remark,
}).then(res => {
if (res.code === 1000) {
ref.current.reload();
setModalVisible(false);
}
});
} else {
setModalVisible(false);
}
};
const handleMenuClick = (e: any) => {
console.log('menu', e);
};
// 初始化高级筛选选项
const fetchSelectOptions = async () => {
const { data } = await PublicApi.getMemberValidateCommitPageitems();
return {
memberType: fetchFilterOptions(data.memberTypes),
roleId: fetchFilterOptions(data.memberRoles),
level: fetchFilterOptions(data.memberLevels),
source: fetchFilterOptions(data.memberSource),
};
};
const res = await PublicApi.getMemberMaintenancePageitems();
if (res.code === 1000) {
const { data = {} }: any = res;
const {
innerStatus = [],
outerStatus = [],
status = [],
memberTypes = [],
memberRoles = [],
memberLevels = [],
sources = [],
} = data;
const newColumns = columns.slice();
const fetchFilterOptions = data => {
return data.map(v => ({ label: v.text, value: v.id }));
// 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 {
memberType: memberTypes.map(item => ({ label: item.memberTypeName, value: item.memberTypeId })),
roleId: memberRoles.map(item => ({ label: item.roleName, value: item.roleId })),
level: memberLevels.map(item => ({ label: item.levelTag, value: item.level })),
source: sources.map(item => ({ label: item.text, value: item.id })),
innerStatus: innerStatus.map(item => ({ label: item.text, value: item.id })),
outerStatus: outerStatus.map(item => ({ label: item.text, value: item.id })),
status: status.map(item => ({ label: item.text, value: item.id })),
};
}
return {};
};
const controllerBtns = (
......@@ -267,12 +294,10 @@ const memberMaintain: React.FC<[]> = () => {
<StandardTable
tableProps={{
rowKey: 'memberId',
// onChange: (pagination: any, filter: any) => handleSearch(filter),
}}
columns={columns}
currentRef={ref}
fetchTableData={(params: any) => fetchData(params)}
rowSelection={rowSelection}
controlRender={
<NiceForm
actions={formActions}
......@@ -284,11 +309,11 @@ const memberMaintain: React.FC<[]> = () => {
useStateFilterSearchLinkageEffect(
$,
actions,
'cond',
'name',
FORM_FILTER_PATH,
);
useAsyncInitSelect(
['memberType', 'roleId', 'level', 'source'],
['memberType', 'roleId', 'level', 'source', 'innerStatus', 'outerStatus', 'status'],
fetchSelectOptions,
);
}}
......@@ -296,27 +321,7 @@ const memberMaintain: React.FC<[]> = () => {
/>
}
/>
<Modal
title={currentItem.status === 1 ? '会员解冻' : '会员冻结'}
visible={modalVisible}
onOk={() => formActions.submit()}
onCancel={() => handleSubmit(false, 'cancel')}
destroyOnClose
>
<NiceForm
previewPlaceholder="loading..."
effects={($, { setFieldState }) => {
FormEffectHooks.onFieldValueChange$('agree').subscribe(state => {
setFieldState('reason', targetState => {
targetState.visible = state.value != 1;
});
});
}}
onSubmit={handleSubmit}
actions={formActions}
schema={auditModalSchema(currentItem)}
/>
</Modal>
<UploadModal
visibleModal={visibleModal}
fileText="会员资料"
......
......@@ -22,7 +22,7 @@ export const importSchema: ISchema = {
children: '{{controllerBtns}}',
},
},
cond: {
name: {
type: 'string',
'x-component': 'Search',
'x-component-props': {
......@@ -35,9 +35,6 @@ export const importSchema: ISchema = {
type: 'object',
'x-component': 'flex-layout',
'x-component-props': {
rowStyle: {
flexWrap: 'nowrap',
},
colStyle: {
marginLeft: 20,
},
......@@ -45,42 +42,75 @@ export const importSchema: ISchema = {
properties: {
memberType: {
type: 'string',
default: 0,
default: undefined,
enum: [],
'x-component-props': {},
'x-component-props': {
placeholder: '会员类型(全部)',
allowClear: true,
},
},
roleId: {
type: 'string',
default: 0,
default: undefined,
enum: [],
'x-component-props': {},
'x-component-props': {
placeholder: '会员角色(全部)',
allowClear: true,
},
},
level: {
type: 'string',
default: 0,
default: undefined,
enum: [],
'x-component-props': {},
'x-component-props': {
placeholder: '会员等级(全部)',
allowClear: true,
},
},
source: {
type: 'string',
default: 0,
default: undefined,
enum: [],
'x-component-props': {
placeholder: '申请来源(全部)',
allowClear: true,
},
},
innerStatus: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {},
'x-component-props': {
placeholder: '内部状态(全部)',
allowClear: true,
},
},
timeRange: {
outerStatus: {
type: 'string',
default: 0,
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 },
],
'x-component-props': {},
default: undefined,
enum: [],
'x-component-props': {
placeholder: '外部状态(全部)',
allowClear: true,
},
},
status: {
type: 'string',
enum: [],
default: undefined,
'x-component-props': {
placeholder: '会员状态(全部)',
allowClear: true,
},
},
'[startDate, endDate]': {
type: 'string',
default: '',
'x-component': 'dateSelect',
'x-component-props': {
placeholder: '时间范围(全部)',
allowClear: true,
},
},
submit: {
'x-component': 'Submit',
......@@ -98,32 +128,30 @@ export const importSchema: ISchema = {
},
};
export const auditModalSchema = props => {
let modalSchema: ISchema = {
type: 'object',
properties: {
MEGA_LAYOUT: {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
labelAlign: 'top',
},
properties: {
remark: {
type: 'string',
title: `会员${props.status === 1 ? '解冻' : '冻结'}原因`,
'x-component': 'textarea',
'x-component-props': {
placeholder: '在此输入你的内容,最长120个字符,60个汉字',
maxLength: 60,
},
'x-rules': [{ required: true, message: '请填写审核不通过原因' }],
export const auditModalSchema: ISchema = {
type: 'object',
properties: {
MEGA_LAYOUT: {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
labelAlign: 'top',
},
properties: {
reason: {
type: 'string',
title: '会员解冻原因',
'x-component': 'textarea',
'x-component-props': {
placeholder: '在此输入你的内容,最长120个字符,60个汉字',
maxLength: 60,
rows: 5,
},
'x-rules': [{ required: true, message: '请填写原因' }],
},
},
},
};
return modalSchema;
},
};
const getCompnentValue = (elements: any) => {
......
......@@ -115,14 +115,12 @@ const MemberPrConfirm: React.FC<{}> = props => {
align: 'center',
render: (text: any, record: any) => (
<>
{record.innerStatus !== MEMBER_INNER_STATUS_SUCCESS && (
<Button
type="link"
onClick={() => handleJumpAudit(record)}
>
确认审核结果
</Button>
)}
<Button
type="link"
onClick={() => handleJumpAudit(record)}
>
确认审核结果
</Button>
</>
),
},
......
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