Commit a6974b8a authored by XieZhiXiong's avatar XieZhiXiong

Merge branch 'dev' into test

parents 0496cfe2 52577705
...@@ -4,8 +4,6 @@ ...@@ -4,8 +4,6 @@
/node_modules /node_modules
/npm-debug.log* /npm-debug.log*
/yarn-error.log /yarn-error.log
/yarn.lock
/package-lock.json
# production # production
/dist /dist
......
/*
* 会员资金账户路由
*/
const router = {
path: '/capitalAccount',
name: 'capitalAccount',
icon: 'SmileOutlined',
hidePageHeader: true,
routes: [
{
path: '/capitalAccount/accountLists',
name: 'accountLists',
component: '@/pages/capitalAccount/accountLists',
},
{
path: '/capitalAccount/accountLists/details',
name: 'accountDetails',
component: '@/pages/capitalAccount/accountLists/accountDetails',
hideInMenu: true,
},
{
path: '/capitalAccount/checkWithdraw',
name: 'checkWithdraw',
component: '@/pages/capitalAccount/checkWithdraw',
},
{
path: '/capitalAccount/checkWithdraw/details',
name: 'checkDetails',
component: '@/pages/capitalAccount/checkWithdraw/checkDetails',
hideInMenu: true,
},
{
path: '/capitalAccount/paymentWithdraw',
name: 'paymentWithdraw',
component: '@/pages/capitalAccount/paymentWithdraw',
},
{
path: '/capitalAccount/paymentWithdraw/details',
name: 'paymentDetails',
component: '@/pages/capitalAccount/paymentWithdraw/paymentDetails',
hideInMenu: true,
},
]
}
export default router
...@@ -20,6 +20,7 @@ import rfqRoute from './rfqRoute' // 询价单路由 ...@@ -20,6 +20,7 @@ import rfqRoute from './rfqRoute' // 询价单路由
import commentRoutes from './commentRoutes'; import commentRoutes from './commentRoutes';
import contentRoute from './contentRoute'; // 内容管理 import contentRoute from './contentRoute'; // 内容管理
import balancedRoute from './balancedRoute'; // 平台结算管理 import balancedRoute from './balancedRoute'; // 平台结算管理
import capitalAccount from './capitalAccountRoute'; // 会员资金账户
const routeList = [ const routeList = [
pageCustomized, pageCustomized,
calssPropertyRoute, calssPropertyRoute,
...@@ -35,7 +36,9 @@ const routeList = [ ...@@ -35,7 +36,9 @@ const routeList = [
balancedRoute, balancedRoute,
requisitionRoute, requisitionRoute,
enquiryOfferRoute, enquiryOfferRoute,
capitalAccount,
] ]
const router = [ const router = [
{ {
path: '/login', path: '/login',
......
...@@ -179,6 +179,16 @@ export default { ...@@ -179,6 +179,16 @@ export default {
'menu.balanced.receiptAdd': '新建发票', 'menu.balanced.receiptAdd': '新建发票',
'menu.balanced.receiptDetail': '发票详情', 'menu.balanced.receiptDetail': '发票详情',
'menu.balanced.accountReceivableList': '代收账款结算', 'menu.balanced.accountReceivableList': '代收账款结算',
'menu.balanced.accountReceivableDetail': '代收账款明细' 'menu.balanced.accountReceivableDetail': '代收账款明细',
// 会员资金账户
'menu.capitalAccount': '会员资金账户',
'menu.capitalAccount.accountLists': '会员账户',
'menu.capitalAccount.accountDetails': '账户详情',
'menu.capitalAccount.checkWithdraw': '待审核提现',
'menu.capitalAccount.checkDetails': '审核提现',
'menu.capitalAccount.paymentWithdraw': '待支付提现',
'menu.capitalAccount.paymentDetails': '支付提现',
} }
// export default utils.transformDataPre(data, 'menu') // export default utils.transformDataPre(data, 'menu')
import React, { useState, useEffect, useRef, ReactNode } from 'react'
import { history } from 'umi'
import { Card, Space, Row, Col, Button, Table, Modal, Form, Input } from 'antd'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import ReutrnEle from '@/components/ReturnEle'
import styles from './index.less'
import StatusTag from '@/components/StatusTag'
import cx from 'classnames'
import moment from 'moment'
import { ColumnType } from 'antd/lib/table/interface'
import { memberStatusMap, moveStatusMap, operationMap, statusMap } from '../constant'
import { SettingOutlined, StopOutlined } from '@ant-design/icons'
import { validatorByte } from '@/utils/regExp'
import { PublicApi } from '@/services/api'
import { StandardTable } from 'god'
const { TextArea } = Input
const AccountDetail: React.FC<{}> = () => {
const refTrade = useRef<any>({})
const [checkForm] = Form.useForm()
const [moveRecord, setMoveRecord] = useState<any>()
const [isDisabled, setIsDisabled] = useState<boolean>(false)
const [visibleModal, setVisibleModal] = useState<boolean>(false)
const [ details, setDetails ] = useState<any>({ accountBalance: 0, lockBalance: 0})
useEffect(() => {
getAccountInfo()
}, [])
const getAccountInfo = async () => {
const { id } = history.location.query
let res = await PublicApi.getPayPlatFormAssetAccountGetPlatFormAssetAccount({id})
const { code, data } = res
setDetails(data)
if(code === 1000){
let statusRecord = await PublicApi.getPayPlatFormAssetAccountGetAccountStatusRecord({memberAssetAccountId: data.id + ''})
setMoveRecord(statusRecord.data)
}
}
// 获取交易记录
const fetchTradeData = (params) => {
return new Promise((resolve, reject) => {
PublicApi.getPayPlatFormAssetAccountGetAccountTradeRecord({memberAssetAccountId: history.location.query.id + '', ...params}).then(res => {
const { data } = res
resolve(data)
})
})
}
const columns: ColumnType<any>[] = [
{
title: '交易流水号',
dataIndex: 'tradeCode',
key: 'tradeCode',
},
{
title: '交易时间',
dataIndex: 'tradeTime',
key: 'tradeTime',
render: (text: any) => moment(text).format("YYYY-MM-DD HH:mm:ss")
},
{
title: '交易金额(元)',
dataIndex: 'tradeMoney',
key: 'tradeMoney',
render: (t, r) => `${operationMap[r.operation]['operator']} ${t.toFixed(2)}`
},
{
title: '交易项目',
dataIndex: 'operation',
key: 'operation',
render: (t, r) => operationMap[t]['title']
},
{
title: '状态',
dataIndex: 'status',
key: 'status',
render: (text:any, record:any) => (<StatusTag title={statusMap[text]['title']} type={statusMap[text]['type']} />)
},
{
title: '意见',
dataIndex: 'remark',
key: 'remark',
},
];
const moveColumns: ColumnType<any>[] = [
{
title: '序号',
dataIndex: 'id',
key: 'id',
render: (t, c, i) => i + 1
},
{
title: '操作角色',
dataIndex: ['memberAssetAccount','parentMemberRoleName'],
key: 'id',
},
{
title: '状态',
dataIndex: 'status',
key: 'status',
render: (text:any, record:any) => (<StatusTag title={moveStatusMap[text]['title']} type={moveStatusMap[text]['type']} />)
},
{
title: '操作',
dataIndex: 'operation',
key: 'operation',
render: (t, r)=> {
return t === 1 ? '冻结资金账户' : '解冻资金账户'
}
},
{
title: '操作时间',
dataIndex: 'createTime',
key: 'createTime',
render: (text: any) => moment(text).format("YYYY-MM-DD HH:mm:ss")
},
{
title: '意见',
dataIndex: 'remark',
key: 'remark',
},
];
const handleRelieve = () => {
setVisibleModal(true)
}
const handleCancel = () => {
setVisibleModal(false)
}
const handleOK = () => {
checkForm.validateFields().then(values => {
setVisibleModal(false)
PublicApi.postPayMemberAssetAccountUpdateMemberAssetAccountEnable({ id: details.id, status: details.accountStatus === 1 ? 2 : 1, ...values }).then(res => {
if(res.code === 1000)
getAccountInfo()
})
})
}
return (
<PageHeaderWrapper
title="账户详情"
onBack={() => history.goBack()}
backIcon={<ReutrnEle />}
extra={[
<Button
key="1"
onClick={handleRelieve}
type="primary"
icon={details?.accountStatus === 1 ? <SettingOutlined /> : <StopOutlined />}
disabled={isDisabled}
>
{details?.accountStatus === 1 ? '冻结' : '解冻'}
</Button>,
]}
>
<Space direction="vertical" style={{width:'100%'}}>
<Card headStyle={{borderBottom:'none'}} title="账户信息">
<Row gutter={100}>
<Col span={8}>
<div className={cx(styles.repayment, styles.repayinfo)}>
<div className={styles['repayment-left']}>
<div className={styles.statistic}>
<div className={styles['statistic-title']}>可用余额(元):</div>
<div className={styles['statistic-amount']}>
{`${((details.accountBalance*100 - details.lockBalance*100)/100).toFixed(2)}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
</div>
</div>
<div className={styles['repayment-end']}>
<span className={styles['repayment-time']}>
{details?.memberName}
</span>
</div>
</div>
</div>
</Col>
<Col span={16}>
<div className={styles.infoRight}>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>账户归属:</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>{details?.parentMemberName}</p>
</Col>
</Row>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>账户余额(元):</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>{details?.accountBalance?.toFixed(2)}</p>
</Col>
</Row>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>锁定金额(元):</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>{details?.lockBalance?.toFixed(2)}</p>
</Col>
</Row>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>账户状态:</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>
{
details?.accountStatus &&
<StatusTag title={memberStatusMap[details.accountStatus]['title']} type={memberStatusMap[details.accountStatus]['type']} />
}
</p>
</Col>
</Row>
</div>
</Col>
</Row>
</Card>
</Space>
<Space direction="vertical" style={{width:'100%'}}>
<Card headStyle={{borderBottom:'none'}} title="交易记录">
<StandardTable
columns={columns}
currentRef={refTrade}
fetchTableData={(params: any) => fetchTradeData(params)}
/>
</Card>
</Space>
<Space direction="vertical" style={{width:'100%'}}>
<Card headStyle={{borderBottom:'none'}} title="流转记录">
<Table columns={moveColumns} dataSource={moveRecord} pagination={false} />
{/* <StandardTable
columns={moveColumns}
currentRef={refMove}
fetchTableData={(params: any) => fetchMoveData(params)}
tableProps={{
pagination: false
}}
/> */}
</Card>
</Space>
<Modal
title={details?.accountStatus === 1 ? '会员冻结' : '会员解冻'}
visible={visibleModal}
onOk={handleOK}
onCancel={handleCancel}
destroyOnClose={true}
>
<Form
layout="vertical"
form={checkForm}
>
<Form.Item
name="remark"
label={details?.accountStatus === 1 ? '会员冻结原因' : '会员解冻原因'}
rules={[
{
required: true,
message: '请填写原因'
},
{
validator: (r, v, c) => validatorByte(r, v, c, 120)
}
]}
>
<TextArea rows={6} placeholder="请填写原因" />
</Form.Item>
</Form>
</Modal>
</PageHeaderWrapper>
)
}
export default AccountDetail
.repayment {
padding: 56px 24px 33px;
display: flex;
align-items: center;
background: #8777D9;
border-radius: 4px;
border: 1px solid #8777D9;
color: #fff;
&-left {
flex: 1;
}
&-right {
flex-shrink: 0;
}
&-end {
margin-top: 32px;
}
&-action {
margin-left: 24px;
}
&-time {
line-height: 22px;
margin-right: 8px;
font-weight: 400;
}
}
.statistic {
&-title {
margin-bottom: 28px;
line-height: 22px;
font-weight: 400;
}
&-amount {
line-height: 40px;
font-size: 32px;
font-weight: 500;
}
&-input {
display: block !important;
width: 180px !important;
line-height: 40px !important;
padding: 8px 0 !important;
font-size: 32px !important;
font-weight: 500 !important;
color: #fff !important;
background: none !important;
border-top: none !important;
border-right: none !important;
border-left: none !important;
border-image: initial !important;
outline: none !important;
border-bottom: 1px solid #fff !important;
}
}
.infoRight {
margin: 35px 0;
.rightTitle {
height: 36px;
font-weight: 400;
color: #6B778C;
line-height: 36px;
}
.rightInfo {
height: 36px;
font-weight: 500;
color: #303133;
line-height: 36px;
}
}
.repayinfo {
background-color: #4279DF;
}
// 账户详情右侧操作按钮
.rightActions {
display: flex;
margin-top: 70px;
.rightAction {
width: 88px;
height: 40px;
&:last-child{
background-color: #6B778C;
color: #fff;
margin-left: 24px;
}
}
}
\ No newline at end of file
import React, { useState, useEffect, useRef } from 'react'
import { Card, Space, Button, Input, Modal, Form } from 'antd'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import { StandardTable } from 'god'
import { ColumnType } from 'antd/lib/table/interface'
import { PublicApi } from '@/services/api'
import NiceForm from '@/components/NiceForm'
import { createFormActions, FormEffectHooks } from '@formily/antd'
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch'
import { searchSchema } from './schema'
import { FORM_FILTER_PATH } from '@/formSchema/const'
import { PlusOutlined } from '@ant-design/icons'
import EyePreview from '@/components/EyePreview'
import { DatePicker } from '@formily/antd-components'
import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect'
import StatusTag from '@/components/StatusTag'
import { accountMemberType, accountStatusMap, memberStatusMap } from '../constant'
import LevelBrand from '@/pages/member/components/LevelBrand'
import { validatorByte } from '@/utils/regExp'
const formActions = createFormActions();
const { TextArea } = Input;
const AccountLists: React.FC<{}> = () => {
const ref = useRef<any>({})
const [checkForm] = Form.useForm()
const [currentRecord, setCurrentRecord] = useState<any>()
const [visibleModal, setVisibleModal] = useState<boolean>(false)
const columns: ColumnType<any>[] = [
{
title: '会员名称',
dataIndex: 'memberName',
key: 'memberName',
className: 'commonPickColor',
render: (text, record) => <>
<EyePreview
url={`/capitalAccount/accountLists/details?id=${record.id}`}
>
{text}
</EyePreview>
</>
},
{
title: '会员类型',
dataIndex: 'memberType',
key: 'memberType',
render: (t, r) => accountMemberType[t]
},
{
title: '会员角色',
dataIndex: 'memberRoleName',
key: 'memberRoleName',
},
{
title: '会员等级',
dataIndex: 'memberLevel',
key: 'memberLevel',
render: (t, r) => <LevelBrand level={r.level} />
},
{
title: '账户余额',
dataIndex: 'accountBalance',
key: 'accountBalance',
render: text => `¥${text.toFixed(2)}`
},
{
title: '锁定余额',
dataIndex: 'lockBalance',
key: 'lockBalance',
render: text => `¥${text.toFixed(2)}`
},
{
title: '可用余额',
dataIndex: 'usableBalance',
key: 'usableBalance',
render: (t, r) => `¥${((r.accountBalance*100 - r.lockBalance*100)/100).toFixed(2)}`
},
{
title: '会员状态',
dataIndex: 'memberStatus',
key: 'memberStatus',
render: (t, r) => (<StatusTag title={memberStatusMap[t]['title']} type={memberStatusMap[t]['type']} />)
},
{
title: '账户状态',
dataIndex: 'accountStatus',
key: 'accountStatus',
render: (t, r) => (<><span className={accountStatusMap[t]['className']}></span>{accountStatusMap[t]['title']}</>)
},
{
title: '操作',
dataIndex: 'option',
render: (t: any, r: any) => (
<Button type='link' onClick={() => handleRow(r)}>{r.accountStatus===1?'冻结':'解除'}</Button>
)
}
]
const handleRow = (data: any) => {
setCurrentRecord(data)
setVisibleModal(true)
}
const fetchData = (params: any) => {
console.log(params)
return new Promise((resolve, reject) => {
let obj = { ...params }
PublicApi.getPayPlatFormAssetAccountGetPlatFormAssetAccountList(obj).then(res => {
resolve(res.data)
})
})
}
// 会员弹框筛选select值
const fetchSelectOptions = async () => {
const res = await PublicApi.getMemberManagePageitems()
if (res.code === 1000) {
const { data = {} }: any = res
const {
memberTypes = [],
roles = [],
levels = [],
} = data
return {
memberType: memberTypes.map(item => ({ label: item.memberTypeName, value: item.memberTypeId })),
memberRoleId: roles.map(item => ({ label: item.roleName, value: item.roleId })),
memberLevel: levels.map(item => ({ label: item.levelTag, value: item.level })),
}
}
return {}
}
const handleCancel = () => {
setVisibleModal(false)
}
const handleOK = () => {
checkForm.validateFields().then(values => {
setVisibleModal(false)
PublicApi.postPayPlatFormAssetAccountUpdateMemberAssetAccountEnable({ id: currentRecord.id, status: currentRecord.accountStatus === 1 ? 2 : 1, ...values }).then(res => {
if(res.code === 1000)
ref.current.reload()
})
})
}
return (
<PageHeaderWrapper>
<Card>
<StandardTable
columns={columns}
currentRef={ref}
tableProps={{ rowKey: "id" }}
fetchTableData={(params: any) => fetchData(params)}
controlRender={
<NiceForm
components={{
RangePicker: DatePicker.RangePicker
}}
actions={formActions}
onSubmit={values => ref.current.reload(values)}
effects={($, actions) => {
useStateFilterSearchLinkageEffect(
$,
actions,
'memberName',
FORM_FILTER_PATH,
);
useAsyncInitSelect(
['memberType', 'memberRoleId', 'memberLevel'],
fetchSelectOptions,
);
}}
schema={searchSchema}
/>
}
/>
</Card>
<Modal
title={currentRecord?.accountStatus === 1 ? '会员冻结' : '会员解冻'}
visible={visibleModal}
onOk={handleOK}
onCancel={handleCancel}
destroyOnClose={true}
>
<Form
layout="vertical"
form={checkForm}
>
<Form.Item
name="remark"
label={currentRecord?.accountStatus === 1 ? '会员冻结原因' : '会员解冻原因'}
rules={[
{
required: true,
message: '请填写原因'
},
{
validator: (r, v, c) => validatorByte(r, v, c, 120)
}
]}
>
<TextArea rows={6} placeholder="请填写原因" />
</Form.Item>
</Form>
</Modal>
</PageHeaderWrapper>
)
}
export default AccountLists
import { ISchema } from '@formily/antd'; import { ISchema } from '@formily/antd';
import { FORM_FILTER_PATH } from '@/formSchema/const'; import { FORM_FILTER_PATH } from '@/formSchema/const';
export const auditSchema: ISchema = { export const searchSchema: ISchema = {
type: 'object', type: 'object',
properties: { properties: {
MEGA_LAYOUT: { mageLayout: {
type: 'object', type: 'object',
'x-component': 'mega-layout', 'x-component': 'mega-layout',
properties: { properties: {
...@@ -15,18 +15,12 @@ export const auditSchema: ISchema = { ...@@ -15,18 +15,12 @@ export const auditSchema: ISchema = {
grid: true, grid: true,
}, },
properties: { properties: {
ctl: { memberName: {
type: 'object',
'x-component': 'Children',
'x-component-props': {
children: '{{controllerBtns}}',
},
},
name: {
type: 'string', type: 'string',
'x-component': 'Search', 'x-component': 'Search',
'x-component-props': { 'x-component-props': {
placeholder: '搜索', placeholder: '会员名称',
align: 'flex-left',
}, },
}, },
}, },
...@@ -35,64 +29,78 @@ export const auditSchema: ISchema = { ...@@ -35,64 +29,78 @@ export const auditSchema: ISchema = {
type: 'object', type: 'object',
'x-component': 'flex-layout', 'x-component': 'flex-layout',
'x-component-props': { 'x-component-props': {
rowStyle: {
flexWrap: 'nowrap',
justifyContent: 'end',
},
colStyle: { colStyle: {
marginLeft: 20, marginRight: 20,
}, },
}, },
properties: { properties: {
memberTypeId: { memberType: {
type: 'string', type: 'string',
default: undefined,
enum: [], enum: [],
'x-component-props': { "x-component-props": {
placeholder: '会员类型(全部)', placeholder: '请选择会员类型',
allowClear: true, style: {
}, width: 174
}
}
}, },
status: { memberRoleId: {
type: 'string', type: 'string',
default: undefined,
enum: [], enum: [],
'x-component-props': { "x-component-props": {
placeholder: '会员状态(全部)', placeholder: '请选择会员角色',
allowClear: true, style: {
}, width: 174
}
}
}, },
roleId: { memberLevel: {
type: 'string', type: 'string',
default: undefined,
enum: [], enum: [],
'x-component-props': { "x-component-props": {
placeholder: '会员角色(全部)', placeholder: '请选择会员等级',
allowClear: true, style: {
}, width: 174
}, }
level: { }
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '会员等级(全部)',
allowClear: true,
},
}, },
source: { memberStatus: {
type: 'string', type: 'string',
default: undefined,
enum: [],
'x-component-props': { 'x-component-props': {
placeholder: '申请来源(全部)', placeholder: '会员状态',
allowClear: true, style: { width: '174px' },
}, },
enum: [
{
label: '正常',
value: 1,
},
{
label: '已冻结',
value: 2,
}
],
}, },
'[startDate, endDate]': { accountStatus: {
type: 'string', type: 'string',
default: '',
'x-component': 'dateSelect',
'x-component-props': { 'x-component-props': {
placeholder: '时间范围(全部)', placeholder: '账户状态',
allowClear: true, style: { width: '174px' },
}, },
enum: [
{
label: '正常',
value: 1,
},
{
label: '已冻结',
value: 2,
}
],
}, },
submit: { submit: {
'x-component': 'Submit', 'x-component': 'Submit',
...@@ -110,43 +118,49 @@ export const auditSchema: ISchema = { ...@@ -110,43 +118,49 @@ export const auditSchema: ISchema = {
}, },
}; };
export const auditModalSchema: ISchema = { export const rechargeSchema: ISchema = {
type: 'object', type: 'object',
properties: { properties: {
MEGA_LAYOUT: { NO_SUBMIT: {
type: 'object', type: 'object',
'x-component': 'mega-layout', "x-component": "mega-layout",
'x-component-props': { "x-component-props": {
labelAlign: 'top', labelAlign: 'left',
labelCol: 24,
wrapperCol: 24
}, },
properties: { properties: {
agree: { money: {
type: 'string', type: "string",
default: 1, title: '充值金额',
enum: [
{ label: '审核通过', value: 1 },
{ label: '审核不通过', value: 0 },
],
'x-component': 'radio',
'x-component-props': {},
},
reason: {
type: 'string',
title: '审核不通过原因',
required: true,
'x-component': 'textarea',
'x-component-props': { 'x-component-props': {
placeholder: '在此输入你的内容,最长120个字符,60个汉字', addonBefore: "¥"
rows: 5,
}, },
'x-rules': [ "x-rules": [
{ {
limitByte: true, // 自定义校验规则 required: true,
maxByte: 120, message: '请输入充值金额'
},
]
},
type: {
type: "array:number",
"x-component": 'CardCheckBox',
"x-component-props": {
dataSource: [],
type: 'radio' // CardCheckBox 单选模式
},
"title": "充值方式",
"x-rules": [
{
required: true,
message: '请选择充值方式'
} }
], ],
}, }
},
}, }
}, }
}; }
}
\ No newline at end of file
import React, { useState, useEffect, useRef, ReactNode } from 'react'
import { history } from 'umi'
import { Card, Space, Steps, Row, Col, Button, InputNumber, Table, Form, Modal, Radio, Input } from 'antd'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import ReutrnEle from '@/components/ReturnEle'
import styles from './index.less'
import StatusTag from '@/components/StatusTag'
import cx from 'classnames'
import moment from 'moment'
import { ColumnType } from 'antd/lib/table/interface'
import { memberStatusMap, operationMap, statusMap } from '../constant'
import { CheckSquareOutlined } from '@ant-design/icons'
import { PublicApi } from '@/services/api'
import { GetSettleAccountsCorporateAccountConfigResponse } from '@/services/SettleApi'
import { StandardTable } from 'god'
const { Step } = Steps;
const { TextArea } = Input;
const CheckDetail: React.FC<{}> = () => {
const refTrade = useRef<any>({})
const [checkForm] = Form.useForm();
const [visibleModal, setVisibleModal] = useState<boolean>(false)
const [checkStatus, setCheckStatus] = useState<number>(1)
const [disableCheck, setDisableCheck] = useState<boolean>(false)
const [confirmLoading, setConfirmLoading] = useState<boolean>(false)
const [details, setDetails] = useState<any>({ accountBalance: 0, lockBalance: 0})
const [bankDetail, setBankDetail] = useState<GetSettleAccountsCorporateAccountConfigResponse>()
const [tempStatus, setTempStatus] = useState<number>(0)
useEffect(() => {
getAccountInfo()
}, [])
const { detailinfo } = history.location.query
let urlParams: any = JSON.parse(atob(detailinfo))
const getAccountInfo = async () => {
let res = await PublicApi.getPayPlatFormAssetAccountGetPlatFormAssetAccount({id: urlParams.id})
const { code, data } = res
setDetails(data)
if(code === 1000) {
let bankRes = await PublicApi.getSettleAccountsCorporateAccountConfig({memberId: data.memberId + ''})
setBankDetail(bankRes.data)
}
}
// 获取提现处理记录
const fetchTradeData = (params) => {
return new Promise((resolve, reject) => {
PublicApi.getPayPlatFormAssetAccountGetCashOutRecordList({tradeCode: urlParams.tradeCode, ...params}).then(res => {
const { data } = res
resolve(data)
})
})
}
const columns: ColumnType<any>[] = [
{
title: '交易流水号',
dataIndex: 'tradeCode',
key: 'tradeCode',
},
{
title: '交易时间',
dataIndex: 'tradeTime',
key: 'tradeTime',
render: (text: any) => moment(text).format("YYYY-MM-DD HH:mm:ss")
},
{
title: '交易金额(元)',
dataIndex: 'tradeMoney',
key: 'tradeMoney',
render: (t, r) => `${operationMap[r.operation]['operator']} ${t.toFixed(2)}`
},
{
title: '交易项目',
dataIndex: 'operation',
key: 'operation',
render: (t, r) => operationMap[t]['title']
},
{
title: '状态',
dataIndex: 'status',
key: 'status',
render: (text:any, record:any) => (<StatusTag title={statusMap[text]['title']} type={statusMap[text]['type']} />)
},
{
title: '意见',
dataIndex: 'remark',
key: 'remark',
},
];
const handleStatusChange = (value: any) => {
setCheckStatus(value.target.value)
}
const handleOK = () => {
checkForm.validateFields().then(values => {
setConfirmLoading(true)
// @ts-ignore
PublicApi.postPayPlatFormAssetAccountCheck({ id: urlParams.tradeId ,...values}).then(res => {
if(res.code === 1000) {
setDisableCheck(true)
getAccountInfo()
refTrade.current.reload()
setTempStatus(values.status)
}else{
setDisableCheck(false)
}
setVisibleModal(false)
})
})
}
const handleCancel = () => {
checkForm.resetFields()
setVisibleModal(false)
}
return (
<PageHeaderWrapper
title="审核提现"
onBack={() => history.goBack()}
backIcon={<ReutrnEle />}
extra={ urlParams.preview ? [] : [
<Button
icon={<CheckSquareOutlined />}
key="1"
type="primary"
onClick={()=>setVisibleModal(true)}
disabled={disableCheck}
>
审核提现
</Button>
]}
>
<Space direction="vertical" style={{width:'100%'}}>
<Card headStyle={{borderBottom:'none'}} title="外部流转">
<Steps progressDot current={urlParams.status === 2 || tempStatus === 1 ? 2 : 1}>
<Step title="申请提现" description="采购商" />
<Step title="审核提现" description="平台" />
<Step title="支付提现" description="平台" />
<Step title="完成" description="" />
</Steps>
</Card>
</Space>
<Space direction="vertical" style={{width:'100%'}}>
<Card headStyle={{borderBottom:'none'}} title="账户提现">
<Row gutter={100}>
<Col span={8}>
<div className={styles.repayment}>
<div className={styles['repayment-left']}>
<div className={styles.statistic}>
<div className={styles['statistic-title']}>提现金额(元):</div>
<div style={{display: 'flex',alignItems:'flex-end'}}>
<InputNumber
disabled={true}
defaultValue={urlParams.amount}
formatter={value => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
parser={value => value.replace(/\$\s?|(,*)/g, '')}
className={styles['statistic-input']}
precision={2}
min={0}
/>
</div>
</div>
<div className={styles['repayment-end']}>
<span className={styles['repayment-time']}>
最多可以提现:¥ {((details.accountBalance*100 - details.lockBalance*100)/100).toFixed(2)}
</span>
</div>
</div>
</div>
</Col>
<Col span={16}>
<div className={styles.infoRight}>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>账户归属:</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>{bankDetail?.name}</p>
</Col>
</Row>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>银行账号:</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>{bankDetail?.bankAccount}</p>
</Col>
</Row>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>开户行:</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>{bankDetail?.bankDeposit}</p>
</Col>
</Row>
</div>
</Col>
</Row>
</Card>
</Space>
<Space direction="vertical" style={{width:'100%'}}>
<Card headStyle={{borderBottom:'none'}} title="账户信息">
<Row gutter={100}>
<Col span={8}>
<div className={cx(styles.repayment, styles.repayinfo)}>
<div className={styles['repayment-left']}>
<div className={styles.statistic}>
<div className={styles['statistic-title']}>可用余额(元):</div>
<div className={styles['statistic-amount']}>
{`${((details.accountBalance*100 - details.lockBalance*100)/100).toFixed(2)}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
</div>
</div>
<div className={styles['repayment-end']}>
<span className={styles['repayment-time']}>
{details?.memberName}
</span>
</div>
</div>
</div>
</Col>
<Col span={16}>
<div className={styles.infoRight}>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>账户归属:</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>{details?.parentMemberName}</p>
</Col>
</Row>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>账户余额(元):</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>{details?.accountBalance?.toFixed(2)}</p>
</Col>
</Row>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>锁定金额(元):</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>{details?.lockBalance?.toFixed(2)}</p>
</Col>
</Row>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>账户状态:</p>
</Col>
<Col span={20}>
{
details?.accountStatus &&
<StatusTag title={memberStatusMap[details.accountStatus]['title']} type={memberStatusMap[details.accountStatus]['type']} />
}
</Col>
</Row>
</div>
</Col>
</Row>
</Card>
</Space>
<Space direction="vertical" style={{width:'100%'}}>
<Card headStyle={{borderBottom:'none'}} title="提现处理记录">
<StandardTable
columns={columns}
currentRef={refTrade}
fetchTableData={(params: any) => fetchTradeData(params)}
/>
</Card>
</Space>
<Modal
title="审核提现"
visible={visibleModal}
onOk={handleOK}
onCancel={handleCancel}
confirmLoading={confirmLoading}
>
<Form
layout="vertical"
form={checkForm}
>
<Form.Item
name="status"
label=""
rules={[
{
required: true,
message: '请选择审核状态'
}
]}
initialValue={1}
>
<Radio.Group onChange={handleStatusChange}>
<Radio value={1}>审核通过</Radio>
<Radio value={2}>审核不通过</Radio>
</Radio.Group>
</Form.Item>
{
checkStatus===2 && <Form.Item
name="remark"
label={'审核不通过原因'}
rules={[
{
required: true,
message: '请填写原因'
}
]}
>
<TextArea rows={3} placeholder="请填写原因" />
</Form.Item>
}
</Form>
</Modal>
</PageHeaderWrapper>
)
}
export default CheckDetail
.repayment {
padding: 56px 24px 33px;
display: flex;
align-items: center;
background: #8777D9;
border-radius: 4px;
border: 1px solid #8777D9;
color: #fff;
&-left {
flex: 1;
}
&-right {
flex-shrink: 0;
}
&-end {
margin-top: 32px;
}
&-action {
margin-left: 24px;
}
&-time {
line-height: 22px;
margin-right: 8px;
font-weight: 400;
}
}
.statistic {
&-title {
margin-bottom: 28px;
line-height: 22px;
font-weight: 400;
}
&-amount {
line-height: 40px;
font-size: 32px;
font-weight: 500;
}
&-input {
display: block;
width: 180px;
line-height: 40px;
padding: 8px 0;
font-size: 32px;
font-weight: 500;
color: #fff;
background: none;
border-top: none;
border-right: none;
border-left: none;
border-image: initial;
outline: none;
border-bottom: 1px solid #fff;
}
}
.infoRight {
margin: 35px 0;
.rightTitle {
height: 36px;
font-weight: 400;
color: #6B778C;
line-height: 36px;
}
.rightInfo {
height: 36px;
font-weight: 500;
color: #303133;
line-height: 36px;
}
}
.repayinfo {
background-color: #4279DF;
}
\ No newline at end of file
import React, { useState, useEffect, useRef } from 'react'
import { history } from 'umi'
import { Card, Space, Button, Modal, message } from 'antd'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import { StandardTable } from 'god'
import { ColumnType } from 'antd/lib/table/interface'
import { PublicApi } from '@/services/api'
import NiceForm from '@/components/NiceForm'
import { createFormActions, FormEffectHooks } from '@formily/antd'
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch'
import { searchSchema } from './schema'
import { FORM_FILTER_PATH } from '@/formSchema/const'
import EyePreview from '@/components/EyePreview'
import { DatePicker } from '@formily/antd-components'
import StatusTag from '@/components/StatusTag'
import { statusMap } from '../constant'
import moment from 'moment'
import { useRowSelectionTable } from '@/hooks/useRowSelectionTable'
import { ExclamationCircleOutlined } from '@ant-design/icons'
const { confirm } = Modal
const formActions = createFormActions();
const CheckWithdraw: React.FC<{}> = () => {
const ref = useRef<any>({})
const [withdrawRowSelection, withdrawRowCtl] = useRowSelectionTable()
const columns: ColumnType<any>[] = [
{
title: '会员名称',
dataIndex: ['memberAssetAccount', 'memberName'],
key: 'memberAssetAccount',
className: 'commonPickColor',
render: (text, record) => <EyePreview
type="button"
handleClick={()=>clickUp({...record, preview: true})}
>
{text}
</EyePreview>
},
{
title: '提现银行账户名称',
dataIndex: 'bankAccountName',
key: 'bankAccountName',
},
{
title: '银行账号',
dataIndex: 'bankAccount',
key: 'bankAccount',
},
{
title: '提现金额(元)',
dataIndex: 'tradeMoney',
key: 'tradeMoney',
render: (t, r) => t.toFixed(2)
},
{
title: '提现申请时间',
dataIndex: 'tradeTime',
key: 'tradeTime',
render: (t, r) => moment(t).format('YYYY-MM-DD HH:mm:ss'),
// sorter: (a, b) => b.tradeTime - a.tradeTime,
// defaultSortOrder: "ascend"
},
{
title: '状态',
dataIndex: 'status',
key: 'status',
render: (t, r) => (<StatusTag title={statusMap[t]['title']} type={statusMap[t]['type']} />)
},
{
title: '操作',
dataIndex: 'option',
render: (t, r) => <>{r.status === 1 && <Button type='link' onClick={()=>clickUp(r)}>审核</Button>}</>
}
]
const fetchData = (params: any) => {
console.log(params)
return new Promise((resolve, reject) => {
let obj = { ...params }
PublicApi.getPayPlatFormAssetAccountGetCheckCashOutList(obj).then(res => {
resolve(res.data)
})
})
}
const clickUp = (r: any) => {
let params = {
tradeCode: r.tradeCode,
id: r.memberAssetAccount.id,
tradeId: r.id,
amount: r.tradeMoney,
preview: r.preview,
status: r.status,
}
history.push(`/capitalAccount/checkWithdraw/details?detailinfo=${btoa(JSON.stringify(params))}`)
}
const handleBatchCheck = () => {
if(withdrawRowCtl.selectedRowKeys.length > 0){
confirm({
title: '确定要执行批量审核操作?',
icon: <ExclamationCircleOutlined />,
onOk() {
PublicApi.postPayPlatFormAssetAccountBatchCheck({ idList: withdrawRowCtl.selectedRowKeys }).then(res => {
ref.current.reload()
})
},
okType: 'danger',
onCancel() {
console.log('Cancel');
},
okText: '确定',
cancelText: '取消'
})
}else{
message.error('请先选择对应项目进行操作!')
}
}
const controllerBtns = (
<Space>
<Button onClick={handleBatchCheck}>
批量审核通过
</Button>
</Space>
);
return (
<PageHeaderWrapper>
<Card>
<StandardTable
columns={columns}
currentRef={ref}
tableProps={{ rowKey: "id" }}
rowSelection={withdrawRowSelection}
fetchTableData={(params: any) => fetchData(params)}
controlRender={
<NiceForm
components={{
RangePicker: DatePicker.RangePicker
}}
actions={formActions}
onSubmit={values => ref.current.reload(values)}
effects={($, actions) => {
useStateFilterSearchLinkageEffect(
$,
actions,
'memberName',
FORM_FILTER_PATH,
);
}}
schema={searchSchema}
expressionScope={{
controllerBtns,
}}
/>
}
/>
</Card>
</PageHeaderWrapper>
)
}
export default CheckWithdraw
import { ISchema } from '@formily/antd'; import { ISchema } from '@formily/antd';
import { FORM_FILTER_PATH } from '@/formSchema/const'; import { FORM_FILTER_PATH } from '@/formSchema/const';
export const auditSchema: ISchema = { export const searchSchema: ISchema = {
type: 'object', type: 'object',
properties: { properties: {
MEGA_LAYOUT: { mageLayout: {
type: 'object', type: 'object',
'x-component': 'mega-layout', 'x-component': 'mega-layout',
properties: { properties: {
...@@ -22,11 +22,11 @@ export const auditSchema: ISchema = { ...@@ -22,11 +22,11 @@ export const auditSchema: ISchema = {
children: '{{controllerBtns}}', children: '{{controllerBtns}}',
}, },
}, },
name: { memberName: {
type: 'string', type: 'string',
'x-component': 'Search', 'x-component': 'Search',
'x-component-props': { 'x-component-props': {
placeholder: '搜索', placeholder: '会员名称',
}, },
}, },
}, },
...@@ -35,63 +35,49 @@ export const auditSchema: ISchema = { ...@@ -35,63 +35,49 @@ export const auditSchema: ISchema = {
type: 'object', type: 'object',
'x-component': 'flex-layout', 'x-component': 'flex-layout',
'x-component-props': { 'x-component-props': {
// rowStyle: {
// flexWrap: 'nowrap',
// justifyContent: 'end',
// },
colStyle: { colStyle: {
marginLeft: 20, marginRight: 20,
}, },
}, },
properties: { properties: {
memberTypeId: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '会员类型(全部)',
allowClear: true,
},
},
status: { status: {
type: 'string', type: 'string',
default: undefined,
enum: [],
'x-component-props': { 'x-component-props': {
placeholder: '会员状态(全部)', placeholder: '状态',
allowClear: true, style: { width: '174px' },
}, },
enum: [
{
label: '申请提现',
value: 1,
},
{
label: '审核通过',
value: 2,
},
{
label: '审核不通过',
value: 3,
},
// {
// label: '提现成功',
// value: 4,
// },
// {
// label: '提现失败',
// value: 5,
// }
],
}, },
roleId: { "[startTime,endTime]": {
type: 'string', type: 'array',
default: undefined, "x-component": 'RangePicker',
enum: [],
'x-component-props': {
placeholder: '会员角色(全部)',
allowClear: true,
},
},
level: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '会员等级(全部)',
allowClear: true,
},
},
source: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '申请来源(全部)',
allowClear: true,
},
},
'[startDate, endDate]': {
type: 'string',
default: '',
'x-component': 'dateSelect',
'x-component-props': { 'x-component-props': {
placeholder: '时间范围(全部)', placeholder: ['开始时间','结束时间'],
allowClear: true,
}, },
}, },
submit: { submit: {
...@@ -108,52 +94,4 @@ export const auditSchema: ISchema = { ...@@ -108,52 +94,4 @@ export const auditSchema: ISchema = {
}, },
}, },
}, },
}; };
\ No newline at end of file
export const auditModalSchema: ISchema = {
type: 'object',
properties: {
MEGA_LAYOUT: {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
labelAlign: 'top',
},
properties: {
agree: {
type: 'string',
default: 1,
enum: [
{
label: '审核通过',
value: 1,
disabled: false,
},
{
label: '审核不通过',
value: 0,
},
],
'x-component': 'radio',
'x-component-props': {},
},
reason: {
type: 'string',
title: '审核不通过原因',
required: true,
'x-component': 'textarea',
'x-component-props': {
placeholder: '在此输入你的内容,最长120个字符,60个汉字',
rows: 5,
},
'x-rules': [
{
limitByte: true, // 自定义校验规则
maxByte: 120,
}
],
},
},
},
},
};
/**
* 资金账户相关常量
*/
// 交易记录状态
export const statusMap = {
'1': { title: '申请提现', type: 'warning' },
'2': { title: '审核通过', type: 'success' },
'3': { title: '审核不通过', type: 'default' },
'4': { title: '提现成功', type: 'success' },
'5': { title: '提现失败', type: 'danger' },
'6': { title: '确认到账', type: 'success' },
}
// 流转状态
export const moveStatusMap = {
'1': { title: '冻结', type: 'danger' },
'2': { title: '解冻', type: 'success' },
}
// 会员状态
export const memberStatusMap = {
'1': { title: '正常', type: 'success' },
'2': { title: '已冻结', type: 'danger' },
}
// 账户状态
export const accountStatusMap = {
'1': { title: '正常', className: 'commonStatusValid' },
'2': { title: '已冻结', className: 'commonStatusNoPass' },
}
// 会员等级类型
export const memberLevelTypeMap = {
'1': '平台会员',
'2': '商户会员',
'3': '渠道会员',
}
// 操作项目
export const operationMap = {
'1': {title: '账户充值', operator: '+'},
'2': {title: '账户提现', operator: '-'},
'3': {title: '订单支付', operator: '-'},
'4': {title: '订单退款', operator: '+'},
'5': {title: '订单返利', operator: '+'}
}
// 会员类型
export const accountMemberType = {
'1': '企业会员',
'2': '企业个人会员',
'3': '渠道会员',
'4': '渠道个人会员',
}
\ No newline at end of file
import React, { useEffect, useState } from 'react'
import { Row, Col } from 'antd';
import styled from 'styled-components'
import { findItemAndDelete } from '@/utils'
import cx from 'classnames'
const RowStyleLayout = styled(props => <div {...props} />)`
.card-checkbox-item {
width: 130px;
height: 32px;
margin-right: 32px;
margin-bottom: 16px;
border:1px solid rgba(235,236,240,1);
padding: 0 16px;
display: flex;
align-items: center;
cursor: pointer;
}
.card-checkbox-item.active {
border-color: #00B382;
position: relative;
}
.card-checkbox-item.active::after {
content: '';
position: absolute;
bottom: 0;
right: 0;
width: 0;
height: 0;
border: 6px solid transparent;
border-right: 6px solid #00B382;
border-bottom: 6px solid #00B382;
}
.card-logo {
display: block;
width: 20px;
height: 20px;
border-radius: 50%;
margin-right: 6px;
}
.card-checkbox-title {
font-size: 12px;
color: #606266;
}
`
interface IProps {
dataSource: any[],
cardChange: any,
name: string,
type?: string,
editable?: boolean,
}
const CardCheckBox = (props: IProps) => {
const { dataSource = [], type = 'checkbox', editable = true, cardChange, name } = props
const [value, setValue] = useState<any>([])
useEffect(() => {
let transport = {}
transport[name] = value[0]
cardChange(transport)
}, [value])
const handleChange = (id) => {
if (!editable) {
return false
}
if (value.includes(id)) {
const newValue = findItemAndDelete(value, id)
setValue(newValue)
} else {
// type === 'radio' ? props.mutators.change([id]) : props.mutators.change([...value, id])
type === 'radio' ? setValue([id]) : setValue([...value, id])
}
}
const isChecked = (id) => {
return value.includes(id)
}
return (
<RowStyleLayout>
<div className='card-checkbox'>
{
dataSource.map(({title, items}, index) => (
<Row key={index}>
<Col span={6}>
<p>{title}</p>
</Col>
<Col span={18}>
<Row>
{
items.length > 0 && items.map((v, i) =>
<Col key={v.id} className={cx('card-checkbox-item', isChecked(v.id) ? 'active' : '')} onClick={() => handleChange(v.id)}>
{v.logoUrl ? <img className='card-logo' src={v.logoUrl} /> : null}
<span className='card-checkbox-title'>{v.name}</span>
</Col>
)
}
</Row>
</Col>
</Row>
))
}
</div>
</RowStyleLayout>
)
}
CardCheckBox.defaultProps = {}
export default CardCheckBox
\ No newline at end of file
.repayment {
padding: 56px 24px 33px;
display: flex;
align-items: center;
background: #8777D9;
border-radius: 4px;
border: 1px solid #8777D9;
color: #fff;
&-left {
flex: 1;
}
&-right {
flex-shrink: 0;
}
&-end {
margin-top: 32px;
}
&-action {
margin-left: 24px;
}
&-time {
line-height: 22px;
margin-right: 8px;
font-weight: 400;
}
}
.statistic {
&-title {
margin-bottom: 28px;
line-height: 22px;
font-weight: 400;
}
&-amount {
line-height: 40px;
font-size: 32px;
font-weight: 500;
}
&-input {
display: block;
width: 180px;
line-height: 40px;
padding: 8px 0;
font-size: 32px;
font-weight: 500;
color: #fff;
background: none;
border-top: none;
border-right: none;
border-left: none;
border-image: initial;
outline: none;
border-bottom: 1px solid #fff;
}
}
.infoRight {
margin: 35px 0;
.rightTitle {
height: 36px;
font-weight: 400;
color: #6B778C;
line-height: 36px;
}
.rightInfo {
height: 36px;
font-weight: 500;
color: #303133;
line-height: 36px;
}
}
.repayinfo {
background-color: #4279DF;
}
// 支付详情错误提示
.errorTips {
color: red;
}
\ No newline at end of file
import React, { useState, useEffect, useRef } from 'react'
import { history } from 'umi'
import { Card, Space, Button, } from 'antd'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import { StandardTable } from 'god'
import { ColumnType } from 'antd/lib/table/interface'
import { PublicApi } from '@/services/api'
import NiceForm from '@/components/NiceForm'
import { createFormActions, FormEffectHooks } from '@formily/antd'
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch'
import { searchSchema } from './schema'
import { FORM_FILTER_PATH } from '@/formSchema/const'
import EyePreview from '@/components/EyePreview'
import { DatePicker } from '@formily/antd-components'
import StatusTag from '@/components/StatusTag'
import { statusMap } from '../constant'
import moment from 'moment'
const formActions = createFormActions();
const PaymentWithdraw: React.FC<{}> = () => {
const ref = useRef<any>({})
const columns: ColumnType<any>[] = [
{
title: '会员名称',
dataIndex: ['memberAssetAccount', 'memberName'],
key: 'memberAssetAccount',
className: 'commonPickColor',
render: (text, record) => <EyePreview
type="button"
handleClick={()=>clickUp({...record, preview: true})}
>
{text}
</EyePreview>
},
{
title: '提现银行账户名称',
dataIndex: 'bankAccountName',
key: 'bankAccountName',
},
{
title: '银行账号',
dataIndex: 'bankAccount',
key: 'bankAccount',
},
{
title: '提现金额(元)',
dataIndex: 'tradeMoney',
key: 'tradeMoney',
render: (t, r) => `¥${t.toFixed(2)}`
},
{
title: '提现申请时间',
dataIndex: 'tradeTime',
key: 'tradeTime',
render: (t, r) => moment(t).format('YYYY-MM-DD HH:mm:ss')
},
{
title: '状态',
dataIndex: 'status',
key: 'status',
render: (t, r) => (<StatusTag title={statusMap[t]['title']} type={statusMap[t]['type']} />)
},
{
title: '操作',
dataIndex: 'option',
render: (t, r) => <>{r.status !== 4 && <Button type='link' onClick={()=>clickUp(r)}>支付</Button>}</>
}
]
const fetchData = (params: any) => {
console.log(params)
return new Promise((resolve, reject) => {
let obj = { ...params }
PublicApi.getPayPlatFormAssetAccountGetPayCashOutList(obj).then(res => {
resolve(res.data)
})
})
}
const clickUp = (r: any) => {
let params = {
tradeCode: r.tradeCode,
id: r.memberAssetAccount.id,
payId: r.id,
amount: r.tradeMoney,
preview: r.preview,
status: r.status,
}
history.push(`/capitalAccount/paymentWithdraw/details?detailinfo=${btoa(JSON.stringify(params))}`)
}
return (
<PageHeaderWrapper>
<Card>
<StandardTable
columns={columns}
currentRef={ref}
tableProps={{ rowKey: "id" }}
fetchTableData={(params: any) => fetchData(params)}
controlRender={
<NiceForm
components={{
RangePicker: DatePicker.RangePicker
}}
actions={formActions}
onSubmit={values => ref.current.reload(values)}
effects={($, actions) => {
useStateFilterSearchLinkageEffect(
$,
actions,
'memberName',
FORM_FILTER_PATH,
);
}}
schema={searchSchema}
/>
}
/>
</Card>
</PageHeaderWrapper>
)
}
export default PaymentWithdraw
import React, { useState, useEffect, useRef, ReactNode } from 'react'
import { history } from 'umi'
import { Card, Space, Steps, Row, Col, Button, InputNumber, Table, Result, Modal, Radio, Input } from 'antd'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import ReutrnEle from '@/components/ReturnEle'
import styles from './index.less'
import StatusTag from '@/components/StatusTag'
import cx from 'classnames'
import moment from 'moment'
import { ColumnType } from 'antd/lib/table/interface'
import { memberStatusMap, operationMap, statusMap } from '../constant'
import { CheckSquareOutlined } from '@ant-design/icons'
import CapitalCardCheckBox from './components/CardCheckbox'
import confirm_img from '@/asserts/img_confirm.png'
import { PublicApi } from '@/services/api'
import { GetSettleAccountsCorporateAccountConfigResponse } from '@/services/SettleApi'
import { StandardTable } from 'god'
import alipay from '@/asserts/alipay_icon.png';
import wxpay from '@/asserts/wechat_icon.png';
const { Step } = Steps;
const { TextArea } = Input;
const PaymentDetail: React.FC<{}> = () => {
const refTrade = useRef<any>({})
const [visibleModal, setVisibleModal] = useState<boolean>(false)
const [loading, setLoading] = useState<boolean>(false)
const [checkStatus, setCheckStatus] = useState<number>(4)
const [disableCheck, setDisableCheck] = useState<boolean>(false)
const [currentStep, setCurrentStep] = useState<number>(0)
const [payResult, setPayResult] = useState<number>(2)
const [payConfirmLoading, setPayConfirmLoading] = useState<boolean>(false)
const [details, setDetails] = useState<any>({ accountBalance: 0, lockBalance: 0})
const [bankDetail, setBankDetail] = useState<GetSettleAccountsCorporateAccountConfigResponse>()
const [payParam, setPayParam] = useState<any>()
const [errorTips, setErrorTips] = useState<any>({ tipMethod: false, tipChannel: false })
useEffect(() => {
getAccountInfo()
}, [])
const { detailinfo } = history.location.query
let urlParams: any = JSON.parse(atob(detailinfo))
const getAccountInfo = async () => {
let res = await PublicApi.getPayPlatFormAssetAccountGetPlatFormAssetAccount({id: urlParams.id})
const { code, data } = res
setDetails(data)
if(code === 1000) {
let bankRes = await PublicApi.getSettleAccountsCorporateAccountConfig({memberId: data.memberId + ''})
setBankDetail(bankRes.data)
}
}
// 获取提现处理记录
const fetchTradeData = (params) => {
return new Promise((resolve, reject) => {
PublicApi.getPayPlatFormAssetAccountGetCashOutRecordList({tradeCode: urlParams.tradeCode, ...params}).then(res => {
const { data } = res
resolve(data)
})
})
}
const columns: ColumnType<any>[] = [
{
title: '交易流水号',
dataIndex: 'tradeCode',
key: 'tradeCode',
},
{
title: '交易时间',
dataIndex: 'tradeTime',
key: 'tradeTime',
render: (text: any) => moment(text).format("YYYY-MM-DD HH:mm:ss")
},
{
title: '交易金额(元)',
dataIndex: 'tradeMoney',
key: 'tradeMoney',
render: (t, r) => `${operationMap[r.operation]['operator']} ${t.toFixed(2)}`
},
{
title: '交易项目',
dataIndex: 'operation',
key: 'operation',
render: (t, r) => operationMap[t]['title']
},
{
title: '状态',
dataIndex: 'status',
key: 'status',
render: (text:any, record:any) => (<StatusTag title={statusMap[text]['title']} type={statusMap[text]['type']} />)
},
{
title: '意见',
dataIndex: 'remark',
key: 'remark',
},
];
const handleOK = () => {
console.log(payParam, '确认支付参数')
setPayConfirmLoading(true)
// 1-1 支付成功 1-2确认是否已转账 1-other支付失败
if(!payParam?.payType){
setErrorTips({...errorTips, tipMethod: true})
setPayConfirmLoading(false)
}else if(!payParam?.payChannel){
setErrorTips({...errorTips, tipChannel: true})
setPayConfirmLoading(false)
}else{
setErrorTips({tipMethod: false, tipChannel: false})
PublicApi.postPayPlatFormAssetAccountPayCashOut({ id: urlParams.payId, ...payParam },{ctlType: 'none'}).then(res => {
if(res.code === 1000){
setCurrentStep(1)
setPayResult(1)
getAccountInfo()
refTrade.current.reload()
setDisableCheck(true)
}else{
setCurrentStep(1)
setPayResult(3)
}
setPayConfirmLoading(false)
})
}
}
const handleCancel = () => {
setVisibleModal(false)
}
const handleConfirm = () => {
console.log('确认')
setVisibleModal(false)
}
const handleBack = () => {
setCurrentStep(0)
}
const cardChange = (value) => {
console.log(value)
setPayParam(() => {
return {
...payParam,
...value,
}
})
}
const renderModalTitle = () => {
return (
<Steps size="small" current={currentStep} style={{width: '382px',margin: '0 auto'}}>
<Step title="选择支付方式" />
<Step title="进行支付" />
</Steps>
)
}
const renderModalFooter = () => {
let footer: any = null;
if(currentStep){
if(payResult === 2){
footer = [
<Button key="back" onClick={handleBack}>
上一步
</Button>,
<Button key="submit" type="primary" loading={loading} onClick={handleConfirm}>
确认
</Button>,
]
} else {
footer = null
}
} else {
footer = [
<Button key="back" onClick={handleCancel}>
取消
</Button>,
<Button key="submit" type="primary" loading={payConfirmLoading} onClick={handleOK}>
下一步
</Button>,
]
}
return footer;
}
const renderResult = () => {
let node: any = null;
if(payResult === 1) {
node = <Result
status="success"
title="支付成功"
/>
}else if(payResult === 2){
node = <Result
title="确认是否已转账?"
subTitle="线下转账线上确认"
icon={<img src={confirm_img} alt="线下转账线上确认" />}
/>
}else{
node = <Result
status="error"
title="支付失败"
extra={[
<Button key="console" onClick={handleBack}>
重新选择支付方式
</Button>
]}
/>
}
return node
}
return (
<PageHeaderWrapper
title="支付提现"
onBack={() => history.goBack()}
backIcon={<ReutrnEle />}
extra={ urlParams.preview ? [] : [
<Button
icon={<CheckSquareOutlined />}
key="1"
type="primary"
onClick={()=>setVisibleModal(true)}
disabled={disableCheck}
>
支付
</Button>
]}
>
<Space direction="vertical" style={{width:'100%'}}>
<Card headStyle={{borderBottom:'none'}} title="外部流转">
<Steps progressDot current={urlParams.status === 4 || payResult === 1 ? 3 : 2}>
<Step title="申请提现" description="采购商" />
<Step title="审核提现" description="平台" />
<Step title="支付提现" description="平台" />
<Step title="完成" description="" />
</Steps>
</Card>
</Space>
<Space direction="vertical" style={{width:'100%'}}>
<Card headStyle={{borderBottom:'none'}} title="账户提现">
<Row gutter={100}>
<Col span={8}>
<div className={styles.repayment}>
<div className={styles['repayment-left']}>
<div className={styles.statistic}>
<div className={styles['statistic-title']}>提现金额(元):</div>
<div style={{display: 'flex',alignItems:'flex-end'}}>
<InputNumber
disabled={true}
defaultValue={urlParams.amount}
formatter={value => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
parser={value => value.replace(/\$\s?|(,*)/g, '')}
className={styles['statistic-input']}
precision={2}
min={0}
/>
</div>
</div>
<div className={styles['repayment-end']}>
<span className={styles['repayment-time']}>
最多可以提现:¥ {((details.accountBalance*100 - details.lockBalance*100)/100).toFixed(2)}
</span>
</div>
</div>
</div>
</Col>
<Col span={16}>
<div className={styles.infoRight}>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>账户归属:</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>{bankDetail?.name}</p>
</Col>
</Row>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>银行账号:</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>{bankDetail?.bankAccount}</p>
</Col>
</Row>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>开户行:</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>{bankDetail?.bankDeposit}</p>
</Col>
</Row>
</div>
</Col>
</Row>
</Card>
</Space>
<Space direction="vertical" style={{width:'100%'}}>
<Card headStyle={{borderBottom:'none'}} title="账户信息">
<Row gutter={100}>
<Col span={8}>
<div className={cx(styles.repayment, styles.repayinfo)}>
<div className={styles['repayment-left']}>
<div className={styles.statistic}>
<div className={styles['statistic-title']}>可用余额(元):</div>
<div className={styles['statistic-amount']}>
{`${((details.accountBalance*100 - details.lockBalance*100)/100).toFixed(2)}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
</div>
</div>
<div className={styles['repayment-end']}>
<span className={styles['repayment-time']}>
{details?.memberName}
</span>
</div>
</div>
</div>
</Col>
<Col span={16}>
<div className={styles.infoRight}>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>账户归属:</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>{details?.parentMemberName}</p>
</Col>
</Row>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>账户余额(元):</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>{details?.accountBalance?.toFixed(2)}</p>
</Col>
</Row>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>锁定金额(元):</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>{details?.lockBalance?.toFixed(2)}</p>
</Col>
</Row>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>账户状态:</p>
</Col>
<Col span={20}>
{
details?.accountStatus &&
<StatusTag title={memberStatusMap[details.accountStatus]['title']} type={memberStatusMap[details.accountStatus]['type']} />
}
</Col>
</Row>
</div>
</Col>
</Row>
</Card>
</Space>
<Space direction="vertical" style={{width:'100%'}}>
<Card headStyle={{borderBottom:'none'}} title="提现处理记录">
<StandardTable
columns={columns}
currentRef={refTrade}
fetchTableData={(params: any) => fetchTradeData(params)}
/>
</Card>
</Space>
<Modal
title={renderModalTitle()}
visible={visibleModal}
onOk={handleOK}
onCancel={handleCancel}
footer={renderModalFooter()}
destroyOnClose={true}
>
{
currentStep
?
renderResult()
:
<>
<CapitalCardCheckBox
cardChange={(v)=>cardChange(v)}
name="payType"
dataSource={[
{
title: '支付方式',
items: [
{id:1, name: '支付宝', logoUrl: alipay},
{id:2, name: '微信', logoUrl: wxpay},
{id:3, name: '银联', logoUrl: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png'},
]
},
// {
// title: '支付渠道',
// items: [
// {id: 4, name: '线下转账线上确认'},
// ]
// },
]}
type="radio"
/>
{
errorTips.tipMethod &&
<p className={styles.errorTips}>请选择支付方式</p>
}
<CapitalCardCheckBox
cardChange={(v)=>cardChange(v)}
name="payChannel"
dataSource={[
{
title: '支付渠道',
items: [
{id: 1, name: '线下转账线上确认'},
]
},
]}
type="radio"
/>
{
errorTips.tipChannel &&
<p className={styles.errorTips}>请选择支付渠道</p>
}
</>
}
</Modal>
</PageHeaderWrapper>
)
}
export default PaymentDetail
import { ISchema } from '@formily/antd'; import { ISchema } from '@formily/antd';
import { FORM_FILTER_PATH } from '@/formSchema/const'; import { FORM_FILTER_PATH } from '@/formSchema/const';
export const auditSchema: ISchema = { export const searchSchema: ISchema = {
type: 'object', type: 'object',
properties: { properties: {
MEGA_LAYOUT: { mageLayout: {
type: 'object', type: 'object',
'x-component': 'mega-layout', 'x-component': 'mega-layout',
properties: { properties: {
...@@ -15,18 +15,12 @@ export const auditSchema: ISchema = { ...@@ -15,18 +15,12 @@ export const auditSchema: ISchema = {
grid: true, grid: true,
}, },
properties: { properties: {
ctl: { memberName: {
type: 'object',
'x-component': 'Children',
'x-component-props': {
children: '{{controllerBtns}}',
},
},
name: {
type: 'string', type: 'string',
'x-component': 'Search', 'x-component': 'Search',
'x-component-props': { 'x-component-props': {
placeholder: '搜索', placeholder: '会员名称',
align: 'flex-left',
}, },
}, },
}, },
...@@ -35,63 +29,41 @@ export const auditSchema: ISchema = { ...@@ -35,63 +29,41 @@ export const auditSchema: ISchema = {
type: 'object', type: 'object',
'x-component': 'flex-layout', 'x-component': 'flex-layout',
'x-component-props': { 'x-component-props': {
rowStyle: {
flexWrap: 'nowrap',
justifyContent: 'end',
},
colStyle: { colStyle: {
marginLeft: 20, marginRight: 20,
}, },
}, },
properties: { properties: {
memberTypeId: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '会员类型(全部)',
allowClear: true,
},
},
status: { status: {
type: 'string', type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '会员状态(全部)',
allowClear: true,
},
},
roleId: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': { 'x-component-props': {
placeholder: '会员角色(全部)', placeholder: '状态',
allowClear: true, style: { width: '174px' },
}, },
enum: [
{
label: '审核通过',
value: 2,
},
{
label: '提现成功',
value: 4,
},
{
label: '提现失败',
value: 5,
}
],
}, },
level: { "[startTime,endTime]": {
type: 'string', type: 'array',
default: undefined, "x-component": 'RangePicker',
enum: [],
'x-component-props': { 'x-component-props': {
placeholder: '会员等级(全部)', placeholder: ['开始时间','结束时间'],
allowClear: true,
},
},
source: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '申请来源(全部)',
allowClear: true,
},
},
'[startDate, endDate]': {
type: 'string',
default: '',
'x-component': 'dateSelect',
'x-component-props': {
placeholder: '时间范围(全部)',
allowClear: true,
}, },
}, },
submit: { submit: {
...@@ -108,45 +80,4 @@ export const auditSchema: ISchema = { ...@@ -108,45 +80,4 @@ export const auditSchema: ISchema = {
}, },
}, },
}, },
}; };
\ No newline at end of file
export const auditModalSchema: ISchema = {
type: 'object',
properties: {
MEGA_LAYOUT: {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
labelAlign: 'top',
},
properties: {
agree: {
type: 'string',
default: 1,
enum: [
{ label: '审核通过', value: 1 },
{ label: '审核不通过', value: 0 },
],
'x-component': 'radio',
'x-component-props': {},
},
reason: {
type: 'string',
title: '审核不通过原因',
required: true,
'x-component': 'textarea',
'x-component-props': {
placeholder: '在此输入你的内容,最长120个字符,60个汉字',
rows: 5,
},
'x-rules': [
{
limitByte: true, // 自定义校验规则
maxByte: 120,
}
],
},
},
},
},
};
...@@ -132,7 +132,7 @@ const MemberMaintainDetailed: React.FC<QueryProps> = props => { ...@@ -132,7 +132,7 @@ const MemberMaintainDetailed: React.FC<QueryProps> = props => {
<> <>
<PageHeader <PageHeader
style={{ padding: '0' }} style={{ padding: '0' }}
onBack={() => history.goBack()} onBack={() => history.push(`/memberAbility/manage/maintian`)}
title={ title={
<HeadInfo <HeadInfo
info={{ info={{
......
...@@ -53,7 +53,6 @@ const memberMaintain: React.FC<[]> = () => { ...@@ -53,7 +53,6 @@ const memberMaintain: React.FC<[]> = () => {
const [visibleModal, setVisibleModal] = useState(false); const [visibleModal, setVisibleModal] = useState(false);
const fetchData = async (params: any) => { const fetchData = async (params: any) => {
console.log('params', params)
const { startDate, endDate } = params; const { startDate, endDate } = params;
const payload = params; const payload = params;
const res = await PublicApi.getMemberMaintenancePage({ const res = await PublicApi.getMemberMaintenancePage({
......
...@@ -263,31 +263,44 @@ export const initDetailSchema = (props: any) => { ...@@ -263,31 +263,44 @@ export const initDetailSchema = (props: any) => {
'x-component-props': { 'x-component-props': {
label: '注册手机', label: '注册手机',
required: true, required: true,
inline: true, wrapperCol: 24,
}, },
properties: { properties: {
countryCodeId: { MEGA_LAYOUT1_1_1: {
type: 'string', type: 'object',
enum: [], 'x-component': 'mega-layout',
'x-component-props': { 'x-component-props': {
placeholder: '请选择', grid: true,
full: true,
}, },
required: true, properties: {
}, countryCodeId: {
phone: { type: 'string',
type: 'string', enum: [],
required: true, 'x-component-props': {
'x-component-props': { placeholder: '请选择',
placeholder: '请输入你的手机号码', },
maxLength: 11, required: true,
},
'x-rules': [
{
pattern: PATTERN_MAPS.phone,
message: '请输入正确格式的手机号',
}, },
], phone: {
}, type: 'string',
required: true,
'x-mega-props': {
span: 2,
},
'x-component-props': {
placeholder: '请输入你的手机号码',
maxLength: 11,
},
'x-rules': [
{
pattern: PATTERN_MAPS.phone,
message: '请输入正确格式的手机号',
},
],
},
},
},
}, },
}, },
email: { email: {
......
...@@ -26,13 +26,12 @@ import { ...@@ -26,13 +26,12 @@ import {
MEMBER_INNER_STATUS_BADGE_COLOR, MEMBER_INNER_STATUS_BADGE_COLOR,
MEMBER_OUTER_STATUS_TYPE, MEMBER_OUTER_STATUS_TYPE,
} from '../constant'; } from '../constant';
import { auditModalSchema } from './schema'; import { auditModalSchema } from '../schema/auditSchema';
import HeadInfo from '../components/HeadInfo'; import HeadInfo from '../components/HeadInfo';
import StatusTag from '../components/StatusTag'; import StatusTag from '../components/StatusTag';
import BasicInfo from '../components/BasicInfo'; import BasicInfo from '../components/BasicInfo';
import AuditProcess from '../components/AuditProcess'; import AuditProcess from '../components/AuditProcess';
import styles from './index.less'; import styles from './index.less';
import { values } from 'mobx';
const treeActions = createTreeActions(); const treeActions = createTreeActions();
const modalFormActions = createFormActions(); const modalFormActions = createFormActions();
......
...@@ -11,7 +11,7 @@ import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilte ...@@ -11,7 +11,7 @@ import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilte
import { FORM_FILTER_PATH } from '@/formSchema/const'; import { FORM_FILTER_PATH } from '@/formSchema/const';
import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect'; import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect';
import { PublicApi } from '@/services/api'; import { PublicApi } from '@/services/api';
import { auditSchema } from './schema'; import { auditSchema } from '../schema/auditSchema';
import { import {
MEMBER_STATUS_TAG_MAP, MEMBER_STATUS_TAG_MAP,
MEMBER_INNER_STATUS_BADGE_COLOR, MEMBER_INNER_STATUS_BADGE_COLOR,
......
...@@ -26,13 +26,12 @@ import { ...@@ -26,13 +26,12 @@ import {
MEMBER_INNER_STATUS_BADGE_COLOR, MEMBER_INNER_STATUS_BADGE_COLOR,
MEMBER_OUTER_STATUS_TYPE, MEMBER_OUTER_STATUS_TYPE,
} from '../constant'; } from '../constant';
import { auditModalSchema } from './schema'; import { auditModalSchema } from '../schema/auditSchema';
import HeadInfo from '../components/HeadInfo'; import HeadInfo from '../components/HeadInfo';
import StatusTag from '../components/StatusTag'; import StatusTag from '../components/StatusTag';
import BasicInfo from '../components/BasicInfo'; import BasicInfo from '../components/BasicInfo';
import AuditProcess from '../components/AuditProcess'; import AuditProcess from '../components/AuditProcess';
import styles from './index.less'; import styles from './index.less';
import { values } from 'mobx';
const treeActions = createTreeActions(); const treeActions = createTreeActions();
const modalFormActions = createFormActions(); const modalFormActions = createFormActions();
......
...@@ -11,7 +11,7 @@ import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilte ...@@ -11,7 +11,7 @@ import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilte
import { FORM_FILTER_PATH } from '@/formSchema/const'; import { FORM_FILTER_PATH } from '@/formSchema/const';
import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect'; import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect';
import { PublicApi } from '@/services/api'; import { PublicApi } from '@/services/api';
import { auditSchema } from './schema'; import { auditSchema } from '../schema/auditSchema';
import { import {
MEMBER_STATUS_TAG_MAP, MEMBER_STATUS_TAG_MAP,
MEMBER_INNER_STATUS_BADGE_COLOR, MEMBER_INNER_STATUS_BADGE_COLOR,
......
...@@ -27,13 +27,12 @@ import { ...@@ -27,13 +27,12 @@ import {
MEMBER_INNER_STATUS_BADGE_COLOR, MEMBER_INNER_STATUS_BADGE_COLOR,
MEMBER_OUTER_STATUS_TYPE, MEMBER_OUTER_STATUS_TYPE,
} from '../constant'; } from '../constant';
import { auditModalSchema } from './schema'; import { auditModalSchema } from '../schema/auditSchema';
import HeadInfo from '../components/HeadInfo'; import HeadInfo from '../components/HeadInfo';
import StatusTag from '../components/StatusTag'; import StatusTag from '../components/StatusTag';
import BasicInfo from '../components/BasicInfo'; import BasicInfo from '../components/BasicInfo';
import AuditProcess from '../components/AuditProcess'; import AuditProcess from '../components/AuditProcess';
import styles from './index.less'; import styles from './index.less';
import { values } from 'mobx';
const treeActions = createTreeActions(); const treeActions = createTreeActions();
const modalFormActions = createAsyncFormActions(); const modalFormActions = createAsyncFormActions();
......
...@@ -12,7 +12,7 @@ import { FORM_FILTER_PATH } from '@/formSchema/const'; ...@@ -12,7 +12,7 @@ import { FORM_FILTER_PATH } from '@/formSchema/const';
import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect'; import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect';
import { PublicApi } from '@/services/api'; import { PublicApi } from '@/services/api';
import { MEMBER_INNER_STATUS_SUCCESS, MEMBER_INNER_STATUS_FAILED } from '@/constants'; import { MEMBER_INNER_STATUS_SUCCESS, MEMBER_INNER_STATUS_FAILED } from '@/constants';
import { auditSchema } from './schema'; import { auditSchema } from '../schema/auditSchema';
import { import {
MEMBER_STATUS_TAG_MAP, MEMBER_STATUS_TAG_MAP,
MEMBER_INNER_STATUS_BADGE_COLOR, MEMBER_INNER_STATUS_BADGE_COLOR,
......
...@@ -26,13 +26,12 @@ import { ...@@ -26,13 +26,12 @@ import {
MEMBER_INNER_STATUS_BADGE_COLOR, MEMBER_INNER_STATUS_BADGE_COLOR,
MEMBER_OUTER_STATUS_TYPE, MEMBER_OUTER_STATUS_TYPE,
} from '../constant'; } from '../constant';
import { auditModalSchema } from './schema'; import { auditModalSchema } from '../schema/auditSchema';
import HeadInfo from '../components/HeadInfo'; import HeadInfo from '../components/HeadInfo';
import StatusTag from '../components/StatusTag'; import StatusTag from '../components/StatusTag';
import BasicInfo from '../components/BasicInfo'; import BasicInfo from '../components/BasicInfo';
import AuditProcess from '../components/AuditProcess'; import AuditProcess from '../components/AuditProcess';
import styles from './index.less'; import styles from './index.less';
import { values } from 'mobx';
const treeActions = createTreeActions(); const treeActions = createTreeActions();
const modalFormActions = createFormActions(); const modalFormActions = createFormActions();
......
...@@ -11,7 +11,7 @@ import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilte ...@@ -11,7 +11,7 @@ import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilte
import { FORM_FILTER_PATH } from '@/formSchema/const'; import { FORM_FILTER_PATH } from '@/formSchema/const';
import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect'; import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect';
import { PublicApi } from '@/services/api'; import { PublicApi } from '@/services/api';
import { auditSchema } from './schema'; import { auditSchema } from '../schema/auditSchema';
import { import {
MEMBER_STATUS_TAG_MAP, MEMBER_STATUS_TAG_MAP,
MEMBER_INNER_STATUS_BADGE_COLOR, MEMBER_INNER_STATUS_BADGE_COLOR,
......
...@@ -133,8 +133,8 @@ export const auditModalSchema: ISchema = { ...@@ -133,8 +133,8 @@ export const auditModalSchema: ISchema = {
reason: { reason: {
type: 'string', type: 'string',
title: '审核不通过原因', title: '审核不通过原因',
'x-component': 'textarea',
required: true, required: true,
'x-component': 'textarea',
'x-component-props': { 'x-component-props': {
placeholder: '在此输入你的内容,最长120个字符,60个汉字', placeholder: '在此输入你的内容,最长120个字符,60个汉字',
rows: 5, rows: 5,
...@@ -150,4 +150,3 @@ export const auditModalSchema: ISchema = { ...@@ -150,4 +150,3 @@ export const auditModalSchema: ISchema = {
}, },
}, },
}; };
This source diff could not be displayed because it is too large. You can view the blob instead.
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