Commit 58ff2c60 authored by 前端-钟卫鹏's avatar 前端-钟卫鹏

fix: 资金账户管理、交易规则校验问题

parent 0f482b8b
......@@ -181,6 +181,39 @@ const payandSettleRoute: RouterChild = {
name: 'memberAccountManage',
component: '@/pages/payandSettle/amountAccountManage/memberAccountManage',
},
// 会员账户管理-详情
{
path: '/memberCenter/payandSettle/amountAccountManage/memberAccountManage/detail',
name: 'memberAccountDetail',
component: '@/pages/payandSettle/amountAccountManage/memberAccountManage/memberAccountDetail',
hideInMenu: true,
},
// 待审核提现
{
path: '/memberCenter/payandSettle/amountAccountManage/checkWithdraw',
name: 'checkWithdraw',
component: '@/pages/payandSettle/amountAccountManage/checkWithdraw',
},
// 待审核提现-详情
{
path: '/memberCenter/payandSettle/amountAccountManage/checkWithdraw/detail',
name: 'checkDetail',
component: '@/pages/payandSettle/amountAccountManage/checkWithdraw/checkDetail',
hideInMenu: true,
},
// 待支付提现
{
path: '/memberCenter/payandSettle/amountAccountManage/paymentWithdraw',
name: 'paymentWithdraw',
component: '@/pages/payandSettle/amountAccountManage/paymentWithdraw',
},
// 待支付提现-详情
{
path: '/memberCenter/payandSettle/amountAccountManage/paymentWithdraw/detail',
name: 'paymentDetail',
component: '@/pages/payandSettle/amountAccountManage/paymentWithdraw/paymentDetail',
hideInMenu: true,
},
],
},
]
......
......@@ -352,6 +352,11 @@ export default {
'menu.payandSettle.capitalAccounts.applyWithdraw': '申请提现',
'menu.payandSettle.amountAccountManage': '资金账户管理',
'menu.payandSettle.amountAccountManage.memberAccountManage': '会员账户管理',
'menu.payandSettle.amountAccountManage.memberAccountDetail': '账户详情',
'menu.payandSettle.amountAccountManage.checkWithdraw': '待审核提现',
'menu.payandSettle.amountAccountManage.checkDetail': '审核提现',
'menu.payandSettle.amountAccountManage.paymentWithdraw': '待支付提现',
'menu.payandSettle.amountAccountManage.paymentDetail': '支付提现',
// 权限管理
'menu.systemSetting': '系统',
......
......@@ -331,7 +331,6 @@ const Goods: React.FC<{}> = () => {
console.log(val)
let obj = val ? { ...filterParams, name: val } : { ...filterParams }
setFilterParams(obj)
//@ts-ignore
ref.current.reload(obj)
}
......@@ -340,7 +339,6 @@ const Goods: React.FC<{}> = () => {
setFilterParams(restObj)
setBrandValue(undefined)
setClassValue(undefined)
//@ts-ignore
ref.current.reload(restObj)
}
......
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 { statusMap } from '../../constant'
import { CheckSquareOutlined } from '@ant-design/icons'
const { Step } = Steps;
const { TextArea } = Input;
const CheckDetail: React.FC<{}> = () => {
const [checkForm] = Form.useForm();
const [visibleModal, setVisibleModal] = useState<boolean>(false)
const [dealRecord, setDealRecord] = useState<any>()
const [checkStatus, setCheckStatus] = useState<number>(4)
const [disableCheck, setDisableCheck] = useState<boolean>(false)
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',
},
{
title: '交易项目',
dataIndex: 'operation',
key: 'operation',
},
{
title: '交易金额(元)',
dataIndex: 'tradeMoney',
key: 'tradeMoney',
},
{
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 => {
console.log(values, 'value')
})
}
const handleCancel = () => {
checkForm.resetFields()
setVisibleModal(false)
}
return (
<PageHeaderWrapper
title="审核提现"
onBack={() => history.goBack()}
backIcon={<ReutrnEle />}
extra={[
<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={0}>
<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={0}
formatter={value => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
parser={value => value.replace(/\$\s?|(,*)/g, '')}
className={styles['statistic-input']}
/>
</div>
</div>
<div className={styles['repayment-end']}>
<span className={styles['repayment-time']}>
最多可以提现:¥10,000.00
</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}>广州数商云网络科技有限公司</p>
</Col>
</Row>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>银行账号:</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>6214 7812 3456 7891 1234</p>
</Col>
</Row>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>开户行:</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>中国建设银行广州市分行营业部</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']}>
{`100000`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
</div>
</div>
<div className={styles['repayment-end']}>
<span className={styles['repayment-time']}>
温州市龙昌皮具有限公司
</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}>广州数商云网络科技有限公司</p>
</Col>
</Row>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>账户余额(元):</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>10,000</p>
</Col>
</Row>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>锁定金额(元):</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>0.00</p>
</Col>
</Row>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>账户状态:</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}><StatusTag type="success" title="正常" /></p>
</Col>
</Row>
</div>
</Col>
</Row>
</Card>
</Space>
<Space direction="vertical" style={{width:'100%'}}>
<Card headStyle={{borderBottom:'none'}} title="提现处理记录">
<Table dataSource={dealRecord} columns={columns} />
</Card>
</Space>
<Modal
title="审核提现"
visible={visibleModal}
onOk={handleOK}
onCancel={handleCancel}
>
<Form
layout="vertical"
form={checkForm}
>
<Form.Item
name="status"
label=""
rules={[
{
required: true,
message: '请选择审核状态'
}
]}
initialValue={4}
>
<Radio.Group onChange={handleStatusChange}>
<Radio value={4}>审核通过</Radio>
<Radio value={3}>审核不通过</Radio>
</Radio.Group>
</Form.Item>
{
checkStatus===3 && <Form.Item
name="checkRemark"
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 { 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 { PlusOutlined } from '@ant-design/icons'
import EyePreview from '@/components/EyePreview'
import { DatePicker } from '@formily/antd-components'
import StatusTag from '@/components/StatusTag'
import { accountStatusMap, memberStatusMap } from '../../constant'
import moment from 'moment'
const formActions = createFormActions();
const CheckWithdraw: React.FC<{}> = () => {
const ref = useRef<any>({})
const columns: ColumnType<any>[] = [
{
title: '会员名称',
dataIndex: ['memberAssetAccount', 'memberName'],
key: 'memberAssetAccount',
className: 'commonPickColor',
render: (text, record) => <EyePreview
url={`/memberCenter/payandSettle/amountAccountManage/memberAccountManage/detail?id=${record.id}`}
>
{text}
</EyePreview>
},
{
title: '提现银行账户名称',
dataIndex: 'bankAccountName',
key: 'bankAccountName',
},
{
title: '银行账号',
dataIndex: 'bankAccount',
key: 'bankAccount',
},
{
title: '提现金额(元)',
dataIndex: 'memberRoleName',
key: 'memberRoleName',
},
{
title: '提现申请时间',
dataIndex: 'tradeTime',
key: 'tradeTime',
render: (t, r) => moment(t).format('YYYY-MM-DD HH:mm:ss')
},
{
title: '会员状态',
dataIndex: 'memberStatus',
key: 'memberStatus',
render: (t, r) => (<StatusTag title={memberStatusMap[t]['title']} type={memberStatusMap[t]['type']} />)
},
{
title: '操作',
dataIndex: 'option',
render: (t, r) => (<Button type='link' onClick={()=>clickUp(r)}>审核</Button>)
}
]
const fetchData = (params: any) => {
console.log(params)
return new Promise((resolve, reject) => {
let obj = { ...params }
PublicApi.getPayMemberAssetAccountGetCheckCashOutList(obj).then(res => {
resolve(res.data)
})
})
}
const clickUp = (r: any) => {
console.log('通过')
}
const handleBatchCheck = () => {
console.log('批量通过')
}
const controllerBtns = (
<Space>
<Button onClick={handleBatchCheck}>
批量审核通过
</Button>
</Space>
);
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}
expressionScope={{
controllerBtns,
}}
/>
}
/>
</Card>
</PageHeaderWrapper>
)
}
export default CheckWithdraw
import { ISchema } from '@formily/antd';
import { FORM_FILTER_PATH } from '@/formSchema/const';
export const searchSchema: ISchema = {
type: 'object',
properties: {
mageLayout: {
type: 'object',
'x-component': 'mega-layout',
properties: {
topLayout: {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
grid: true,
},
properties: {
ctl: {
type: 'object',
'x-component': 'Children',
'x-component-props': {
children: '{{controllerBtns}}',
},
},
memberName: {
type: 'string',
'x-component': 'Search',
'x-component-props': {
placeholder: '会员名称',
},
},
},
},
[FORM_FILTER_PATH]: {
type: 'object',
'x-component': 'flex-layout',
'x-component-props': {
// rowStyle: {
// flexWrap: 'nowrap',
// justifyContent: 'end',
// },
colStyle: {
marginRight: 20,
},
},
properties: {
status: {
type: 'string',
'x-component-props': {
placeholder: '状态',
style: { width: '174px' },
},
enum: [
{
label: '申请提现',
value: 1,
},
{
label: '审核通过',
value: 2,
},
{
label: '审核不通过',
value: 3,
},
{
label: '提现成功',
value: 4,
},
{
label: '提现失败',
value: 5,
}
],
},
"[startTime,endTime]": {
type: 'array',
"x-component": 'RangePicker',
'x-component-props': {
placeholder: ['开始时间','结束时间'],
},
},
submit: {
'x-component': 'Submit',
'x-mega-props': {
span: 1,
},
'x-component-props': {
children: '查询',
},
},
},
},
},
},
},
};
\ 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;
}
// 账户详情右侧操作按钮
.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, } from 'antd'
import { Card, Space, Button, Popconfirm } from 'antd'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import { StandardTable } from 'god'
import { ColumnType } from 'antd/lib/table/interface'
......@@ -12,6 +12,10 @@ 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 { accountStatusMap, memberStatusMap } from '../../constant'
import LevelBrand from '@/pages/member/components/LevelBrand'
const formActions = createFormActions();
......@@ -20,15 +24,18 @@ const AccountLists: React.FC<{}> = () => {
const columns: ColumnType<any>[] = [
{
title: '账户归属',
title: '会员名称',
dataIndex: 'memberName',
key: 'memberName',
className: 'commonPickColor',
render: (text, record) => <EyePreview
url={`/memberCenter/payandSettle/capitalAccounts/accountLists/accountDetail?id=${record.id}`}
>
{text}
</EyePreview>
render: (text, record) => <>
<EyePreview
url={`/memberCenter/payandSettle/amountAccountManage/memberAccountManage/memberAccountDetail?id=${record.id}`}
>
{text}
</EyePreview>
{/* <LevelBrand level={record.level} /> */}
</>
},
{
title: '会员类型',
......@@ -46,21 +53,6 @@ const AccountLists: React.FC<{}> = () => {
key: 'memberLevelName',
},
{
title: '会员等级类型',
dataIndex: 'memberLevelType',
key: 'memberLevelType',
},
{
title: '会员状态',
dataIndex: 'memberStatus',
key: 'memberStatus',
},
{
title: '账户状态',
dataIndex: 'accountStatus',
key: 'accountStatus',
},
{
title: '账户余额',
dataIndex: 'accountStatus',
key: 'accountStatus',
......@@ -78,18 +70,73 @@ const AccountLists: React.FC<{}> = () => {
key: 'usableBalance',
render: text => `¥${text}`
},
{
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={memberStatusMap[t]['className']}>{accountStatusMap[t]['title']}</span>)
},
{
title: '操作',
dataIndex: 'option',
render: (text: any, record: any) => (
<Popconfirm
title="确定要执行这个操作?"
onConfirm={() => clickHandle(record)}
onCancel={cancel}
okText="是"
cancelText="否"
>
<Button type='link'>{record.accountStatus===1?'冻结':'解除'}</Button>
</Popconfirm>
)
}
]
const fetchData = (params: any) => {
console.log(params)
return new Promise((resolve, reject) => {
let obj = { ...params }
PublicApi.getPayAssetAccountGetAssetAccountList(obj).then(res => {
PublicApi.getPayMemberAssetAccountGetMemberAssetAccountList(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 cancel = () => {
console.log('cancel')
}
const clickHandle = (r: any) => {
console.log(r,'操作r')
}
return (
<PageHeaderWrapper>
<Card>
......@@ -109,9 +156,13 @@ const AccountLists: React.FC<{}> = () => {
useStateFilterSearchLinkageEffect(
$,
actions,
'parentMemberName',
'memberName',
FORM_FILTER_PATH,
);
useAsyncInitSelect(
['memberType', 'memberRoleId', 'memberLevel'],
fetchSelectOptions,
);
}}
schema={searchSchema}
/>
......
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 { moveStatusMap, statusMap } from '../../constant'
import { SettingOutlined } from '@ant-design/icons'
import { validatorByte } from '@/utils/regExp'
const { TextArea } = Input
const AccountDetail: React.FC<{}> = () => {
const [checkForm] = Form.useForm()
const [dealRecord, setDealRecord] = useState<any>()
const [moveRecord, setMoveRecord] = useState<any>()
const [isDisabled, setIsDisabled] = useState<boolean>(false)
const [visibleModal, setVisibleModal] = useState<boolean>(false)
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',
},
{
title: '交易项目',
dataIndex: 'operation',
key: 'operation',
},
{
title: '交易金额(元)',
dataIndex: 'tradeMoney',
key: 'tradeMoney',
},
{
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: 'parentMemberRoleName',
key: 'parentMemberRoleName',
},
{
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)
console.log('解除')
}
const handleOK = () => {
console.log('OK')
}
const handleCancel = () => {
console.log('取消')
setVisibleModal(false)
}
return (
<PageHeaderWrapper
title="账户详情"
onBack={() => history.goBack()}
backIcon={<ReutrnEle />}
extra={[
<Button
key="1"
onClick={handleRelieve}
type="primary"
icon={<SettingOutlined />}
disabled={isDisabled}
>
解冻
</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']}>
{`100000`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
</div>
</div>
<div className={styles['repayment-end']}>
<span className={styles['repayment-time']}>
温州市龙昌皮具有限公司
</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}>广州数商云网络科技有限公司</p>
</Col>
</Row>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>账户余额(元):</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>10,000</p>
</Col>
</Row>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>锁定金额(元):</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>0.00</p>
</Col>
</Row>
<Row>
<Col span={4}>
<p className={styles.rightTitle}>账户状态:</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}><StatusTag type="success" title="正常" /></p>
</Col>
</Row>
</div>
</Col>
</Row>
</Card>
</Space>
<Space direction="vertical" style={{width:'100%'}}>
<Card headStyle={{borderBottom:'none'}} title="交易记录">
<Table dataSource={dealRecord} columns={columns} />
</Card>
</Space>
<Space direction="vertical" style={{width:'100%'}}>
<Card headStyle={{borderBottom:'none'}} title="流转记录">
<Table dataSource={moveRecord} columns={moveColumns} />
</Card>
</Space>
<Modal
title="会员冻结"
visible={visibleModal}
onOk={handleOK}
onCancel={handleCancel}
>
<Form
layout="vertical"
form={checkForm}
>
<Form.Item
name="checkRemark"
label={'会员冻结原因'}
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
......@@ -15,11 +15,11 @@ export const searchSchema: ISchema = {
grid: true,
},
properties: {
parentMemberName: {
memberName: {
type: 'string',
'x-component': 'Search',
'x-component-props': {
placeholder: '账户归属',
placeholder: '会员名称',
align: 'flex-left',
},
},
......@@ -38,6 +38,36 @@ export const searchSchema: ISchema = {
},
},
properties: {
memberType: {
type: 'string',
enum: [],
"x-component-props": {
placeholder: '请选择会员类型',
style: {
width: 174
}
}
},
memberRoleId: {
type: 'string',
enum: [],
"x-component-props": {
placeholder: '请选择会员角色',
style: {
width: 174
}
}
},
memberLevel: {
type: 'string',
enum: [],
"x-component-props": {
placeholder: '请选择会员等级',
style: {
width: 174
}
}
},
memberStatus: {
type: 'string',
'x-component-props': {
......@@ -72,13 +102,6 @@ export const searchSchema: ISchema = {
}
],
},
"[startTime,endTime]": {
type: 'array',
"x-component": 'RangePicker',
'x-component-props': {
placeholder: ['开始时间','结束时间'],
},
},
submit: {
'x-component': 'Submit',
'x-mega-props': {
......
import React, { 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[],
type?: string,
editable?: boolean,
}
const CardCheckBox = (props: IProps) => {
const { dataSource = [], type = 'checkbox', editable = true } = props
const [value, setValue] = useState<any>([])
// const value: number[] = props.value || []
const handleChange = (id) => {
console.log(id)
if (!editable) {
return false
}
if (value.includes(id)) {
const newValue = findItemAndDelete(value, id)
setValue(newValue)
console.log(newValue)
// props.mutators.change(newValue)
} else {
// type === 'radio' ? props.mutators.change([id]) : props.mutators.change([...value, id])
console.log([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;
}
\ No newline at end of file
import React, { useState, useEffect, useRef } from 'react'
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 { PlusOutlined } from '@ant-design/icons'
import EyePreview from '@/components/EyePreview'
import { DatePicker } from '@formily/antd-components'
import StatusTag from '@/components/StatusTag'
import { accountStatusMap, memberStatusMap } 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
url={`/memberCenter/payandSettle/amountAccountManage/memberAccountManage/detail?id=${record.id}`}
>
{text}
</EyePreview>
},
{
title: '提现银行账户名称',
dataIndex: 'bankAccountName',
key: 'bankAccountName',
},
{
title: '银行账号',
dataIndex: 'bankAccount',
key: 'bankAccount',
},
{
title: '提现金额(元)',
dataIndex: 'memberRoleName',
key: 'memberRoleName',
},
{
title: '提现申请时间',
dataIndex: 'tradeTime',
key: 'tradeTime',
render: (t, r) => moment(t).format('YYYY-MM-DD HH:mm:ss')
},
{
title: '会员状态',
dataIndex: 'memberStatus',
key: 'memberStatus',
render: (t, r) => (<StatusTag title={memberStatusMap[t]['title']} type={memberStatusMap[t]['type']} />)
},
{
title: '操作',
dataIndex: 'option',
render: (t, r) => (<Button type='link' onClick={()=>clickUp(r)}>支付</Button>)
}
]
const fetchData = (params: any) => {
console.log(params)
return new Promise((resolve, reject) => {
let obj = { ...params }
PublicApi.getPayMemberAssetAccountGetCheckCashOutList(obj).then(res => {
resolve(res.data)
})
})
}
const clickUp = (r: any) => {
console.log('通过')
}
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 { ISchema } from '@formily/antd';
import { FORM_FILTER_PATH } from '@/formSchema/const';
export const searchSchema: ISchema = {
type: 'object',
properties: {
mageLayout: {
type: 'object',
'x-component': 'mega-layout',
properties: {
topLayout: {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
grid: true,
},
properties: {
memberName: {
type: 'string',
'x-component': 'Search',
'x-component-props': {
placeholder: '会员名称',
align: 'flex-left',
},
},
},
},
[FORM_FILTER_PATH]: {
type: 'object',
'x-component': 'flex-layout',
'x-component-props': {
rowStyle: {
flexWrap: 'nowrap',
justifyContent: 'end',
},
colStyle: {
marginRight: 20,
},
},
properties: {
status: {
type: 'string',
'x-component-props': {
placeholder: '状态',
style: { width: '174px' },
},
enum: [
{
label: '审核通过',
value: 1,
},
{
label: '提现成功',
value: 2,
},
{
label: '提现失败',
value: 3,
}
],
},
"[startTime,endTime]": {
type: 'array',
"x-component": 'RangePicker',
'x-component-props': {
placeholder: ['开始时间','结束时间'],
},
},
submit: {
'x-component': 'Submit',
'x-mega-props': {
span: 1,
},
'x-component-props': {
children: '查询',
},
},
},
},
},
},
},
};
\ 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 } from 'antd'
import { Card, Space, Row, Col, Button, Table } from 'antd'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import ReutrnEle from '@/components/ReturnEle'
import styles from './index.less'
......@@ -11,25 +11,10 @@ import { ColumnType } from 'antd/lib/table/interface'
import ModalForm from '@/components/ModalForm'
import { createFormActions } from '@formily/antd'
import { rechargeSchema } from './schema'
import { visible } from 'chalk'
import { moveStatusMap, statusMap } from '../../constant'
const { Step } = Steps;
const schemaActions = createFormActions()
const statusMap = {
'1': { title: '申请提现', type: 'warnning' },
'2': { title: '审核通过', type: 'success' },
'3': { title: '审核不通过', type: 'default' },
'4': { title: '提现成功', type: 'success' },
'5': { title: '提现失败', type: 'danger' },
'6': { title: '确认到账', type: 'success' },
}
const moveStatusMap = {
'1': { title: '冻结', type: 'danger' },
'2': { title: '解冻', type: 'success' },
}
const AccountDetail: React.FC<{}> = () => {
const modalRef = useRef<any>()
const [dealRecord, setDealRecord] = useState<any>()
......
......@@ -8,18 +8,10 @@ import StatusTag from '@/components/StatusTag'
import cx from 'classnames'
import moment from 'moment'
import { ColumnType } from 'antd/lib/table/interface'
import { statusMap } from '../../constant'
const { Step } = Steps;
const statusMap = {
'1': { title: '申请提现', type: 'warnning' },
'2': { title: '审核通过', type: 'success' },
'3': { title: '审核不通过', type: 'default' },
'4': { title: '提现成功', type: 'success' },
'5': { title: '提现失败', type: 'danger' },
'6': { title: '确认到账', type: 'success' },
}
const AccountDetail: React.FC<{}> = () => {
const [dealRecord, setDealRecord] = useState<any>()
......
......@@ -12,6 +12,8 @@ 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 StatusTag from '@/components/StatusTag'
import { accountStatusMap, memberStatusMap } from '../../constant'
const formActions = createFormActions();
......@@ -54,11 +56,13 @@ const AccountLists: React.FC<{}> = () => {
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={memberStatusMap[t]['className']}>{accountStatusMap[t]['title']}</span>)
},
{
title: '账户余额',
......
......@@ -55,4 +55,33 @@ export const MEMBER_STATUS_TAG_MAP = {
export const MEMBER_STATUS_BADGE_MAP = {
1: '#EF6260',
2: '#EF6260',
};
\ No newline at end of file
};
/**
* 资金账户相关常量
*/
export const statusMap = {
'1': { title: '申请提现', type: 'warnning' },
'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' },
}
\ No newline at end of file
......@@ -37,13 +37,15 @@ export const ruleDetailSchema: ISchema = padRequiredMessage({
properties: {
"name": {
type: 'string',
required: true,
title: '规则名称',
"x-component-props": {
placeholder: '请输入规则名称'
},
"x-rules": [
{
required: true,
},
{
limitByte: true,
maxByte: 48
}
......
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