Commit eff98be5 authored by 卢均锐's avatar 卢均锐

Merge branch 'dev-srm' of http://10.0.0.22:3000/lingxi/lingxi-business-paltform into dev-srm

* 'dev-srm' of http://10.0.0.22:3000/lingxi/lingxi-business-paltform: chore: 删除 会员审核 相关路由 chore: 删除按钮 feat: 调整 会员信息查询 相关 feat: 对接 待确认会员信息变更 相关 feat: 对接 待审核会员信息变更(二级) 相关 chore: 删除不需要的检索条件 feat: 对接 待审核会员信息变更(一级) 相关 chore: 修改类型声明 feat: 对接 会员信息 相关 chore: 修改 批量审核逻辑 chore: 完善代码逻辑 feat: 对接 确认会员入库 相关 feat: 对接 待会员入库审核二级 相关 feat: 对接 待会员入库审核一级 相关 feat: 新增常量 chore: 完善样式
parents 3b56b47d 39f20347
This diff is collapsed.
......@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2021-05-18 18:30:50
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-05-19 11:53:24
* @LastEditTime: 2021-06-04 13:48:09
* @Description: 内、外部流传记录
*/
import React, { useEffect, useState } from 'react';
......@@ -49,19 +49,19 @@ interface IProps extends MellowCardProps {
/**
* 外部流转记录列数据
*/
outerColumns: EditableColumns[],
outerColumns?: EditableColumns[],
/**
* 内部流转记录列数据
*/
innerColumns: EditableColumns[],
innerColumns?: EditableColumns[],
/**
* 外部 rowkey
*/
outerRowkey: string | (<T = unknown>(record: T, index?: number) => string),
outerRowkey?: string | (<T = unknown>(record: T, index?: number) => string),
/**
* 内部 rowkey
*/
innerRowkey: string | (<T = unknown>(record: T, index?: number) => string),
innerRowkey?: string | (<T = unknown>(record: T, index?: number) => string),
/**
* 获取外部流转记录方法,与 outerDataSource 不能共存
* 如果两个同时存在 outerDataSource 优先
......
@import '../../global/styles/utils.less';
.renderFileContainer {
display: flex;
flex-direction: column;
......@@ -25,10 +27,22 @@
justify-content: space-between;
align-items: center;
.img {
width: 16px;
height: 16px;
margin-right: @margin-sm;
.fileItem-left {
display: flex;
align-items: center;
flex: 1;
overflow: hidden;
.img {
width: 16px;
height: 16px;
margin-right: @margin-sm;
}
> a {
flex: 1;
.textOverflow();
}
}
}
// &:hover {
......
......@@ -100,9 +100,9 @@ const UploadFiles: React.FC<PickUploadProps> = (props: PickUploadProps) => {
)
}
<div className={styles.renderFileItem} >
<div>
<div className={styles['fileItem-left']}>
<img className={styles.img} src={pdf_icon} />
<span>{_item.name}</span>
<a href={_item.url} target="_blank">{_item.name}</a>
</div>
{
!disable && (
......
......@@ -152,8 +152,74 @@ export const VIP_RULE_COMMENT = 3;
/**
* 服务提供者
*/
export const MEMBER_ROLE_TYPE_SERVICE_PROVIDER = 1;
/**
* 服务消费者
*/
export const MEMBER_ROLE_TYPE_SERVICE_CONSUMER = 2;
export const MEMBER_ROLE_TYPE_SERVICE_PROVIDER = 1;
/**
* 服务消费者
*/
export const MEMBER_ROLE_TYPE_SERVICE_CONSUMER = 2;
/* --------------------------------- 发票类型 -------------------------------- */
/**
* 增值税专用发票
*/
export const MEMBER_INVOICE_TYPE_1 = 1;
/**
* 普通发票
*/
export const MEMBER_INVOICE_TYPE_2 = 2;
/**
* 机动车专用发票
*/
export const MEMBER_INVOICE_TYPE_3 = 3;
/**
* 机打发票
*/
export const MEMBER_INVOICE_TYPE_4 = 4;
/**
* 定额发票
*/
export const MEMBER_INVOICE_TYPE_5 = 5;
/**
* 会员等级类型枚举对应中文
*/
export const MEMBER_INVOICE_TYPE = {
[MEMBER_INVOICE_TYPE_1]: '增值税专用发票',
[MEMBER_INVOICE_TYPE_2]: '普通发票',
[MEMBER_INVOICE_TYPE_3]: '机动车专用发票',
[MEMBER_INVOICE_TYPE_4]: '机打发票',
[MEMBER_INVOICE_TYPE_5]: '定额发票',
};
/* --------------------------------- 税点 -------------------------------- */
/**
* 17%
*/
export const MEMBER_TAX_POINT_1 = 17;
/**
* 11%
*/
export const MEMBER_TAX_POINT_2 = 11;
/**
* 6%
*/
export const MEMBER_TAX_POINT_3 = 6;
/**
* 3%
*/
export const MEMBER_TAX_POINT_4 = 3;
/**
* 0%
*/
export const MEMBER_TAX_POINT_5 = 0;
/**
* 会员等级类型枚举对应中文
*/
export const MEMBER_TAX_POINT = {
[MEMBER_TAX_POINT_1]: '17%',
[MEMBER_TAX_POINT_2]: '11%',
[MEMBER_TAX_POINT_3]: '6%',
[MEMBER_TAX_POINT_4]: '3%',
[MEMBER_TAX_POINT_5]: '0%',
};
......@@ -275,6 +275,7 @@
}
.ant-descriptions-item-label {
flex-shrink: 0;
color: #909399 !important;
}
......
......@@ -87,13 +87,6 @@ export default {
'menu.memberAbility.memberManage.memberImportDetail': '查看会员导入',
'menu.memberAbility.memberManage.memberMaintain': '会员信息',
'menu.memberAbility.memberManage.maintianDetail': '会员详情',
// 'menu.memberAbility.memberManage.memberPrSubmit': '待提交审核',
// 'menu.memberAbility.memberManage.memberPrSubmitDetail': '待提交审核详情',
// 'menu.memberAbility.memberManage.memberPr1': '待审核(一级)',
// 'menu.memberAbility.memberManage.memberPr1Detail': '待审核详情(一级)',
// 'menu.memberAbility.memberManage.memberPr2': '待审核(二级)',
// 'menu.memberAbility.memberManage.memberPr2Detail': '待审核详情(二级)',
// 'menu.memberAbility.memberManage.memberPrConfirm': '待确认审核',
'menu.memberAbility.memberManage.memberPrConfirmDetail': '待确认审核详情',
'menu.memberAbility.memberManage.memberPrVerifyComingData': '待审核入库资料',
'menu.memberAbility.memberManage.memberPrVerifyComingDataDetail': '待审核入库资料详情',
......@@ -130,16 +123,20 @@ export default {
'menu.memberAbility.memberManage.maintainDetail.levelInfo': '会员等级信息',
'menu.memberAbility.memberManage.maintainDetail.equityInfo': '权益信息',
'menu.memberAbility.memberManage.maintainDetail.sincerityInfo': '诚信信息',
'menu.memberAbility.memberManage.maintainFrozen': '会员冻结与解除',
'menu.memberAbility.memberQuery': '会员信息查询',
'menu.memberAbility.memberQueryDetail': '会员信息详情',
'menu.memberAbility.memberQueryDetail.basicInfo': '会员基本信息',
'menu.memberAbility.memberQueryDetail.levelInfo': '会员等级信息',
'menu.memberAbility.memberQueryDetail.equityInfo': '权益信息',
'menu.memberAbility.memberQueryDetail.sincerityInfo': '诚信信息',
'menu.memberAbility.memberUpdate': '变更会员信息',
'menu.memberAbility.addSubRole': '新建会员角色',
'menu.memberAbility.applyMember': '申请会员',
'menu.memberAbility.memberManage.maintainFreeze': '会员冻结',
'menu.memberAbility.memberManage.maintainUnfreeze': '会员解除',
'menu.memberAbility.memberManage.maintainEliminate': '解除关系',
'menu.memberAbility.memberManage.maintainBlack': '加入黑名单',
'menu.memberAbility.memberProfile.memberQuery': '会员信息查询',
'menu.memberAbility.memberProfile.memberQueryDetail': '会员信息详情',
'menu.memberAbility.memberProfile.memberQueryDetail.basicInfo': '会员基本信息',
'menu.memberAbility.memberProfile.memberQueryDetail.levelInfo': '会员等级信息',
'menu.memberAbility.memberProfile.memberQueryDetail.equityInfo': '权益信息',
'menu.memberAbility.memberProfile.memberQueryDetail.sincerityInfo': '诚信信息',
'menu.memberAbility.memberProfile.memberUpdate': '修改注册信息',
'menu.memberAbility.memberProfile.addSubRole': '新建会员角色',
'menu.memberAbility.memberProfile.modifyMember': '变更会员信息',
'menu.memberAbility.memberProfile.applyMember': '申请会员',
'menu.memberAbility.memberRuleConfiguration': '会员规则配置',
'menu.memberAbility.memberRuleConfiguration.memberLevel': '会员等级',
'menu.memberAbility.memberRuleConfiguration.memberLevelEdit': '会员权益设置',
......
......@@ -87,7 +87,7 @@ const TopBar: React.FC<TopBarPropsType> = (props) => {
</Link>
</div>
<div className={styles.nav_list_item}>
<Link to="/memberCenter/memberAbility/query">
<Link to="/memberCenter/memberAbility/profile/query">
<img src={memberInfoIcon} />
<span>会员信息</span>
</Link>
......@@ -99,7 +99,7 @@ const TopBar: React.FC<TopBarPropsType> = (props) => {
</Link>
</div>
<div className={styles.nav_list_item}>
<Link to="/memberCenter/memberAbility/query">
<Link to="/memberCenter/memberAbility/profile/query">
<img src={memberBenefitsIcon} />
<span>会员权益</span>
</Link>
......
......@@ -73,7 +73,7 @@ const columns = (target = '/memberCenter/memberAbility/manage/memberPrSubmit/det
title: '内部状态',
dataIndex: 'innerStatusName',
align: 'center',
render: (text, record) => <Badge color={MEMBER_INNER_STATUS_BADGE_COLOR[record.innerStatus]} text={text} />,
render: (text, record) => <Badge color={MEMBER_INNER_STATUS_BADGE_COLOR[record.innerStatus] || '#606266'} text={text} />,
},
]);
......
......@@ -24,10 +24,7 @@ const verifyComingSchema: ISchema = {
properties: {
ctl: {
type: 'object',
'x-component': 'Children',
'x-component-props': {
children: '{{controllerBtns}}',
},
'x-component': 'ControllerBtns',
},
name: {
type: 'string',
......@@ -72,18 +69,6 @@ const verifyComingSchema: ISchema = {
},
},
},
source: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '申请来源(全部)',
allowClear: true,
style: {
width: 160,
},
},
},
submit: {
'x-component': 'Submit',
'x-mega-props': {
......
......@@ -12,29 +12,77 @@ import {
import CustomizeColumn, { IProps as CustomizeColumnProps } from '@/components/CustomizeColumn';
import styles from './index.less';
interface IProps extends Omit<CustomizeColumnProps, 'data' | 'columns'> {}
interface IProps extends Omit<CustomizeColumnProps, 'data' | 'columns'> {
/**
* 数据源
*/
dataSource: {
/**
* 会员编码
*/
code: string,
/**
* 合作关系名称
*/
partnerTypeName: string,
/**
* 单次合作金额
*/
maxAmount: string,
/**
* 适用区域
*/
classifyAreas: string[],
/**
* 主营品类
*/
categories: {
/**
* 数据id
*/
id: number,
/**
* 品类名称
*/
name: string,
/**
* 付款周期(天)
*/
paymentDay: number,
/**
* 发票类型名称
*/
invoiceTypeName: string,
/**
* 税点,百分比的分子部分
*/
taxPoint: string,
}[],
}
}
const MemberDocCategory: React.FC<IProps> = (props: IProps) => {
const {
dataSource,
...rest
} = props;
const data = [
{
title: '会员编号',
value: 'GD00001',
value: dataSource?.code || '',
},
{
title: '单次合作金额',
value: '¥ 900,000.00',
value: dataSource && dataSource.maxAmount ? ${dataSource.maxAmount}` : '',
},
{
title: '适用区域',
value: '广东省/广州市;江西省',
value: dataSource && dataSource.classifyAreas ? dataSource.classifyAreas.join(';') : '',
},
{
title: '会员关系',
value: '战略型',
value: dataSource?.partnerTypeName || '',
columnProps: {
span: 3,
},
......@@ -43,22 +91,16 @@ const MemberDocCategory: React.FC<IProps> = (props: IProps) => {
title: '主营品类',
value: (
<ul className={styles['category-list']}>
<li className={styles['category-list-item']}>
<Descriptions column={1}>
<Descriptions.Item label="品类">广告行业</Descriptions.Item>
<Descriptions.Item label="付款周期(天)">30</Descriptions.Item>
<Descriptions.Item label="发票类型">增值税专用发票</Descriptions.Item>
<Descriptions.Item label="税点">30%</Descriptions.Item>
</Descriptions>
</li>
<li className={styles['category-list-item']}>
<Descriptions column={1}>
<Descriptions.Item label="品类">广告行业</Descriptions.Item>
<Descriptions.Item label="付款周期(天)">30</Descriptions.Item>
<Descriptions.Item label="发票类型">增值税专用发票</Descriptions.Item>
<Descriptions.Item label="税点">30%</Descriptions.Item>
</Descriptions>
</li>
{dataSource?.categories.map((item) => (
<li className={styles['category-list-item']} key={item.id}>
<Descriptions column={1}>
<Descriptions.Item label="品类">{item.name}</Descriptions.Item>
<Descriptions.Item label="付款周期(天)">{item.paymentDay}</Descriptions.Item>
<Descriptions.Item label="发票类型">{item.invoiceTypeName}</Descriptions.Item>
<Descriptions.Item label="税点">{item.taxPoint}%</Descriptions.Item>
</Descriptions>
</li>
))}
</ul>
),
columnProps: {
......
......@@ -2,104 +2,73 @@
* @Author: XieZhiXiong
* @Date: 2021-05-21 17:14:39
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-05-26 11:19:51
* @LastEditTime: 2021-06-03 10:34:49
* @Description: 会员入库信息
*/
import React from 'react';
import { Tooltip } from 'antd';
import CustomizeColumn, { IProps as CustomizeColumnProps } from '@/components/CustomizeColumn';
import CustomizeColumn, { IProps as CustomizeColumnProps, DataItem } from '@/components/CustomizeColumn';
import styles from './index.less';
interface IProps extends Omit<CustomizeColumnProps, 'data' | 'columns'> {}
interface IProps extends Omit<CustomizeColumnProps, 'data' | 'columns'> {
/**
* 数据
*/
dataSource: {
/**
* 分组名
*/
groupName: string,
/**
*
*/
elements: {
/**
* 分组内的字段顺序
*/
fieldOrder?: number,
/**
* 字段中文名称
*/
fieldLocalName?: string,
/**
* 字段值
*/
fieldValue?: string,
/**
* 修改之前的值,如果没有为空字符串
*/
lastValue?: string,
}[],
}[],
}
const MemberDocIncomingInfo: React.FC<IProps> = (props: IProps) => {
const {
dataSource = [],
...rest
} = props;
const data = [
{
title: '商业模式',
value: (
<div className={styles.changed}>
生产商
<Tooltip title={`变更前:${'加工商'}`}>
<span className={styles.new}>NEW</span>
</Tooltip>
</div>
),
},
{
title: '工厂数量',
value: (
<div className={styles.changed}>
3
<Tooltip title={`变更前:${'加工商'}`}>
<span className={styles.new}>NEW</span>
</Tooltip>
</div>
),
},
{
title: '主要合作伙伴',
value: (
<div className={styles.changed}>
安踏
<Tooltip title={`变更前:${'Nike'}`}>
<span className={styles.new}>NEW</span>
</Tooltip>
</div>
),
},
{
title: '主营行业',
value: '制造行业;批发和零售业',
},
{
title: '生产厂地',
value: '中国浙江省温州市',
},
{
title: '代表性合作项目',
value: '安踏',
},
{
title: '主营品类',
value: '服装鞋帽;纸质批发;农副产品',
},
{
title: '设备数量',
value: '100',
},
{
title: '代理品牌',
value: '安踏',
},
{
title: '公司规模',
value: '中小企业',
},
{
title: '是否一般纳税人',
value: '是',
},
{
title: '优势资源',
value: '安踏',
},
{
title: '工厂面积',
value: '500平方米',
},
{
title: '公司简介',
value: '一家集研发、生产、销售和服务于一体的专业标牌生产厂家。注册资金…',
},
{
title: '其他',
value: '安踏',
},
];
const data: DataItem[] = [];
dataSource.forEach((item) => {
item.elements.forEach((ele) => {
data.push({
title: ele.fieldLocalName,
value: (
<div className={styles.changed}>
{ele.fieldValue}
{ele.lastValue && (
<Tooltip title={`变更前:${ele.lastValue}`}>
<span className={styles.new}>NEW</span>
</Tooltip>
)}
</div>
),
});
});
});
return (
<CustomizeColumn
title="入库信息"
......
......@@ -27,6 +27,7 @@
transform: translate(-50%, 0);
color: @text-color-secondary;
font-size: @font-size-sm;
white-space: nowrap;
> span {
color: @text-color;
......
......@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2021-05-25 14:59:38
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-05-25 15:38:37
* @LastEditTime: 2021-06-03 11:09:46
* @Description: 会员考察信息
*/
import React from 'react';
......@@ -13,16 +13,76 @@ import {
Progress,
Upload,
} from 'antd';
import { normalizeFiledata } from '@/utils';
import MellowCard, { MellowCardProps } from '@/components/MellowCard';
import UploadFiles from '@/components/UploadFiles/UploadFiles';
import styles from './index.less';
interface IProps extends MellowCardProps {}
interface IProps extends MellowCardProps {
/**
* 数据
*/
dataSource: {
/**
* 考察日期
*/
inspectDay: string,
/**
* 考察评分
*/
score: string,
/**
* 考察结果
*/
result: string,
/**
* 考察结果
*/
reports: {
/**
* 文件名
*/
name: string,
/**
* 文件Url
*/
url: string,
}[],
},
}
const MemberInvestigateInfo: React.FC<IProps> = (props: IProps) => {
const {
dataSource,
...rest
} = props;
const strokeColor = (score: string) => {
const numScore = +score;
if (numScore >= 0 && numScore <= 39) {
return {
'0%': '#D32F2F',
'100%': '#F18E8E',
};
}
if (40 >= 0 && numScore <= 59) {
return {
'0%': '#EA8000',
'100%': '#EBBD86',
};
}
if (60 >= 0 && numScore <= 79) {
return {
'0%': '#2266EE',
'100%': '#83A5E8',
};
}
return {
'0%': '#00B37A',
'100%': '#82DFC1',
};
};
return (
<MellowCard
title="考察信息"
......@@ -38,15 +98,12 @@ const MemberInvestigateInfo: React.FC<IProps> = (props: IProps) => {
type="dashboard"
percent={100}
gapDegree={150}
strokeColor={{
'0%': '#00B37A',
'100%': '#82DFC1',
}}
strokeColor={strokeColor(dataSource?.score)}
width={80}
showInfo={false}
/>
<div className={styles['investigate-info-progress-text']}>
<span>80</span>
<span>{dataSource?.score}</span>
</div>
</div>
......@@ -56,17 +113,20 @@ const MemberInvestigateInfo: React.FC<IProps> = (props: IProps) => {
<Col span={8}>
<Descriptions column={1}>
<Descriptions.Item label="考察日期" labelStyle={{ width: 106 }}>
2020-02-19
{dataSource?.inspectDay}
</Descriptions.Item>
<Descriptions.Item label="考察结果" labelStyle={{ width: 106 }} style={{ paddingBottom: 0 }}>
入库考察合格
{dataSource?.result}
</Descriptions.Item>
</Descriptions>
</Col>
<Col span={8}>
<Descriptions column={1}>
<Descriptions.Item label="考察报告" labelStyle={{ width: 106 }}>
<Upload fileList={[]} />
<UploadFiles
fileList={dataSource && dataSource.reports ? dataSource.reports.map((item) => normalizeFiledata(item.url)) : []}
disable
/>
</Descriptions.Item>
</Descriptions>
</Col>
......
......@@ -93,7 +93,6 @@ const MemberRoleFormItem = (props) => {
};
const handleConfirm = () => {
console.log('RowCtlRowCtlRowCtl', RowCtl);
if (!RowCtl.selectRow.length) {
message.warning('请选择会员角色');
}
......
......@@ -248,7 +248,7 @@ const MemberMaintain: React.FC<[]> = () => {
return {};
};
const controllerBtns = (
const ControllerBtns = () => (
<>
{/* {(userInfo && userInfo.memberRoleType === MEMBER_ROLE_TYPE_SERVICE_PROVIDER) && (
<Space>
......@@ -306,8 +306,8 @@ const MemberMaintain: React.FC<[]> = () => {
<NiceForm
actions={formActions}
onSubmit={values => ref.current.reload(values)}
expressionScope={{
controllerBtns,
components={{
ControllerBtns,
}}
effects={($, actions) => {
useStateFilterSearchLinkageEffect(
......
......@@ -17,10 +17,7 @@ export const importSchema: ISchema = {
properties: {
ctl: {
type: 'object',
'x-component': 'Children',
'x-component-props': {
children: '{{controllerBtns}}',
},
'x-component': 'ControllerBtns',
},
name: {
type: 'string',
......
/*
* @Author: XieZhiXiong
* @Date: 2021-06-04 10:39:42
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-06-04 10:47:51
* @Description:
*/
import { ISchema } from '@formily/antd';
export const blockedModalSchema: ISchema = {
type: 'object',
properties: {
MEGA_LAYOUT: {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
labelAlign: 'top',
},
properties: {
date: {
type: 'string',
title: '进入黑名单日期',
'x-component': 'DatePicker',
'x-component-props': {
placeholder: '请选择',
style: {
width: '100%',
},
},
'x-rules': [
{
required: true,
message: '请选择进入黑名单日期',
},
],
},
reason: {
type: 'string',
title: '进入黑名单原因',
'x-component': 'Textarea',
'x-component-props': {
placeholder: '在此输入你的内容,最长120个字符,60个汉字',
maxLength: 60,
rows: 5,
},
'x-rules': [
{
required: true,
message: '请填写原因',
},
{
limitByte: true, // 自定义校验规则
maxByte: 120,
}
],
},
},
},
},
};
/*
* @Author: XieZhiXiong
* @Date: 2021-06-04 10:36:43
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-06-04 10:53:48
* @Description: 会员整改详情
*/
import React, { useState, useEffect } from 'react';
import {
Button,
Modal,
Row,
Col,
Spin,
Tooltip,
Space,
} from 'antd';
import { history } from 'umi';
import { StopOutlined, QuestionCircleOutlined } from '@ant-design/icons';
import { createFormActions } from '@formily/antd';
import {
DatePicker,
} from '@formily/antd-components'
import { usePageStatus } from '@/hooks/usePageStatus';
import { PublicApi } from '@/services/api';
import { GetMemberAbilityMaintenanceDetailResponse } from '@/services/MemberV2Api';
import {
MEMBER_TYPE_CHANNEL_CORPORATE,
MEMBER_TYPE_CHANNEL_INDIVIDUAL,
} from '@/constants/member';
import AnchorPage from '@/layouts/AnchorPage';
import AvatarWrap from '@/components/AvatarWrap';
import LevelBrand from '@/components/LevelBrand';
import FlowRecords from '@/components/FlowRecords';
import CustomizeColumn from '@/components/CustomizeColumn';
import NiceForm from '@/components/NiceForm';
import { unfriendModalSchema } from './schema';
import {
MEMBER_OUTER_COLUMNS,
MEMBER_INNER_COLUMNS,
} from '../../constant';
import MemberBasicInfo from '../../components/MemberBasicInfo';
import MemberChannelInfo from '../../components/MemberChannelInfo';
import PicWrap from '../../components/PicWrap';
type ValueType = {
/**
* 日期
*/
date: string,
/**
* 理由
*/
reason: string,
}
const formActions = createFormActions();
const MemberMaintainCorrect: React.FC<{}> = () => {
const { validateId } = usePageStatus();
const [memberInfo, setMemberInfo] = useState<GetMemberAbilityMaintenanceDetailResponse>(null);
const [infoLoading, setInfoLoaading] = useState(false);
const [confirmLoading, setConfirmLoading] = useState(false);
const [unfriendModalVisible, setUnfriendModalVisible] = useState(false);
const getBasicInfo = () => {
if (!validateId) {
return;
}
setInfoLoaading(true);
PublicApi.getMemberAbilityMaintenanceDetail({
validateId,
}).then(res => {
if (res.code === 1000) {
setMemberInfo(res.data);
}
}).finally(() => {
setInfoLoaading(false);
});
};
useEffect(() => {
getBasicInfo();
}, []);
const handleSubmit = (values: ValueType) => {
setConfirmLoading(true);
return PublicApi.postMemberAbilityMaintenanceEliminate({
validateId: validateId,
...values,
}).then(res => {
if (res.code !== 1000) {
return;
}
setUnfriendModalVisible(false);
setTimeout(() => {
history.goBack();
}, 800);
}).finally(() => {
setConfirmLoading(false);
});
};
const anchorsArr = [
{
key: 'basicInfo',
name: '基本信息',
},
(
memberInfo?.memberTypeEnum === MEMBER_TYPE_CHANNEL_CORPORATE
|| memberInfo?.memberTypeEnum === MEMBER_TYPE_CHANNEL_INDIVIDUAL
? {
key: 'channelInfo',
name: '渠道信息',
}
: null
),
...(
memberInfo && memberInfo.groups
? memberInfo.groups.map((item, index) => ({
key: `group${index}`,
name: item.groupName,
}))
: []
),
{
key: 'flowRecords',
name: '流转记录',
},
].filter(Boolean);
return (
<Spin spinning={infoLoading}>
<AnchorPage
title={(
<AvatarWrap
info={{
name: memberInfo?.name,
}}
extra={(
<LevelBrand level={2} />
)}
/>
)}
anchors={anchorsArr}
extra={(
<Space size={16}>
<Button
icon={<StopOutlined />}
onClick={() => setUnfriendModalVisible(true)}
>
解除关系
</Button>
</Space>
)}
>
<Row gutter={[16, 16]}>
{/* 基本信息 */}
<Col span={24}>
<MemberBasicInfo
dataSource={{
memberId: memberInfo?.memberId,
memberTypeName: memberInfo?.memberTypeName,
account: memberInfo?.account,
name: memberInfo?.name,
roleName: memberInfo?.roleName,
phone: memberInfo?.phone,
outerStatus: memberInfo?.outerStatus,
outerStatusName: memberInfo?.outerStatusName,
levelTag: memberInfo?.levelTag,
email: memberInfo?.email,
createTime: memberInfo?.registerTime,
}}
id="basicInfo"
/>
</Col>
{/* 渠道信息 */}
{
memberInfo?.memberTypeEnum === MEMBER_TYPE_CHANNEL_CORPORATE
|| memberInfo?.memberTypeEnum === MEMBER_TYPE_CHANNEL_INDIVIDUAL
? (
<Col span={24}>
<MemberChannelInfo
dataSource={{
level: memberInfo?.channelLevelTag,
type: memberInfo?.channelTypeName,
areas: memberInfo?.areas,
desc: memberInfo?.remark,
}}
id="channelInfo"
/>
</Col>
)
: null
}
{/* 其他注册信息 */}
{
memberInfo && memberInfo.groups
? memberInfo.groups.map((item, index) => (
<Col span={24} key={`group${index}`}>
<CustomizeColumn
title={item.groupName}
data={(
item.elements.map((ele) => ({
title: ele.fieldLocalName,
value: (
ele.fieldType !== 'upload'
? ele.fieldValue
: (
<PicWrap
pics={[ele.fieldValue]}
/>
)
),
}))
)}
id={`group${index}`}
/>
</Col>
))
: null
}
{/* 流转记录 */}
<Col span={24}>
<FlowRecords
outerColumns={MEMBER_OUTER_COLUMNS}
innerColumns={MEMBER_INNER_COLUMNS}
outerRowkey="id"
innerRowkey="id"
outerDataSource={memberInfo?.outerHistory}
id="flowRecords"
/>
</Col>
</Row>
</AnchorPage>
{/* 解除关系相关 */}
<Modal
title={(
<div>
会员关系解除
<Tooltip title="解除当前会员关系,不在享用会员权益;可重新申请会员关系">
<QuestionCircleOutlined
style={{ marginLeft: 8 }}
/>
</Tooltip>
</div>
)}
visible={unfriendModalVisible}
confirmLoading={confirmLoading}
onOk={() => formActions.submit()}
onCancel={() => setUnfriendModalVisible(false)}
destroyOnClose
>
<NiceForm
previewPlaceholder="' '"
components={{
DatePicker,
}}
effects={() => {
}}
actions={formActions}
schema={unfriendModalSchema}
onSubmit={handleSubmit}
/>
</Modal>
</Spin>
);
};
export default MemberMaintainCorrect;
/*
* @Author: XieZhiXiong
* @Date: 2021-06-04 10:39:42
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-06-04 10:47:51
* @Description:
*/
import { ISchema } from '@formily/antd';
export const unfriendModalSchema: ISchema = {
type: 'object',
properties: {
MEGA_LAYOUT: {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
labelAlign: 'top',
},
properties: {
date: {
type: 'string',
title: '解除日期',
'x-component': 'DatePicker',
'x-component-props': {
placeholder: '请选择',
style: {
width: '100%',
},
},
'x-rules': [
{
required: true,
message: '请选择解除日期',
},
],
},
reason: {
type: 'string',
title: '解除原因',
'x-component': 'Textarea',
'x-component-props': {
placeholder: '在此输入你的内容,最长120个字符,60个汉字',
maxLength: 60,
rows: 5,
},
'x-rules': [
{
required: true,
message: '请填写原因',
},
{
limitByte: true, // 自定义校验规则
maxByte: 120,
}
],
},
},
},
},
};
\ No newline at end of file
/*
* @Author: XieZhiXiong
* @Date: 2021-06-04 10:36:43
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-06-04 10:56:09
* @Description: 解除关系
*/
import React, { useState, useEffect } from 'react';
import {
Button,
Modal,
Row,
Col,
Spin,
Tooltip,
Space,
} from 'antd';
import { history } from 'umi';
import { StopOutlined, QuestionCircleOutlined } from '@ant-design/icons';
import { createFormActions } from '@formily/antd';
import {
DatePicker,
} from '@formily/antd-components'
import { usePageStatus } from '@/hooks/usePageStatus';
import { PublicApi } from '@/services/api';
import { GetMemberAbilityMaintenanceDetailResponse } from '@/services/MemberV2Api';
import {
MEMBER_TYPE_CHANNEL_CORPORATE,
MEMBER_TYPE_CHANNEL_INDIVIDUAL,
} from '@/constants/member';
import AnchorPage from '@/layouts/AnchorPage';
import AvatarWrap from '@/components/AvatarWrap';
import LevelBrand from '@/components/LevelBrand';
import FlowRecords from '@/components/FlowRecords';
import CustomizeColumn from '@/components/CustomizeColumn';
import NiceForm from '@/components/NiceForm';
import { unfriendModalSchema } from './schema';
import {
MEMBER_OUTER_COLUMNS,
MEMBER_INNER_COLUMNS,
} from '../../constant';
import MemberBasicInfo from '../../components/MemberBasicInfo';
import MemberChannelInfo from '../../components/MemberChannelInfo';
import PicWrap from '../../components/PicWrap';
type ValueType = {
/**
* 日期
*/
date: string,
/**
* 理由
*/
reason: string,
}
const formActions = createFormActions();
const MemberMaintainEliminate: React.FC<{}> = () => {
const { validateId } = usePageStatus();
const [memberInfo, setMemberInfo] = useState<GetMemberAbilityMaintenanceDetailResponse>(null);
const [infoLoading, setInfoLoaading] = useState(false);
const [confirmLoading, setConfirmLoading] = useState(false);
const [unfriendModalVisible, setUnfriendModalVisible] = useState(false);
const getBasicInfo = () => {
if (!validateId) {
return;
}
setInfoLoaading(true);
PublicApi.getMemberAbilityMaintenanceDetail({
validateId,
}).then(res => {
if (res.code === 1000) {
setMemberInfo(res.data);
}
}).finally(() => {
setInfoLoaading(false);
});
};
useEffect(() => {
getBasicInfo();
}, []);
const handleSubmit = (values: ValueType) => {
setConfirmLoading(true);
return PublicApi.postMemberAbilityMaintenanceEliminate({
validateId: validateId,
...values,
}).then(res => {
if (res.code !== 1000) {
return;
}
setUnfriendModalVisible(false);
setTimeout(() => {
history.goBack();
}, 800);
}).finally(() => {
setConfirmLoading(false);
});
};
const anchorsArr = [
{
key: 'basicInfo',
name: '基本信息',
},
(
memberInfo?.memberTypeEnum === MEMBER_TYPE_CHANNEL_CORPORATE
|| memberInfo?.memberTypeEnum === MEMBER_TYPE_CHANNEL_INDIVIDUAL
? {
key: 'channelInfo',
name: '渠道信息',
}
: null
),
...(
memberInfo && memberInfo.groups
? memberInfo.groups.map((item, index) => ({
key: `group${index}`,
name: item.groupName,
}))
: []
),
{
key: 'flowRecords',
name: '流转记录',
},
].filter(Boolean);
return (
<Spin spinning={infoLoading}>
<AnchorPage
title={(
<AvatarWrap
info={{
name: memberInfo?.name,
}}
extra={(
<LevelBrand level={2} />
)}
/>
)}
anchors={anchorsArr}
extra={(
<Space size={16}>
<Button
icon={<StopOutlined />}
onClick={() => setUnfriendModalVisible(true)}
>
解除关系
</Button>
</Space>
)}
>
<Row gutter={[16, 16]}>
{/* 基本信息 */}
<Col span={24}>
<MemberBasicInfo
dataSource={{
memberId: memberInfo?.memberId,
memberTypeName: memberInfo?.memberTypeName,
account: memberInfo?.account,
name: memberInfo?.name,
roleName: memberInfo?.roleName,
phone: memberInfo?.phone,
outerStatus: memberInfo?.outerStatus,
outerStatusName: memberInfo?.outerStatusName,
levelTag: memberInfo?.levelTag,
email: memberInfo?.email,
createTime: memberInfo?.registerTime,
}}
id="basicInfo"
/>
</Col>
{/* 渠道信息 */}
{
memberInfo?.memberTypeEnum === MEMBER_TYPE_CHANNEL_CORPORATE
|| memberInfo?.memberTypeEnum === MEMBER_TYPE_CHANNEL_INDIVIDUAL
? (
<Col span={24}>
<MemberChannelInfo
dataSource={{
level: memberInfo?.channelLevelTag,
type: memberInfo?.channelTypeName,
areas: memberInfo?.areas,
desc: memberInfo?.remark,
}}
id="channelInfo"
/>
</Col>
)
: null
}
{/* 其他注册信息 */}
{
memberInfo && memberInfo.groups
? memberInfo.groups.map((item, index) => (
<Col span={24} key={`group${index}`}>
<CustomizeColumn
title={item.groupName}
data={(
item.elements.map((ele) => ({
title: ele.fieldLocalName,
value: (
ele.fieldType !== 'upload'
? ele.fieldValue
: (
<PicWrap
pics={[ele.fieldValue]}
/>
)
),
}))
)}
id={`group${index}`}
/>
</Col>
))
: null
}
{/* 流转记录 */}
<Col span={24}>
<FlowRecords
outerColumns={MEMBER_OUTER_COLUMNS}
innerColumns={MEMBER_INNER_COLUMNS}
outerRowkey="id"
innerRowkey="id"
outerDataSource={memberInfo?.outerHistory}
id="flowRecords"
/>
</Col>
</Row>
</AnchorPage>
{/* 解除关系相关 */}
<Modal
title={(
<div>
会员关系解除
<Tooltip title="解除当前会员关系,不在享用会员权益;可重新申请会员关系">
<QuestionCircleOutlined
style={{ marginLeft: 8 }}
/>
</Tooltip>
</div>
)}
visible={unfriendModalVisible}
confirmLoading={confirmLoading}
onOk={() => formActions.submit()}
onCancel={() => setUnfriendModalVisible(false)}
destroyOnClose
>
<NiceForm
previewPlaceholder="' '"
components={{
DatePicker,
}}
effects={() => {
}}
actions={formActions}
schema={unfriendModalSchema}
onSubmit={handleSubmit}
/>
</Modal>
</Spin>
);
};
export default MemberMaintainEliminate;
/*
* @Author: XieZhiXiong
* @Date: 2021-06-04 10:39:42
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-06-04 10:47:51
* @Description:
*/
import { ISchema } from '@formily/antd';
export const unfriendModalSchema: ISchema = {
type: 'object',
properties: {
MEGA_LAYOUT: {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
labelAlign: 'top',
},
properties: {
date: {
type: 'string',
title: '解除日期',
'x-component': 'DatePicker',
'x-component-props': {
placeholder: '请选择',
style: {
width: '100%',
},
},
'x-rules': [
{
required: true,
message: '请选择解除日期',
},
],
},
reason: {
type: 'string',
title: '解除原因',
'x-component': 'Textarea',
'x-component-props': {
placeholder: '在此输入你的内容,最长120个字符,60个汉字',
maxLength: 60,
rows: 5,
},
'x-rules': [
{
required: true,
message: '请填写原因',
},
{
limitByte: true, // 自定义校验规则
maxByte: 120,
}
],
},
},
},
},
};
\ No newline at end of file
/*
* @Author: XieZhiXiong
* @Date: 2021-06-04 11:31:48
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-06-04 11:42:18
* @Description: 会员冻结
*/
import React, { useState, useEffect } from 'react';
import {
Button,
Modal,
Row,
Col,
Spin,
} from 'antd';
import { history } from 'umi';
import { StopOutlined } from '@ant-design/icons';
import {
createFormActions,
FormEffectHooks,
} from '@formily/antd';
import { usePageStatus } from '@/hooks/usePageStatus';
import { PublicApi } from '@/services/api';
import { GetMemberAbilityMaintenanceDetailResponse } from '@/services/MemberV2Api';
import {
MEMBER_TYPE_CHANNEL_CORPORATE,
MEMBER_TYPE_CHANNEL_INDIVIDUAL,
} from '@/constants/member';
import AnchorPage from '@/layouts/AnchorPage';
import AvatarWrap from '@/components/AvatarWrap';
import LevelBrand from '@/components/LevelBrand';
import FlowRecords from '@/components/FlowRecords';
import CustomizeColumn from '@/components/CustomizeColumn';
import NiceForm from '@/components/NiceForm';
import { freezeSchema } from './schema';
import {
MEMBER_OUTER_COLUMNS,
MEMBER_INNER_COLUMNS,
} from '../../constant';
import MemberBasicInfo from '../../components/MemberBasicInfo';
import MemberChannelInfo from '../../components/MemberChannelInfo';
import PicWrap from '../../components/PicWrap';
type ValueType = {
/**
* 理由
*/
reason: string,
}
const formActions = createFormActions();
const MemberFrozen: React.FC<{}> = () => {
const { validateId } = usePageStatus();
const [memberInfo, setMemberInfo] = useState<GetMemberAbilityMaintenanceDetailResponse>(null);
const [modalVisible, setModalVisible] = useState(false);
const [infoLoading, setInfoLoaading] = useState(false);
const [confirmLoading, setConfirmLoading] = useState(false);
const getBasicInfo = () => {
if (!validateId) {
return;
}
setInfoLoaading(true);
PublicApi.getMemberAbilityMaintenanceDetail({
validateId,
}).then(res => {
if (res.code === 1000) {
setMemberInfo(res.data);
}
}).finally(() => {
setInfoLoaading(false);
});
};
useEffect(() => {
getBasicInfo();
}, []);
// 冻结与解冻
const handleSubmit = (values: ValueType) => {
setConfirmLoading(true);
return PublicApi.postMemberAbilityMaintenanceFreeze({
validateId: validateId,
status: 2,
reason: values.reason || '',
}).then(res => {
if (res.code !== 1000) {
return;
}
setModalVisible(false);
setTimeout(() => {
history.goBack();
}, 800);
}).finally(() => {
setConfirmLoading(false);
});
};
const anchorsArr = [
{
key: 'verifySteps',
name: '流转进度',
},
{
key: 'basicInfo',
name: '基本信息',
},
(
memberInfo?.memberTypeEnum === MEMBER_TYPE_CHANNEL_CORPORATE
|| memberInfo?.memberTypeEnum === MEMBER_TYPE_CHANNEL_INDIVIDUAL
? {
key: 'channelInfo',
name: '渠道信息',
}
: null
),
...(
memberInfo && memberInfo.groups
? memberInfo.groups.map((item, index) => ({
key: `group${index}`,
name: item.groupName,
}))
: []
),
{
key: 'flowRecords',
name: '流转记录',
},
].filter(Boolean);
return (
<Spin spinning={infoLoading}>
<AnchorPage
title={(
<AvatarWrap
info={{
name: memberInfo?.name,
}}
extra={(
<LevelBrand level={2} />
)}
/>
)}
anchors={anchorsArr}
extra={(
<Button
icon={<StopOutlined />}
onClick={() => setModalVisible(true)}
>
冻结
</Button>
)}
>
<Row gutter={[16, 16]}>
{/* 基本信息 */}
<Col span={24}>
<MemberBasicInfo
dataSource={{
memberId: memberInfo?.memberId,
memberTypeName: memberInfo?.memberTypeName,
account: memberInfo?.account,
name: memberInfo?.name,
roleName: memberInfo?.roleName,
phone: memberInfo?.phone,
outerStatus: memberInfo?.outerStatus,
outerStatusName: memberInfo?.outerStatusName,
levelTag: memberInfo?.levelTag,
email: memberInfo?.email,
createTime: memberInfo?.registerTime,
}}
id="basicInfo"
/>
</Col>
{/* 渠道信息 */}
{
memberInfo?.memberTypeEnum === MEMBER_TYPE_CHANNEL_CORPORATE
|| memberInfo?.memberTypeEnum === MEMBER_TYPE_CHANNEL_INDIVIDUAL
? (
<Col span={24}>
<MemberChannelInfo
dataSource={{
level: memberInfo?.channelLevelTag,
type: memberInfo?.channelTypeName,
areas: memberInfo?.areas,
desc: memberInfo?.remark,
}}
id="channelInfo"
/>
</Col>
)
: null
}
{/* 其他注册信息 */}
{
memberInfo && memberInfo.groups
? memberInfo.groups.map((item, index) => (
<Col span={24} key={`group${index}`}>
<CustomizeColumn
title={item.groupName}
data={(
item.elements.map((ele) => ({
title: ele.fieldLocalName,
value: (
ele.fieldType !== 'upload'
? ele.fieldValue
: (
<PicWrap
pics={[ele.fieldValue]}
/>
)
),
}))
)}
id={`group${index}`}
/>
</Col>
))
: null
}
{/* 流转记录 */}
<Col span={24}>
<FlowRecords
outerColumns={MEMBER_OUTER_COLUMNS}
innerColumns={MEMBER_INNER_COLUMNS}
outerRowkey="id"
innerRowkey="id"
outerDataSource={memberInfo?.outerHistory}
id="flowRecords"
/>
</Col>
</Row>
{/* 冻结相关 */}
<Modal
title="会员冻结"
visible={modalVisible}
confirmLoading={confirmLoading}
onOk={() => formActions.submit()}
onCancel={() => setModalVisible(false)}
destroyOnClose
>
<NiceForm
previewPlaceholder="' '"
effects={($, { setFieldState }) => {
FormEffectHooks.onFieldInit$('reason').subscribe(() => {
setFieldState('reason', fieldState => {
fieldState.props.title = '会员冻结原因';
});
});
}}
actions={formActions}
schema={freezeSchema}
onSubmit={handleSubmit}
/>
</Modal>
</AnchorPage>
</Spin>
);
};
export default MemberFrozen;
/*
* @Author: XieZhiXiong
* @Date: 2021-06-04 11:27:42
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-06-04 11:27:43
* @Description:
*/
import { ISchema } from '@formily/antd';
export const freezeSchema: 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: '请填写原因',
},
{
limitByte: true, // 自定义校验规则
maxByte: 120,
}
],
},
},
},
},
};
\ No newline at end of file
import React, { useState, useRef } from 'react';
import React, { useRef } from 'react';
import { Link } from 'umi';
import {
Card,
......@@ -8,7 +8,7 @@ import {
import { StandardTable } from 'god';
import moment from 'moment';
import { ColumnType } from 'antd/lib/table/interface';
import { createFormActions, FormEffectHooks } from '@formily/antd';
import { createFormActions } from '@formily/antd';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect';
import { FORM_FILTER_PATH } from '@/formSchema/const';
......@@ -17,18 +17,13 @@ import NiceForm from '@/components/NiceForm';
import LevelBrand from '@/components/LevelBrand';
import StatusTag from '../components/StatusTag';
import { PublicApi } from '@/services/api';
import {
MEMBER_STATUS_NORMAL,
MEMBER_INNER_STATUS_SUCCESS,
MEMBER_OUTER_STATUS_SUCCESS,
} from '@/constants/member';
import { maintianSchema } from './schema';
import useSpliceArray from '@/hooks/useSpliceArray';
import { querySchema } from './schema';
import {
MEMBER_STATUS_TAG_MAP,
MEMBER_INNER_STATUS_BADGE_COLOR,
MEMBER_OUTER_STATUS_TYPE,
} from '../constant';
import { coverColFiltersItem } from '../utils';
import styles from './index.less';
const formActions = createFormActions();
......@@ -120,23 +115,56 @@ const MemberMaintain: React.FC<[]> = () => {
filters: [],
align: 'center',
onFilter: (value, record) => record.innerStatus === value,
render: (text, record) => <Badge color={MEMBER_INNER_STATUS_BADGE_COLOR[record.innerStatus]} text={text} />,
render: (text, record) => <Badge color={MEMBER_INNER_STATUS_BADGE_COLOR[record.innerStatus] || '#606266'} text={text} />,
},
{
title: '操作',
dataIndex: 'option',
align: 'center',
render: (text, record) => (
render: (_, record) => (
<>
{(
record.innerStatus === MEMBER_INNER_STATUS_SUCCESS &&
record.outerStatus === MEMBER_OUTER_STATUS_SUCCESS
) && (
<Link to={`/memberCenter/memberAbility/manage/maintain/frozen?id=${record.memberId}&validateId=${record.validateId}`}>
{record.showFreeze && (
<Link to={`/memberCenter/memberAbility/manage/maintain/freeze?validateId=${record.validateId}`}>
<Button
type="link"
>
冻结
</Button>
</Link>
)}
{record.showUnfreeze && (
<Link to={`/memberCenter/memberAbility/manage/maintain/unfreeze?validateId=${record.validateId}`}>
<Button
type="link"
>
解冻
</Button>
</Link>
)}
{record.showCorrect && (
<Link to={`/memberCenter/memberAbility/memberRectification/rectificationAdd/add?validateId=${record.validateId}`}>
<Button
type="link"
>
整改
</Button>
</Link>
)}
{record.showEliminate && (
<Link to={`/memberCenter/memberAbility/manage/maintain/eliminate?validateId=${record.validateId}`}>
<Button
type="link"
>
{record.status === MEMBER_STATUS_NORMAL ? '冻结' : '解冻'}
淘汰
</Button>
</Link>
)}
{record.showBlacklist && (
<Link to={`/memberCenter/memberAbility/manage/maintain/black?validateId=${record.validateId}`}>
<Button
type="link"
>
黑名单
</Button>
</Link>
)}
......@@ -145,18 +173,7 @@ 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 [columns, columnsHandle] = useSpliceArray<ColumnType<any>>(defaultColumns);
// 初始化高级筛选选项
const fetchSelectOptions = async () => {
......@@ -174,26 +191,28 @@ const MemberMaintain: React.FC<[]> = () => {
sources = [],
} = 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);
const statusIndex = columns.findIndex((item) => item.dataIndex === 'statusName');
const outerIndex = columns.findIndex((item) => item.dataIndex === 'outerStatusName');
const innerIndex = columns.findIndex((item) => item.dataIndex === 'innerStatusName');
if (statusIndex) {
columnsHandle.replace(statusIndex, {
...columns[statusIndex],
filters: status.map(item => ({ text: item.text, value: item.id })).filter(item => item.value !== 0),
});
}
if (outerIndex) {
columnsHandle.replace(outerIndex, {
...columns[outerIndex],
filters: outerStatus.map(item => ({ text: item.text, value: item.id })).filter(item => item.value !== 0),
});
}
if (innerIndex) {
columnsHandle.replace(innerIndex, {
...columns[innerIndex],
filters: innerStatus.map(item => ({ text: item.text, value: item.id })).filter(item => item.value !== 0),
});
}
return {
memberTypeId: memberTypes.map(item => ({ label: item.memberTypeName, value: item.memberTypeId })),
......@@ -233,7 +252,7 @@ const MemberMaintain: React.FC<[]> = () => {
fetchSelectOptions,
);
}}
schema={maintianSchema}
schema={querySchema}
/>
}
/>
......
/*
* @Author: XieZhiXiong
* @Date: 2021-01-08 16:27:19
* @Date: 2021-06-04 11:49:18
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-01-08 16:35:11
* @LastEditTime: 2021-06-04 11:49:18
* @Description:
*/
import { ISchema } from '@formily/antd';
import { FORM_FILTER_PATH } from '@/formSchema/const';
export const auditSchema: ISchema = {
export const querySchema: ISchema = {
type: 'object',
properties: {
MEGA_LAYOUT: {
megaLayout: {
type: 'object',
'x-component': 'mega-layout',
properties: {
topLayout: {
type: 'object',
'x-component': 'mega-layout',
name: {
type: 'string',
'x-component': 'Search',
'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: '搜索',
tip: '输入 会员名称 进行搜索',
},
},
placeholder: '搜索',
align: 'flex-left',
tip: '输入 会员名称 进行搜索',
},
},
[FORM_FILTER_PATH]: {
type: 'object',
'x-component': 'flex-layout',
'x-component': 'mega-layout',
'x-component-props': {
colStyle: {
marginLeft: 20,
},
grid: true,
full: true,
autoRow: true,
columns: 6,
},
properties: {
memberTypeId: {
......@@ -55,21 +41,6 @@ export const auditSchema: ISchema = {
'x-component-props': {
placeholder: '会员类型(全部)',
allowClear: true,
style: {
width: 160,
},
},
},
status: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '会员状态(全部)',
allowClear: true,
style: {
width: 160,
},
},
},
roleId: {
......@@ -79,9 +50,6 @@ export const auditSchema: ISchema = {
'x-component-props': {
placeholder: '会员角色(全部)',
allowClear: true,
style: {
width: 160,
},
},
},
level: {
......@@ -91,9 +59,6 @@ export const auditSchema: ISchema = {
'x-component-props': {
placeholder: '会员等级(全部)',
allowClear: true,
style: {
width: 160,
},
},
},
source: {
......@@ -103,9 +68,6 @@ export const auditSchema: ISchema = {
'x-component-props': {
placeholder: '申请来源(全部)',
allowClear: true,
style: {
width: 160,
},
},
},
innerStatus: {
......@@ -115,9 +77,24 @@ export const auditSchema: ISchema = {
'x-component-props': {
placeholder: '内部状态(全部)',
allowClear: true,
style: {
width: 160,
},
},
},
outerStatus: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '外部状态(全部)',
allowClear: true,
},
},
status: {
type: 'string',
enum: [],
default: undefined,
'x-component-props': {
placeholder: '会员状态(全部)',
allowClear: true,
},
},
'[startDate, endDate]': {
......@@ -127,9 +104,6 @@ export const auditSchema: ISchema = {
'x-component-props': {
placeholder: '时间范围(全部)',
allowClear: true,
style: {
width: 160,
},
},
},
submit: {
......@@ -146,4 +120,4 @@ export const auditSchema: ISchema = {
},
},
},
};
\ No newline at end of file
};
This diff is collapsed.
/*
* @Author: XieZhiXiong
* @Date: 2021-06-04 10:36:43
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-06-04 11:40:54
* @Description: 解除解冻
*/
import React, { useState, useEffect } from 'react';
import {
Button,
Modal,
Row,
Col,
Spin,
} from 'antd';
import { history } from 'umi';
import { StopOutlined } from '@ant-design/icons';
import {
createFormActions,
FormEffectHooks,
} from '@formily/antd';
import { usePageStatus } from '@/hooks/usePageStatus';
import { PublicApi } from '@/services/api';
import { GetMemberAbilityMaintenanceDetailResponse } from '@/services/MemberV2Api';
import {
MEMBER_TYPE_CHANNEL_CORPORATE,
MEMBER_TYPE_CHANNEL_INDIVIDUAL,
} from '@/constants/member';
import AnchorPage from '@/layouts/AnchorPage';
import AvatarWrap from '@/components/AvatarWrap';
import LevelBrand from '@/components/LevelBrand';
import FlowRecords from '@/components/FlowRecords';
import CustomizeColumn from '@/components/CustomizeColumn';
import NiceForm from '@/components/NiceForm';
import { freezeSchema } from '../freeze/schema';
import {
MEMBER_OUTER_COLUMNS,
MEMBER_INNER_COLUMNS,
} from '../../constant';
import MemberBasicInfo from '../../components/MemberBasicInfo';
import MemberChannelInfo from '../../components/MemberChannelInfo';
import PicWrap from '../../components/PicWrap';
type ValueType = {
/**
* 理由
*/
reason: string,
}
const formActions = createFormActions();
const MemberMaintainUnfreeze: React.FC<{}> = () => {
const { validateId } = usePageStatus();
const [memberInfo, setMemberInfo] = useState<GetMemberAbilityMaintenanceDetailResponse>(null);
const [modalVisible, setModalVisible] = useState(false);
const [infoLoading, setInfoLoaading] = useState(false);
const [confirmLoading, setConfirmLoading] = useState(false);
const getBasicInfo = () => {
if (!validateId) {
return;
}
setInfoLoaading(true);
PublicApi.getMemberAbilityMaintenanceDetail({
validateId,
}).then(res => {
if (res.code === 1000) {
setMemberInfo(res.data);
}
}).finally(() => {
setInfoLoaading(false);
});
};
useEffect(() => {
getBasicInfo();
}, []);
// 解冻与解冻
const handleSubmit = (values: ValueType) => {
setConfirmLoading(true);
return PublicApi.postMemberAbilityMaintenanceFreeze({
validateId: validateId,
status: 1,
reason: values.reason || '',
}).then(res => {
if (res.code !== 1000) {
return;
}
setModalVisible(false);
setTimeout(() => {
history.goBack();
}, 800);
}).finally(() => {
setConfirmLoading(false);
});
};
const anchorsArr = [
{
key: 'verifySteps',
name: '流转进度',
},
{
key: 'basicInfo',
name: '基本信息',
},
(
memberInfo?.memberTypeEnum === MEMBER_TYPE_CHANNEL_CORPORATE
|| memberInfo?.memberTypeEnum === MEMBER_TYPE_CHANNEL_INDIVIDUAL
? {
key: 'channelInfo',
name: '渠道信息',
}
: null
),
...(
memberInfo && memberInfo.groups
? memberInfo.groups.map((item, index) => ({
key: `group${index}`,
name: item.groupName,
}))
: []
),
{
key: 'flowRecords',
name: '流转记录',
},
].filter(Boolean);
return (
<Spin spinning={infoLoading}>
<AnchorPage
title={(
<AvatarWrap
info={{
name: memberInfo?.name,
}}
extra={(
<LevelBrand level={2} />
)}
/>
)}
anchors={anchorsArr}
extra={(
<Button
icon={<StopOutlined />}
onClick={() => setModalVisible(true)}
>
解冻
</Button>
)}
>
<Row gutter={[16, 16]}>
{/* 基本信息 */}
<Col span={24}>
<MemberBasicInfo
dataSource={{
memberId: memberInfo?.memberId,
memberTypeName: memberInfo?.memberTypeName,
account: memberInfo?.account,
name: memberInfo?.name,
roleName: memberInfo?.roleName,
phone: memberInfo?.phone,
outerStatus: memberInfo?.outerStatus,
outerStatusName: memberInfo?.outerStatusName,
levelTag: memberInfo?.levelTag,
email: memberInfo?.email,
createTime: memberInfo?.registerTime,
}}
id="basicInfo"
/>
</Col>
{/* 渠道信息 */}
{
memberInfo?.memberTypeEnum === MEMBER_TYPE_CHANNEL_CORPORATE
|| memberInfo?.memberTypeEnum === MEMBER_TYPE_CHANNEL_INDIVIDUAL
? (
<Col span={24}>
<MemberChannelInfo
dataSource={{
level: memberInfo?.channelLevelTag,
type: memberInfo?.channelTypeName,
areas: memberInfo?.areas,
desc: memberInfo?.remark,
}}
id="channelInfo"
/>
</Col>
)
: null
}
{/* 其他注册信息 */}
{
memberInfo && memberInfo.groups
? memberInfo.groups.map((item, index) => (
<Col span={24} key={`group${index}`}>
<CustomizeColumn
title={item.groupName}
data={(
item.elements.map((ele) => ({
title: ele.fieldLocalName,
value: (
ele.fieldType !== 'upload'
? ele.fieldValue
: (
<PicWrap
pics={[ele.fieldValue]}
/>
)
),
}))
)}
id={`group${index}`}
/>
</Col>
))
: null
}
{/* 流转记录 */}
<Col span={24}>
<FlowRecords
outerColumns={MEMBER_OUTER_COLUMNS}
innerColumns={MEMBER_INNER_COLUMNS}
outerRowkey="id"
innerRowkey="id"
outerDataSource={memberInfo?.outerHistory}
id="flowRecords"
/>
</Col>
</Row>
{/* 解冻相关 */}
<Modal
title="会员解冻"
visible={modalVisible}
confirmLoading={confirmLoading}
onOk={() => formActions.submit()}
onCancel={() => setModalVisible(false)}
destroyOnClose
>
<NiceForm
previewPlaceholder="' '"
effects={($, { setFieldState }) => {
FormEffectHooks.onFieldInit$('reason').subscribe(() => {
setFieldState('reason', fieldState => {
fieldState.props.title = '会员解冻原因';
});
});
}}
actions={formActions}
schema={freezeSchema}
onSubmit={handleSubmit}
/>
</Modal>
</AnchorPage>
</Spin>
);
};
export default MemberMaintainUnfreeze;
/*
* @Author: XieZhiXiong
* @Date: 2021-06-04 10:39:42
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-06-04 10:47:51
* @Description:
*/
import { ISchema } from '@formily/antd';
export const unfriendModalSchema: ISchema = {
type: 'object',
properties: {
MEGA_LAYOUT: {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
labelAlign: 'top',
},
properties: {
date: {
type: 'string',
title: '解除日期',
'x-component': 'DatePicker',
'x-component-props': {
placeholder: '请选择',
style: {
width: '100%',
},
},
'x-rules': [
{
required: true,
message: '请选择解除日期',
},
],
},
reason: {
type: 'string',
title: '解除原因',
'x-component': 'Textarea',
'x-component-props': {
placeholder: '在此输入你的内容,最长120个字符,60个汉字',
maxLength: 60,
rows: 5,
},
'x-rules': [
{
required: true,
message: '请填写原因',
},
{
limitByte: true, // 自定义校验规则
maxByte: 120,
}
],
},
},
},
},
};
\ No newline at end of file
import React from 'react';
import { usePageStatus } from '@/hooks/usePageStatus';
import DetailInfo from './components/DetailInfo';
const AuditPr1: React.FC = () => {
const { id, validateId, pageStatus } = usePageStatus();
return (
<DetailInfo id={id} validateId={validateId} isEdit />
);
};
export default AuditPr1;
\ No newline at end of file
import React, { useState, useEffect } from 'react';
import { history } from 'umi';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import {
PageHeader,
Tag,
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 { GetMemberAbilityValidateStep1DetailResponse } from '@/services/MemberApi';
import { createFormActions, FormEffectHooks, FormPath } from '@formily/antd';
import NiceForm from '@/components/NiceForm';
import AvatarWrap from '@/components/AvatarWrap';
import { MEMBER_INNER_STATUS_BADGE_COLOR, MEMBER_STATUS_TAG_MAP, MEMBER_OUTER_STATUS_TYPE } from '../../../constant';
import { auditModalSchema } from '../../../schema/auditSchema';
import AuditProcess from '../../../components/AuditProcess';
import BasicInfo from '../../../components/BasicInfo';
import StatusTag from '../../../components/StatusTag';
import styles from './index.less';
interface AreaItem {
name: string;
code: string;
children: AreaItem[];
};
interface MemberInfo extends GetMemberAbilityValidateStep1DetailResponse {
channelTypeName: string;
areasInfo?: string[];
};
interface DetailInfoProps {
id?: string;
validateId?: string;
// 是否是编辑的
isEdit?: boolean;
};
const modalFormActions = createFormActions();
const {
onFieldValueChange$,
onFieldInputChange$,
} = FormEffectHooks;
const DetailInfo: React.FC<DetailInfoProps> = ({
id,
validateId,
isEdit = false,
}) => {
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);
if (province) {
let str = province.name;
// 存在 市级
if (ccode && province && province.children) {
const city = province.children.find(item => item.code === ccode);
if (city) {
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 => {
if (!isEdit) {
return;
}
setConfirmLoading(true);
// 调用渠道 Form 的 submit
const promises: any = [
PublicApi.postMemberAbilityValidateStep1Submit({
memberId: id,
validateId: validateId,
...values,
}),
];
Promise.all(promises).then(resArr => {
if (resArr.every((item: { code: number }) => item.code === 1000)) {
setModalVisible(false);
setTimeout(() => {
history.goBack();
}, 800);
}
setConfirmLoading(false);
}).catch(err => {
setConfirmLoading(false);
});
};
return (
<Spin spinning={infoLoading}>
<PageHeaderWrapper
style={{
padding: 24,
}}
title={
<>
<PageHeader
style={{ padding: 0 }}
onBack={() => history.goBack()}
title={
<AvatarWrap
info={{
name: memberInfo?.name,
}}
extra={(
<span style={{ fontSize: 12, fontWeight: 'normal' }}>{memberInfo?.levelTag}</span>
)}
/>
}
extra={(
<>
{isEdit && (
<Button
type="primary"
icon={<FormOutlined />}
onClick={() => setModalVisible(true)}
>
提交审核
</Button>
)}
</>
)}
>
<Descriptions
size="small"
column={3}
style={{
padding: '0 32px',
}}
>
<Descriptions.Item label="会员类型">{memberInfo?.memberTypeName}</Descriptions.Item>
<Descriptions.Item label="会员角色" span={2}>{memberInfo?.roleName}</Descriptions.Item>
<Descriptions.Item label="会员状态">
<StatusTag type={MEMBER_STATUS_TAG_MAP[memberInfo?.status]} title={memberInfo?.statusName} />
</Descriptions.Item>
<Descriptions.Item label="外部状态">
<StatusTag type={MEMBER_OUTER_STATUS_TYPE[memberInfo?.outerStatus]} title={memberInfo?.outerStatusName} />
</Descriptions.Item>
<Descriptions.Item label="内部状态">
<Badge color={MEMBER_INNER_STATUS_BADGE_COLOR[memberInfo?.innerStatus]} text={memberInfo?.innerStatusName} />
</Descriptions.Item>
</Descriptions>
</PageHeader>
</>
}
>
<div
style={{
marginBottom: 24,
}}
>
<AuditProcess
outerVerifySteps={memberInfo?.outerVerifySteps}
innerVerifySteps={memberInfo?.innerVerifySteps}
outerVerifyCurrent={
memberInfo && memberInfo.currentOuterStep > 0 ?
memberInfo.currentOuterStep - 1 :
0
}
innerVerifyCurrent={
memberInfo && memberInfo.currentInnerStep > 0 ?
memberInfo.currentInnerStep -1 :
0
}
/>
</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}
/>
<Modal
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 DetailInfo;
import React, { useState, useEffect, useRef } from 'react';
import { history } from 'umi';
import { Card, Space, Button, Badge, Modal, message } from 'antd';
import { ClockCircleOutlined, QuestionCircleOutlined } from '@ant-design/icons';
import { StandardTable } from 'god';
import moment from 'moment';
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/auditSchema';
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';
import LevelBrand from '../../../components/LevelBrand';
const { confirm } = Modal;
const formActions = createFormActions();
const MemberPr1: React.FC<{}> = props => {
const ref = useRef<any>({});
const [selectedRowKeys, setSelectedRowKeys] = useState<Array<string>>([]);
const [selectedList, setSelectList] = useState<any>([]);
const handleJumpAudit = record => {
history.push(`/memberCenter/memberAbility/manage/memberPr1/verify?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/memberPr1/detail?id=${record.memberId}&validateId=${record.validateId}`}
>
{text}
</EyePreview>
<div>
<LevelBrand level={record.level} />
</div>
</>
),
},
{
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',
render: (text, record) => (
<StatusTag type={MEMBER_OUTER_STATUS_TYPE[record.outerStatus]} title={text} />
),
},
{
title: '内部状态',
dataIndex: 'innerStatusName',
align: 'center',
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: (keys: any, rows: {}[]) => {
setSelectedRowKeys(keys);
setSelectList(rows);
},
selectedRowKeys: selectedRowKeys,
};
const fetchListData = async (params: any) => {
const { startDate = null, endDate = null } = params;
const payload = { ...params };
if (startDate) {
payload.startDate = moment(+startDate).format('YYYY-MM-DD');
}
if (endDate) {
payload.endDate = moment(+endDate).format('YYYY-MM-DD');
}
const res = await PublicApi.getMemberAbilityValidateStep1Page(payload);
if (res.code === 1000) {
return res.data;
}
return [];
};
const handleBatch = () => {
if (!selectedList.length) {
message.warning('未选择任何会员');
return;
}
confirm({
title: '提示',
icon: <QuestionCircleOutlined />,
content: '确定要审核通过选中的会员吗?',
onOk() {
const members = selectedList.map(item => ({ memberId: item.memberId, validateId: item.validateId }));
return new Promise((resolve, reject) => {
PublicApi.postMemberAbilityValidateStep1Batch(members)
.then(res => {
if (res.code === 1000) {
ref.current.reload();
setSelectedRowKeys([]);
resolve();
}
reject();
})
.catch(() => {
reject();
});
});
},
});
};
// 初始化高级筛选选项
const fetchSearchItems = async () => {
const res = await PublicApi.getMemberAbilityValidateStep1Pageitems();
if (res.code === 1000) {
const { data = {} }: any = res;
const {
memberTypes = [],
status = [],
roles = [],
levels = [],
sources = [],
} = data;
const newColumns = columns.slice();
// filter 0 过滤掉全部选项
coverColFiltersItem(
newColumns,
'statusName',
status.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.levelTag, value: item.level })),
source: sources.map(item => ({ label: item.text, value: item.id })),
};
}
return {};
};
const controllerBtns = (
<Space>
<Button onClick={handleBatch}>
批量审核通过
</Button>
</Space>
);
return (
<Card>
<StandardTable
tableProps={{
rowKey: 'validateId',
}}
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 MemberPr1;
import React from 'react';
import { usePageStatus } from '@/hooks/usePageStatus';
import DetailInfo from './components/DetailInfo';
const Pr1Detail: React.FC = () => {
const { id, validateId, pageStatus } = usePageStatus();
return (
<DetailInfo id={id} validateId={validateId} />
);
};
export default Pr1Detail;
\ No newline at end of file
import React from 'react';
import { usePageStatus } from '@/hooks/usePageStatus';
import DetailInfo from './components/DetailInfo';
const AuditPr2: React.FC = () => {
const { id, validateId, pageStatus } = usePageStatus();
return (
<DetailInfo id={id} validateId={validateId} isEdit />
);
};
export default AuditPr2;
\ No newline at end of file
import React, { useState, useEffect } from 'react';
import { history } from 'umi';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import {
PageHeader,
Tag,
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 { GetMemberAbilityValidateStep1DetailResponse } from '@/services/MemberApi';
import { createFormActions, FormEffectHooks, FormPath } from '@formily/antd';
import NiceForm from '@/components/NiceForm';
import AvatarWrap from '@/components/AvatarWrap';
import { MEMBER_INNER_STATUS_BADGE_COLOR, MEMBER_STATUS_TAG_MAP, MEMBER_OUTER_STATUS_TYPE } from '../../../constant';
import { auditModalSchema } from '../../../schema/auditSchema';
import AuditProcess from '../../../components/AuditProcess';
import BasicInfo from '../../../components/BasicInfo';
import StatusTag from '../../../components/StatusTag';
import styles from './index.less';
interface AreaItem {
name: string;
code: string;
children: AreaItem[];
};
interface MemberInfo extends GetMemberAbilityValidateStep1DetailResponse {
channelTypeName: string;
areasInfo?: string[];
};
interface DetailInfoProps {
id?: string;
validateId?: string;
// 是否是编辑的
isEdit?: boolean;
};
const modalFormActions = createFormActions();
const {
onFieldValueChange$,
onFieldInputChange$,
} = FormEffectHooks;
const DetailInfo: React.FC<DetailInfoProps> = ({
id,
validateId,
isEdit = false,
}) => {
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);
if (province) {
let str = province.name;
// 存在 市级
if (ccode && province && province.children) {
const city = province.children.find(item => item.code === ccode);
if (city) {
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 => {
if (!isEdit) {
return;
}
setConfirmLoading(true);
// 调用渠道 Form 的 submit
const promises: any = [
PublicApi.postMemberAbilityValidateStep2Submit({
memberId: id,
validateId: validateId,
...values,
}),
];
Promise.all(promises).then(resArr => {
if (resArr.every((item: { code: number }) => item.code === 1000)) {
setModalVisible(false);
setTimeout(() => {
history.goBack();
}, 800);
}
setConfirmLoading(false);
}).catch(err => {
setConfirmLoading(false);
});
};
return (
<Spin spinning={infoLoading}>
<PageHeaderWrapper
style={{
padding: 24,
}}
title={
<>
<PageHeader
style={{ padding: 0 }}
onBack={() => history.goBack()}
title={
<AvatarWrap
info={{
name: memberInfo?.name,
level: 1,
}}
extra={(
<span style={{ fontSize: 12, fontWeight: 'normal' }}>{memberInfo?.levelTag}</span>
)}
/>
}
extra={(
<>
{isEdit && (
<Button
type="primary"
icon={<FormOutlined />}
onClick={() => setModalVisible(true)}
>
提交审核
</Button>
)}
</>
)}
>
<Descriptions
size="small"
column={3}
style={{
padding: '0 32px',
}}
>
<Descriptions.Item label="会员类型">{memberInfo?.memberTypeName}</Descriptions.Item>
<Descriptions.Item label="会员角色" span={2}>{memberInfo?.roleName}</Descriptions.Item>
<Descriptions.Item label="会员状态">
<StatusTag type={MEMBER_STATUS_TAG_MAP[memberInfo?.status]} title={memberInfo?.statusName} />
</Descriptions.Item>
<Descriptions.Item label="外部状态">
<StatusTag type={MEMBER_OUTER_STATUS_TYPE[memberInfo?.outerStatus]} title={memberInfo?.outerStatusName} />
</Descriptions.Item>
<Descriptions.Item label="内部状态">
<Badge color={MEMBER_INNER_STATUS_BADGE_COLOR[memberInfo?.innerStatus]} text={memberInfo?.innerStatusName} />
</Descriptions.Item>
</Descriptions>
</PageHeader>
</>
}
>
<div
style={{
marginBottom: 24,
}}
>
<AuditProcess
outerVerifySteps={memberInfo?.outerVerifySteps}
innerVerifySteps={memberInfo?.innerVerifySteps}
outerVerifyCurrent={
memberInfo && memberInfo.currentOuterStep > 0 ?
memberInfo.currentOuterStep - 1 :
0
}
innerVerifyCurrent={
memberInfo && memberInfo.currentInnerStep > 0 ?
memberInfo.currentInnerStep -1 :
0
}
/>
</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}
/>
<Modal
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 DetailInfo;
import React, { useState, useEffect, useRef } from 'react';
import { history } from 'umi';
import { Card, Space, Button, Badge, Modal, message } from 'antd';
import { ClockCircleOutlined, QuestionCircleOutlined } from '@ant-design/icons';
import { StandardTable } from 'god';
import moment from 'moment';
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/auditSchema';
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';
import LevelBrand from '../../../components/LevelBrand';
const { confirm } = Modal;
const formActions = createFormActions();
const MemberPr2: React.FC<{}> = props => {
const ref = useRef<any>({});
const [selectedRowKeys, setSelectedRowKeys] = useState<Array<string>>([]);
const [selectedList, setSelectList] = useState<any>([]);
const handleJumpAudit = record => {
history.push(`/memberCenter/memberAbility/manage/memberPr2/verify?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/memberPr2/detail?id=${record.memberId}&validateId=${record.validateId}`}
>
{text}
</EyePreview>
<div>
<LevelBrand level={record.level} />
</div>
</>
),
},
{
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',
render: (text, record) => (
<StatusTag type={MEMBER_OUTER_STATUS_TYPE[record.outerStatus]} title={text} />
),
},
{
title: '内部状态',
dataIndex: 'innerStatusName',
align: 'center',
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: (keys: any, rows: {}[]) => {
setSelectedRowKeys(keys);
setSelectList(rows);
},
selectedRowKeys: selectedRowKeys,
};
const fetchListData = async (params: any) => {
const { startDate = null, endDate = null } = params;
const payload = { ...params };
if (startDate) {
payload.startDate = moment(+startDate).format('YYYY-MM-DD');
}
if (endDate) {
payload.endDate = moment(+endDate).format('YYYY-MM-DD');
}
const res = await PublicApi.getMemberAbilityValidateStep2Page(payload);
if (res.code === 1000) {
return res.data;
}
return [];
};
const handleBatch = () => {
if (!selectedList.length) {
message.warning('未选择任何会员');
return;
}
confirm({
title: '提示',
icon: <QuestionCircleOutlined />,
content: '确定要审核通过选中的会员吗?',
onOk() {
const members = selectedList.map(item => ({ memberId: item.memberId, validateId: item.validateId }));
return new Promise((resolve, reject) => {
PublicApi.postMemberAbilityValidateStep2Batch(members)
.then(res => {
if (res.code === 1000) {
ref.current.reload();
setSelectedRowKeys([]);
resolve();
}
reject();
})
.catch(() => {
reject();
});
});
},
});
};
// 初始化高级筛选选项
const fetchSearchItems = async () => {
const res = await PublicApi.getMemberAbilityValidateStep2Pageitems();
if (res.code === 1000) {
const { data = {} }: any = res;
const {
memberTypes = [],
status = [],
roles = [],
levels = [],
sources = [],
} = data;
const newColumns = columns.slice();
// filter 0 过滤掉全部选项
coverColFiltersItem(
newColumns,
'statusName',
status.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.levelTag, value: item.level })),
source: sources.map(item => ({ label: item.text, value: item.id })),
};
}
return {};
};
const controllerBtns = (
<Space>
<Button onClick={handleBatch}>
批量审核通过
</Button>
</Space>
);
return (
<Card>
<StandardTable
tableProps={{
rowKey: 'validateId',
}}
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 MemberPr2;
import React from 'react';
import { usePageStatus } from '@/hooks/usePageStatus';
import DetailInfo from './components/DetailInfo';
const Pr2Detail: React.FC = () => {
const { id, validateId, pageStatus } = usePageStatus();
return (
<DetailInfo id={id} validateId={validateId} />
);
};
export default Pr2Detail;
\ No newline at end of file
/*
* @Author: XieZhiXiong
* @Date: 2021-06-03 14:43:56
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-06-03 15:02:18
* @Description: 级联选择器
*/
import React from 'react';
import { Cascader } from 'antd';
import { CascaderValueType } from 'antd/lib/cascader';
const CascaderFormItem = (props) => {
const {
value,
mutators,
editable,
} = props;
const handleChange = (next: CascaderValueType) => {
mutators.change(next);
};
return (
<Cascader
disabled={!editable}
{...(props.props['x-component-props'] || {})}
value={value}
onChange={handleChange}
/>
);
};
CascaderFormItem.isFieldComponent = true;
export default CascaderFormItem;
......@@ -2,10 +2,10 @@
* @Author: XieZhiXiong
* @Date: 2021-05-24 17:47:32
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-05-26 10:06:37
* @LastEditTime: 2021-06-03 16:31:52
* @Description: 审核Form抽屉
*/
import React from 'react';
import React, { useEffect } from 'react';
import {
Drawer,
Button,
......@@ -13,13 +13,151 @@ import {
import NiceForm from '@/components/NiceForm';
import {
createFormActions,
createAsyncFormActions,
FormEffectHooks,
FormPath,
} from '@formily/antd';
import { PublicApi } from '@/services/api';
import { useLinkageUtils } from '@/utils/formEffectUtils';
import { ArrayCards } from '@formily/antd-components';
import {
schema,
} from './schema';
import { schema } from './schema';
import CascaderFormItem from '../CascaderFormItem';
import styles from './index.less';
type CategoriesType = {
/**
* 品类名称
*/
name: string,
/**
* 付款周期(天)
*/
paymentDay: number,
/**
* 发票类型名称
*/
invoiceTypeName: string,
/**
* 税点,只要百分比的分子部分,不要转换为小数
*/
taxPoint: number,
}
export type ValueType = {
/**
* 合作关系类型枚举
*/
partnerType: number,
/**
* 单次合作金额
*/
maxAmount: number,
/**
* 适用区域编码列表
*/
areaCodes: {
/**
* 省编码
*/
provinceCode: string,
/**
* 市编码
*/
cityCode: string,
}[],
/**
* 主营品类列表
*/
categories: CategoriesType[],
}
interface FormValueType extends Omit<ValueType, ('maxAmount' | 'categories')> {
/**
* 单次合作金额
*/
maxAmount: string,
/**
* 主营品类列表
*/
categories: {
/**
* 已选品类
*/
category: string[],
/**
* 付款周期(天)
*/
paymentDay: string,
/**
* 发票类型名称
*/
invoiceTypeName: string,
/**
* 税点,只要百分比的分子部分,不要转换为小数
*/
taxPoint: number,
}[],
}
interface CategoryItem {
/**
* 数据id
*/
id: string,
/**
* 父级id
*/
parentId: string,
/**
* 标题
*/
title: string,
/**
* 是否选中
*/
checked: boolean,
/**
* 图片url路径
*/
imageUrl: string,
/**
* 子元素
*/
children: CategoryItem[],
}
type CategoryType = {
/**
* label
*/
label: string,
/**
* 值
*/
value: string,
/**
* 子元素
*/
children: CategoryType[],
}
function recursionCategoryData(dataSource: CategoryItem[]): CategoryType[] {
const ret: CategoryType[] = [];
dataSource.forEach((item) => {
const ele: CategoryType = {
label: item.title,
value: item.id,
children: null,
};
if (item.children && item.children.length) {
ele.children = recursionCategoryData(item.children);
}
ret.push(ele);
});
return ret;
};
interface IProps {
/**
* 是否可见
......@@ -28,31 +166,74 @@ interface IProps {
/**
* Form 确认事件
*/
onSubmit: (values: any) => void,
onSubmit: (values: ValueType) => void,
/**
* 抽屉关闭事件
*/
onClose: () => void,
/**
* 合作关系
*/
partnerTypes: {
/**
* label
*/
label: string,
/**
* value
*/
value: number,
}[],
/**
* 确认按钮 loading
*/
submitLoading: boolean,
}
const formActions = createFormActions();
const formActions = createAsyncFormActions();
const {
onFormInit$,
onFieldValueChange$,
onFieldInputChange$,
} = FormEffectHooks;
const ComingClassifyDrawer: React.FC<IProps> = (props: IProps) => {
const {
visible,
onSubmit,
onClose,
partnerTypes,
submitLoading,
} = props;
useEffect(() => {
if (partnerTypes && partnerTypes.length) {
formActions.setFieldState('partnerType', state => {
FormPath.setIn(state, 'props.enum', partnerTypes);
});
}
}, [partnerTypes]);
const handleClose = () => {
if (onClose) {
onClose();
}
};
const handleSubmit = (values: any) => {
const handleSubmit = (values: FormValueType) => {
if (onSubmit) {
onSubmit(values);
const { maxAmount, categories, ...rest } = values;
const formated = categories.map((item) => ({
name: item.category.join('-'),
paymentDay: +item.paymentDay,
invoiceTypeName: item.invoiceTypeName,
taxPoint: +item.taxPoint,
}));
onSubmit({
maxAmount: +maxAmount,
categories: formated,
...rest,
});
}
};
......@@ -69,6 +250,49 @@ const ComingClassifyDrawer: React.FC<IProps> = (props: IProps) => {
</div>
);
const useBusinessEffects = () => {
// 省级改变时,,请求出对应的市级数据
onFieldInputChange$('areaCodes.*.provinceCode').subscribe(fieldState => {
formActions.setFieldState(
FormPath.transform(fieldState.name, /\d/, $1 => `areaCodes.${$1}.cityCode`),
state => {
FormPath.setIn(state, 'value', undefined);
}
);
});
// 省级改变时,,请求出对应的市级数据
onFieldValueChange$('areaCodes.*.provinceCode').subscribe((fieldState) => {
if (fieldState.value === undefined) {
return;
}
formActions.setFieldState(
FormPath.transform(fieldState.name, /\d/, $1 => `areaCodes.${$1}.cityCode`),
state => {
FormPath.setIn(state, 'props.x-props.hasFeedback', true);
FormPath.setIn(state, 'loading', true);
}
);
PublicApi.getMemberDepositClassifyCity({
provinceCode: fieldState.value,
}).then(res => {
if (res.code === 1000) {
const { data = [] } = res;
const options = data.map(item => ({ label: item.name, value: item.code }));
formActions.setFieldState(
FormPath.transform(fieldState.name, /\d/, $1 => `areaCodes.${$1}.cityCode`),
state => {
FormPath.setIn(state, 'props.enum', options);
FormPath.setIn(state, 'loading', false);
}
);
}
});
});
}
return (
<Drawer
title="入库分类信息"
......@@ -84,7 +308,11 @@ const ComingClassifyDrawer: React.FC<IProps> = (props: IProps) => {
<Button onClick={handleClose} style={{ marginRight: 16 }}>
取 消
</Button>
<Button onClick={() => formActions.submit()} type="primary">
<Button
onClick={() => formActions.submit()}
type="primary"
loading={submitLoading}
>
确 定
</Button>
</div>
......@@ -94,13 +322,48 @@ const ComingClassifyDrawer: React.FC<IProps> = (props: IProps) => {
previewPlaceholder="' '"
components={{
ArrayCards,
CascaderFormItem,
}}
expressionScope={{
MemberCodeDescription,
MemberCypher,
}}
effects={() => {
effects={($, { setFieldState }) => {
useBusinessEffects();
onFormInit$().subscribe(() => {
// 请求省级数据
PublicApi.getMemberDepositClassifyProvince().then(res => {
if (res.code === 1000) {
const { data = [] } = res;
const options = data.map(item => ({ label: item.name, value: item.code }));
formActions.setFieldState('areaCodes.*.provinceCode', state => {
FormPath.setIn(state, 'props.enum', options);
});
}
});
// 请求会员品类数据
PublicApi.getProductCustomerGetCustomerCategoryTree().then(res => {
if (res.code === 1000) {
const { data = [] } = res;
formActions.setFieldState('categories.*.category', state => {
FormPath.setIn(state, 'props.x-component-props.options', data);
});
}
});
});
onFieldValueChange$('agree').subscribe(fieldState => {
setFieldState('reason', state => {
state.title = fieldState.value === 0 ? '不通过原因' : '通过原因';
state.rules = fieldState.value === 0 ? [...state.rules, { required: true }] : [];
state.required = fieldState.value === 0;
setTimeout(() => {
formActions.validate('reason');
}, 0);
});
});
}}
actions={formActions}
schema={schema}
......
......@@ -2,10 +2,24 @@
* @Author: XieZhiXiong
* @Date: 2021-05-24 18:00:52
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-05-25 17:36:13
* @LastEditTime: 2021-06-03 16:49:52
* @Description:
*/
import { ISchema } from '@formily/antd';
import {
MEMBER_INVOICE_TYPE_1,
MEMBER_INVOICE_TYPE_2,
MEMBER_INVOICE_TYPE_3,
MEMBER_INVOICE_TYPE_4,
MEMBER_INVOICE_TYPE_5,
MEMBER_INVOICE_TYPE,
MEMBER_TAX_POINT_1,
MEMBER_TAX_POINT_2,
MEMBER_TAX_POINT_3,
MEMBER_TAX_POINT_4,
MEMBER_TAX_POINT_5,
MEMBER_TAX_POINT,
} from '@/constants/member';
export const schema: ISchema = {
type: 'object',
......@@ -26,19 +40,22 @@ export const schema: ISchema = {
labelAlign: 'left',
},
properties: {
channelLevel: {
code: {
type: 'string',
title: '会员编码',
required: true,
description: '{{MemberCodeDescription}}',
},
channelTypeId: {
partnerType: {
type: 'string',
enum: [],
title: '合作关系',
'x-component-props': {
placeholder: '请选择',
},
required: true,
},
channelLevel2: {
maxAmount: {
type: 'string',
title: '单次合作金额',
required: true,
......@@ -47,7 +64,7 @@ export const schema: ISchema = {
},
description: '{{MemberCypher}}',
},
areas: {
areaCodes: {
type: 'array',
title: '适用区域',
required: true,
......@@ -56,14 +73,14 @@ export const schema: ISchema = {
items: {
type: 'object',
properties: {
pcode: {
provinceCode: {
type: 'string',
enum: [],
'x-component-props': {
allowClear: true,
},
},
ccode: {
cityCode: {
type: 'string',
enum: [],
'x-component-props': {
......@@ -73,7 +90,7 @@ export const schema: ISchema = {
}
}
},
managementCategory: {
categories: {
type: 'array',
title: '主营品类',
required: true,
......@@ -90,58 +107,116 @@ export const schema: ISchema = {
wrapperCol: 19,
},
properties: {
CATEGORY_LAYOUT: {
type: 'object',
'x-component': 'Mega-Layout',
category: {
type: 'string',
title: '品类',
'x-component': 'CascaderFormItem',
'x-component-props': {
grid: true,
full: true,
autoRow: true,
columns: 3,
label: '品类',
},
properties: {
provinceId: {
type: 'string',
enum: [],
'x-component-props': {
placeholder: '请选择',
},
required: true,
},
cityId: {
type: 'string',
enum: [],
'x-component-props': {
placeholder: '请选择',
},
required: true,
},
areaId: {
type: 'string',
enum: [],
'x-component-props': {
placeholder: '请选择',
},
required: true,
},
fieldNames: { label: 'title', value: 'title', children: 'children' },
},
required: true,
},
cycle: {
// CATEGORY_LAYOUT: {
// type: 'object',
// 'x-component': 'Mega-Layout',
// 'x-component-props': {
// grid: true,
// full: true,
// autoRow: true,
// columns: 3,
// label: '品类',
// },
// properties: {
// aaa: {
// type: 'string',
// 'x-component': 'CascaderFormItem',
// 'x-component-props': {
// },
// },
// provinceId: {
// type: 'string',
// enum: [],
// 'x-component-props': {
// placeholder: '请选择',
// },
// required: true,
// },
// cityId: {
// type: 'string',
// enum: [],
// 'x-component-props': {
// placeholder: '请选择',
// },
// required: true,
// },
// areaId: {
// type: 'string',
// enum: [],
// 'x-component-props': {
// placeholder: '请选择',
// },
// required: true,
// },
// },
// },
paymentDay: {
type: 'string',
enum: [],
title: '付款周期(天)',
required: true,
},
invoiceType: {
invoiceTypeName: {
type: 'string',
enum: [],
enum: [
{
label: MEMBER_INVOICE_TYPE[MEMBER_INVOICE_TYPE_1],
value: MEMBER_INVOICE_TYPE[MEMBER_INVOICE_TYPE_1],
},
{
label: MEMBER_INVOICE_TYPE[MEMBER_INVOICE_TYPE_2],
value: MEMBER_INVOICE_TYPE[MEMBER_INVOICE_TYPE_2],
},
{
label: MEMBER_INVOICE_TYPE[MEMBER_INVOICE_TYPE_3],
value: MEMBER_INVOICE_TYPE[MEMBER_INVOICE_TYPE_3],
},
{
label: MEMBER_INVOICE_TYPE[MEMBER_INVOICE_TYPE_4],
value: MEMBER_INVOICE_TYPE[MEMBER_INVOICE_TYPE_4],
},
{
label: MEMBER_INVOICE_TYPE[MEMBER_INVOICE_TYPE_5],
value: MEMBER_INVOICE_TYPE[MEMBER_INVOICE_TYPE_5],
},
],
title: '发票类型',
required: true,
},
taxPoint: {
type: 'string',
title: '税点',
enum: [
{
label: MEMBER_TAX_POINT[MEMBER_TAX_POINT_1],
value: MEMBER_TAX_POINT_1,
},
{
label: MEMBER_TAX_POINT[MEMBER_TAX_POINT_2],
value: MEMBER_TAX_POINT_2,
},
{
label: MEMBER_TAX_POINT[MEMBER_TAX_POINT_3],
value: MEMBER_TAX_POINT_3,
},
{
label: MEMBER_TAX_POINT[MEMBER_TAX_POINT_4],
value: MEMBER_TAX_POINT_4,
},
{
label: MEMBER_TAX_POINT[MEMBER_TAX_POINT_5],
value: MEMBER_TAX_POINT_5,
},
],
required: true,
},
},
......
......@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2021-05-25 14:35:56
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-05-25 15:55:52
* @LastEditTime: 2021-06-03 10:52:22
* @Description: 待入库分类详情
*/
import React, { useState, useEffect } from 'react';
......@@ -13,7 +13,7 @@ import {
} from 'antd';
import { usePageStatus } from '@/hooks/usePageStatus';
import { PublicApi } from '@/services/api';
import { GetMemberAbilityMaintenanceDetailBasicResponse } from '@/services/MemberApi';
import { GetMemberDepositClassifyDetailResponse } from '@/services/MemberV2Api';
import {
MEMBER_TYPE_CHANNEL_CORPORATE,
MEMBER_TYPE_CHANNEL_INDIVIDUAL,
......@@ -35,17 +35,16 @@ import MemberInvestigateInfo from '../components/MemberInvestigateInfo';
import PicWrap from '../components/PicWrap';
const MemberPrComingClassify: React.FC<{}> = () => {
const { id, validateId } = usePageStatus();
const [memberInfo, setMemberInfo] = useState<GetMemberAbilityMaintenanceDetailBasicResponse>(null);
const { validateId } = usePageStatus();
const [memberInfo, setMemberInfo] = useState<GetMemberDepositClassifyDetailResponse>(null);
const [infoLoading, setInfoLoaading] = useState(false);
const getBasicInfo = () => {
if (!id || !validateId) {
if (!validateId) {
return;
}
setInfoLoaading(true);
PublicApi.getMemberAbilityMaintenanceDetailBasic({
memberId: id,
PublicApi.getMemberDepositClassifyDetail({
validateId,
}).then(res => {
if (res.code === 1000) {
......@@ -79,8 +78,8 @@ const MemberPrComingClassify: React.FC<{}> = () => {
: null
),
...(
memberInfo && memberInfo.groups
? memberInfo.groups.map((item, index) => ({
memberInfo && memberInfo.registerDetails
? memberInfo.registerDetails.map((item, index) => ({
key: `group${index}`,
name: item.groupName,
}))
......@@ -141,7 +140,7 @@ const MemberPrComingClassify: React.FC<{}> = () => {
outerStatusName: memberInfo?.outerStatusName,
levelTag: memberInfo?.levelTag,
email: memberInfo?.email,
createTime: memberInfo?.createTime,
createTime: memberInfo?.registerTime,
}}
id="basicInfo"
/>
......@@ -169,14 +168,14 @@ const MemberPrComingClassify: React.FC<{}> = () => {
{/* 其他注册信息 */}
{
memberInfo && memberInfo.groups
? memberInfo.groups.map((item, index) => (
memberInfo && memberInfo.registerDetails
? memberInfo.registerDetails.map((item, index) => (
<Col span={24} key={`group${index}`}>
<CustomizeColumn
title={item.groupName}
data={(
item.elements.map((ele) => ({
title: ele.fieldCNName,
title: ele.fieldLocalName,
value: (
ele.fieldType !== 'upload'
? ele.fieldValue
......@@ -198,6 +197,7 @@ const MemberPrComingClassify: React.FC<{}> = () => {
{/* 入库信息 */}
<Col span={24}>
<MemberDocIncomingInfo
dataSource={memberInfo?.depositDetails}
id="incomingInfo"
/>
</Col>
......@@ -205,6 +205,7 @@ const MemberPrComingClassify: React.FC<{}> = () => {
{/* 考察信息 */}
<Col span={24}>
<MemberInvestigateInfo
dataSource={memberInfo?.inspection}
id="investigateInfo"
/>
</Col>
......
......@@ -2,13 +2,12 @@
* @Author: XieZhiXiong
* @Date: 2021-05-25 14:34:56
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-05-25 18:05:07
* @LastEditTime: 2021-06-03 10:05:21
* @Description: 待入库分类
*/
import React, { useState, useRef } from 'react';
import React, { useRef } from 'react';
import { history } from 'umi';
import { Card, Space, Button, Modal, message } from 'antd';
import { QuestionCircleOutlined } from '@ant-design/icons';
import { Card, Button } from 'antd';
import { StandardTable } from 'god';
import moment from 'moment';
import { ColumnType } from 'antd/lib/table/interface';
......@@ -22,15 +21,13 @@ import useSpliceArray from '@/hooks/useSpliceArray';
import comingSchema from '../common/schames/comingSchema';
import verifyComingColumn from '../common/columns/verifyComingColumn';
const { confirm } = Modal;
const formActions = createFormActions();
const MemberPrComingClassify: React.FC<{}> = props => {
const ref = useRef<any>({});
const handleJumpAudit = record => {
history.push(`/memberCenter/memberAbility/manage/memberPrComingClassify/verify?id=${record.memberId}&validateId=${record.validateId}`);
history.push(`/memberCenter/memberAbility/manage/memberPrComingClassify/verify?validateId=${record.validateId}`);
};
const defaultColumns = verifyComingColumn('/memberCenter/memberAbility/manage/memberPrComingClassify/detail').concat([
......@@ -62,7 +59,7 @@ const MemberPrComingClassify: React.FC<{}> = props => {
payload.endDate = moment(+endDate).format('YYYY-MM-DD');
}
const res = await PublicApi.getMemberAbilityMaintenancePage(payload);
const res = await PublicApi.getMemberDepositClassifyPage(payload);
if (res.code === 1000) {
return res.data;
......@@ -72,7 +69,7 @@ const MemberPrComingClassify: React.FC<{}> = props => {
// 初始化高级筛选选项
const fetchSearchItems = async () => {
const res = await PublicApi.getMemberAbilityValidateCommitPageitems();
const res = await PublicApi.getMemberDepositPageConditions();
if (res.code === 1000) {
const { data = {} }: any = res;
......
......@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2021-05-25 14:36:14
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-05-25 19:44:28
* @LastEditTime: 2021-06-03 17:07:31
* @Description: 入库分类
*/
import React, { useState, useEffect } from 'react';
......@@ -11,13 +11,15 @@ import {
Col,
Spin,
Button,
message,
} from 'antd';
import {
CheckCircleOutlined,
} from '@ant-design/icons';
import { history } from 'umi';
import { usePageStatus } from '@/hooks/usePageStatus';
import { PublicApi } from '@/services/api';
import { GetMemberAbilityMaintenanceDetailBasicResponse } from '@/services/MemberApi';
import { GetMemberDepositClassifyDetailResponse } from '@/services/MemberV2Api';
import {
MEMBER_TYPE_CHANNEL_CORPORATE,
MEMBER_TYPE_CHANNEL_INDIVIDUAL,
......@@ -37,21 +39,21 @@ import MemberChannelInfo from '../components/MemberChannelInfo';
import MemberDocIncomingInfo from '../components/MemberDocIncomingInfo';
import MemberInvestigateInfo from '../components/MemberInvestigateInfo';
import PicWrap from '../components/PicWrap';
import ComingClassifyDrawer from './components/ComingClassifyDrawer';
import ComingClassifyDrawer, { ValueType } from './components/ComingClassifyDrawer';
const MemberPrComingClassifyVerify: React.FC<{}> = () => {
const { id, validateId } = usePageStatus();
const [memberInfo, setMemberInfo] = useState<GetMemberAbilityMaintenanceDetailBasicResponse>(null);
const { validateId } = usePageStatus();
const [memberInfo, setMemberInfo] = useState<GetMemberDepositClassifyDetailResponse>(null);
const [infoLoading, setInfoLoaading] = useState(false);
const [visibleVerifyDrawer, setVisibleVerifyDrawer] = useState(false);
const [submitLoading, setSubmitLoading] = useState(false);
const getBasicInfo = () => {
if (!id || !validateId) {
if (!validateId) {
return;
}
setInfoLoaading(true);
PublicApi.getMemberAbilityMaintenanceDetailBasic({
memberId: id,
PublicApi.getMemberDepositClassifyDetail({
validateId,
}).then(res => {
if (res.code === 1000) {
......@@ -70,11 +72,32 @@ const MemberPrComingClassifyVerify: React.FC<{}> = () => {
setVisibleVerifyDrawer(!!flag);
};
const handleSubmit = () => {
console.log('表单提交')
const handleSubmit = (value: ValueType) => {
setSubmitLoading(true);
const payload = {
validateId,
...value,
};
const msg = message.loading({
content: '正在提交,请稍候...',
duration: 0,
});
PublicApi.postMemberDepositClassify(payload, {
timeout: 0,
}).then(res => {
if (res.code !== 1000) {
return;
}
handleVisibleVerifyDrawer(false);
setTimeout(() => {
history.goBack();
}, 800);
}).finally(() => {
msg();
setSubmitLoading(false);
});
};
const anchorsArr = [
{
key: 'verifySteps',
......@@ -94,8 +117,8 @@ const MemberPrComingClassifyVerify: React.FC<{}> = () => {
: null
),
...(
memberInfo && memberInfo.groups
? memberInfo.groups.map((item, index) => ({
memberInfo && memberInfo.registerDetails
? memberInfo.registerDetails.map((item, index) => ({
key: `group${index}`,
name: item.groupName,
}))
......@@ -165,7 +188,7 @@ const MemberPrComingClassifyVerify: React.FC<{}> = () => {
outerStatusName: memberInfo?.outerStatusName,
levelTag: memberInfo?.levelTag,
email: memberInfo?.email,
createTime: memberInfo?.createTime,
createTime: memberInfo?.registerTime,
}}
id="basicInfo"
/>
......@@ -193,14 +216,14 @@ const MemberPrComingClassifyVerify: React.FC<{}> = () => {
{/* 其他注册信息 */}
{
memberInfo && memberInfo.groups
? memberInfo.groups.map((item, index) => (
memberInfo && memberInfo.registerDetails
? memberInfo.registerDetails.map((item, index) => (
<Col span={24} key={`group${index}`}>
<CustomizeColumn
title={item.groupName}
data={(
item.elements.map((ele) => ({
title: ele.fieldCNName,
title: ele.fieldLocalName,
value: (
ele.fieldType !== 'upload'
? ele.fieldValue
......@@ -222,6 +245,7 @@ const MemberPrComingClassifyVerify: React.FC<{}> = () => {
{/* 入库信息 */}
<Col span={24}>
<MemberDocIncomingInfo
dataSource={memberInfo?.depositDetails}
id="incomingInfo"
/>
</Col>
......@@ -229,6 +253,7 @@ const MemberPrComingClassifyVerify: React.FC<{}> = () => {
{/* 考察信息 */}
<Col span={24}>
<MemberInvestigateInfo
dataSource={memberInfo?.inspection}
id="investigateInfo"
/>
</Col>
......@@ -249,7 +274,14 @@ const MemberPrComingClassifyVerify: React.FC<{}> = () => {
<ComingClassifyDrawer
visible={visibleVerifyDrawer}
partnerTypes={(
memberInfo
&& memberInfo.partnerTypes
? memberInfo.partnerTypes.map((item) => ({ label: item.text, value: item.id })).filter((item) => item.value)
: []
)}
onClose={() => handleVisibleVerifyDrawer(false)}
submitLoading={submitLoading}
onSubmit={handleSubmit}
/>
</Spin>
......
......@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2021-06-02 20:10:47
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-06-02 20:28:11
* @LastEditTime: 2021-06-03 10:38:03
* @Description:
*/
import { ISchema } from '@formily/antd';
......@@ -53,14 +53,11 @@ export const schema: ISchema = {
},
'x-rules': [
{
required: true,
message: '请输入考察评分',
},
{
pattern: PATTERN_MAPS.money,
message: '请输入两位小数',
},
],
required: true,
},
result: {
type: 'string',
......@@ -76,6 +73,7 @@ export const schema: ISchema = {
maxByte: 120,
}
],
required: true,
},
reports: {
type: 'string',
......
......@@ -30,6 +30,7 @@ import {
} from '../constant';
import MemberBasicInfo from '../components/MemberBasicInfo';
import MemberChannelInfo from '../components/MemberChannelInfo';
import MemberDocIncomingInfo from '../components/MemberDocIncomingInfo';
import PicWrap from '../components/PicWrap';
const MemberPrComingInvestigate: React.FC<{}> = () => {
......@@ -84,6 +85,10 @@ const MemberPrComingInvestigate: React.FC<{}> = () => {
: []
),
{
key: 'incomingInfo',
name: '入库信息',
},
{
key: 'flowRecords',
name: '流转记录',
},
......@@ -184,6 +189,14 @@ const MemberPrComingInvestigate: React.FC<{}> = () => {
: null
}
{/* 入库信息 */}
<Col span={24}>
<MemberDocIncomingInfo
dataSource={memberInfo?.depositDetails}
id="incomingInfo"
/>
</Col>
{/* 流转记录 */}
<Col span={24}>
<FlowRecords
......
......@@ -2,13 +2,12 @@
* @Author: XieZhiXiong
* @Date: 2021-05-25 10:12:48
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-05-25 14:23:36
* @LastEditTime: 2021-06-03 20:46:28
* @Description: 待审核入库考察
*/
import React, { useState, useRef } from 'react';
import React, { useRef } from 'react';
import { history } from 'umi';
import { Card, Space, Button, Modal, message } from 'antd';
import { QuestionCircleOutlined } from '@ant-design/icons';
import { Card, Button } from 'antd';
import { StandardTable } from 'god';
import moment from 'moment';
import { ColumnType } from 'antd/lib/table/interface';
......@@ -22,8 +21,6 @@ import useSpliceArray from '@/hooks/useSpliceArray';
import comingSchema from '../common/schames/comingSchema';
import verifyComingColumn from '../common/columns/verifyComingColumn';
const { confirm } = Modal;
const formActions = createFormActions();
const MemberPrComingInvestigate: React.FC<{}> = props => {
......
......@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2021-05-25 14:03:05
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-06-02 20:21:48
* @LastEditTime: 2021-06-03 10:32:00
* @Description:
*/
import React, { useState, useEffect } from 'react';
......@@ -31,8 +31,9 @@ import {
MEMBER_INNER_COLUMNS,
} from '../constant';
import MemberBasicInfo from '../components/MemberBasicInfo';
import PicWrap from '../components/PicWrap';
import MemberDocIncomingInfo from '../components/MemberDocIncomingInfo';
import VerifyComingInvestigateDrawer, { ValueType } from './components/VerifyComingInvestigateDrawer';
import PicWrap from '../components/PicWrap';
const MemberPrComingInvestigate: React.FC<{}> = () => {
const { validateId } = usePageStatus();
......@@ -113,6 +114,10 @@ const MemberPrComingInvestigate: React.FC<{}> = () => {
: []
),
{
key: 'incomingInfo',
name: '入库信息',
},
{
key: 'flowRecords',
name: '流转记录',
},
......@@ -202,6 +207,14 @@ const MemberPrComingInvestigate: React.FC<{}> = () => {
: null
}
{/* 入库信息 */}
<Col span={24}>
<MemberDocIncomingInfo
dataSource={memberInfo?.depositDetails}
id="incomingInfo"
/>
</Col>
{/* 流转记录 */}
<Col span={24}>
<FlowRecords
......
import React from 'react';
import { usePageStatus } from '@/hooks/usePageStatus';
import DetailInfo from './components/DetailInfo';
const AuditPrComfirm: React.FC = () => {
const { id, validateId, pageStatus } = usePageStatus();
return (
<DetailInfo id={id} validateId={validateId} isEdit />
);
};
export default AuditPrComfirm;
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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