Commit d77ca746 authored by XieZhiXiong's avatar XieZhiXiong

Merge branch 'dev' into test

parents 280bff38 ef941cc9
import { RouterChild } from '../../utils';
// import { RouterChild } from '../../utils';
import goodsOffer from './goodsOffer';
import inquiryQuote from './inquiryQuote';
import confirmInquiryQuote from './confirmInquiryQuote';
......@@ -11,7 +11,7 @@ import comfirmDemandPosts from './comfirmDemandPosts';
/**
* 交易能力路由
*/
const TranactionRoute: RouterChild = {
const TranactionRoute = {
path: '/memberCenter/tranactionAbility',
name: 'tranactionAbility',
icon: 'smile',
......@@ -191,12 +191,28 @@ const TranactionRoute: RouterChild = {
// 新增交易规则
{
path: '/memberCenter/tranactionAbility/transactionRules/addRule',
path: '/memberCenter/tranactionAbility/transactionRules/add',
name: 'addRule',
hideInMenu: true,
component: '@/pages/transaction/transactionRules/addRule',
},
// 编辑交易规则
{
path: '/memberCenter/tranactionAbility/transactionRules/edit',
name: 'editRule',
hideInMenu: true,
component: '@/pages/transaction/transactionRules/addRule',
},
// 交易规则详情
{
path: '/memberCenter/tranactionAbility/transactionRules/detail',
name: 'ruleDetail',
hideInMenu: true,
component: '@/pages/transaction/transactionRules/addRule',
},
// 供应会员评价管理
{
path: '/memberCenter/tranactionAbility/supplierEvaluation',
......
......@@ -60,21 +60,21 @@ const AccountLists: React.FC<{}> = () => {
},
{
title: '账户余额',
dataIndex: 'accountStatus',
key: 'accountStatus',
render: text => `¥${text}`
dataIndex: 'accountBalance',
key: 'accountBalance',
render: text => `¥${text.toFixed(2)}`
},
{
title: '锁定余额',
dataIndex: 'lockBalance',
key: 'lockBalance',
render: text => `¥${text}`
render: text => `¥${text.toFixed(2)}`
},
{
title: '可用余额',
dataIndex: 'usableBalance',
key: 'usableBalance',
render: (t, r) => `¥${r.accountStatus - r.lockBalance}`
render: (t, r) => `¥${((r.accountBalance*100 - r.lockBalance*100)/100).toFixed(2)}`
},
{
title: '会员状态',
......
......@@ -12,13 +12,15 @@ import { memberStatusMap, moveStatusMap, statusMap } from '../../constant'
import { SettingOutlined, StopOutlined } from '@ant-design/icons'
import { validatorByte } from '@/utils/regExp'
import { PublicApi } from '@/services/api'
import { GetPayMemberAssetAccountGetMemberAssetAccountResponse } from '@/services/PayApi'
import { StandardTable } from 'god'
const { TextArea } = Input
const AccountDetail: React.FC<{}> = () => {
const refTrade = useRef<any>({})
const refMove = useRef<any>({})
const [checkForm] = Form.useForm()
const [dealRecord, setDealRecord] = useState<any>()
// const [dealRecord, setDealRecord] = useState<any>()
const [moveRecord, setMoveRecord] = useState<any>()
const [isDisabled, setIsDisabled] = useState<boolean>(false)
const [visibleModal, setVisibleModal] = useState<boolean>(false)
......@@ -26,7 +28,6 @@ const AccountDetail: React.FC<{}> = () => {
useEffect(() => {
getAccountInfo()
// pay/memberAssetAccount/getMemberAssetAccount
}, [])
const getAccountInfo = async () => {
......@@ -35,13 +36,33 @@ const AccountDetail: React.FC<{}> = () => {
const { code, data } = res
setDetails(data)
if(code === 1000){
let tradeRecord = await PublicApi.getPayMemberAssetAccountGetAccountTradeRecord({memberAssetAccountId: data.id + ''})
// let tradeRecord = await PublicApi.getPayMemberAssetAccountGetAccountTradeRecord({memberAssetAccountId: data.id + ''})
let statusRecord = await PublicApi.getPayMemberAssetAccountGetAccountCheckRecord({memberAssetAccountId: data.id + ''})
setDealRecord(tradeRecord.data)
// setDealRecord(tradeRecord.data)
setMoveRecord(statusRecord.data)
}
}
// 获取交易记录
const fetchTradeData = (params) => {
return new Promise((resolve, reject) => {
PublicApi.getPayMemberAssetAccountGetAccountTradeRecord({memberAssetAccountId: history.location.query.id + '', ...params}).then(res => {
const { data } = res
resolve(data)
})
})
}
// // 获取流转记录
// const fetchMoveData = (params) => {
// return new Promise((resolve, reject) => {
// PublicApi.getPayMemberAssetAccountGetAccountCheckRecord({memberAssetAccountId: history.location.query.id + ''}).then(res => {
// const { data } = res
// resolve(data)
// })
// })
// }
const columns: ColumnType<any>[] = [
{
title: '交易流水号',
......@@ -65,11 +86,6 @@ const AccountDetail: React.FC<{}> = () => {
key: 'operation',
},
{
title: '交易金额(元)',
dataIndex: 'tradeMoney',
key: 'tradeMoney',
},
{
title: '状态',
dataIndex: 'status',
key: 'status',
......@@ -91,8 +107,8 @@ const AccountDetail: React.FC<{}> = () => {
},
{
title: '操作角色',
dataIndex: 'parentMemberRoleName',
key: 'parentMemberRoleName',
dataIndex: ['memberAssetAccount','parentMemberRoleName'],
key: 'id',
},
{
title: '状态',
......@@ -165,7 +181,7 @@ const AccountDetail: React.FC<{}> = () => {
<div className={styles.statistic}>
<div className={styles['statistic-title']}>可用余额(元):</div>
<div className={styles['statistic-amount']}>
{`${details.accountBalance - details.lockBalance}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
{`${((details.accountBalance*100 - details.lockBalance*100)/100).toFixed(2)}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
</div>
</div>
<div className={styles['repayment-end']}>
......@@ -191,7 +207,7 @@ const AccountDetail: React.FC<{}> = () => {
<p className={styles.rightTitle}>账户余额(元):</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>{details?.accountBalance}</p>
<p className={styles.rightInfo}>{details?.accountBalance?.toFixed(2)}</p>
</Col>
</Row>
<Row>
......@@ -199,7 +215,7 @@ const AccountDetail: React.FC<{}> = () => {
<p className={styles.rightTitle}>锁定金额(元):</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>{details?.lockBalance}</p>
<p className={styles.rightInfo}>{details?.lockBalance?.toFixed(2)}</p>
</Col>
</Row>
<Row>
......@@ -222,12 +238,24 @@ const AccountDetail: React.FC<{}> = () => {
</Space>
<Space direction="vertical" style={{width:'100%'}}>
<Card headStyle={{borderBottom:'none'}} title="交易记录">
<Table dataSource={dealRecord} columns={columns} />
<StandardTable
columns={columns}
currentRef={refTrade}
fetchTableData={(params: any) => fetchTradeData(params)}
/>
</Card>
</Space>
<Space direction="vertical" style={{width:'100%'}}>
<Card headStyle={{borderBottom:'none'}} title="流转记录">
<Table dataSource={moveRecord} columns={moveColumns} />
<Table columns={moveColumns} dataSource={moveRecord} pagination={false} />
{/* <StandardTable
columns={moveColumns}
currentRef={refMove}
fetchTableData={(params: any) => fetchMoveData(params)}
tableProps={{
pagination: false
}}
/> */}
</Card>
</Space>
<Modal
......
import React, { useState, useEffect, useRef, ReactNode } from 'react'
import { history } from 'umi'
import { Card, Space, Row, Col, Button, Table } from 'antd'
import { Card, Space, Row, Col, Button, Table, Modal } from 'antd'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import ReutrnEle from '@/components/ReturnEle'
import styles from './index.less'
......@@ -11,16 +11,20 @@ import { ColumnType } from 'antd/lib/table/interface'
import ModalForm from '@/components/ModalForm'
import { createFormActions } from '@formily/antd'
import { rechargeSchema } from './schema'
import { memberStatusMap, moveStatusMap, statusMap } from '../../constant'
import { memberStatusMap, moveStatusMap, operationMap, statusMap } from '../../constant'
import { PublicApi } from '@/services/api'
import { StandardTable } from 'god'
const schemaActions = createFormActions()
const AccountDetail: React.FC<{}> = () => {
const modalRef = useRef<any>()
const refTrade = useRef<any>({})
// const refMove = useRef<any>({})
const [moveData, setMoveData] = useState<any>()
const [ details, setDetails ] = useState<any>({ accountBalance: 0, lockBalance: 0})
const [dealRecord, setDealRecord] = useState<any>([])
const [moveRecord, setMoveRecord] = useState<any>([])
const [pageId, setPageId] = useState<any>()
const [isBtnLoading, setIsBtnLoading] = useState<boolean>(false)
useEffect(() => {
getAccountInfo()
......@@ -28,17 +32,36 @@ const AccountDetail: React.FC<{}> = () => {
const getAccountInfo = async () => {
const { id } = history.location.query
setPageId(id)
let res = await PublicApi.getPayAssetAccountGetAssetAccount({id})
const { code, data } = res
setDetails(data)
if(code === 1000){
let tradeRecord = await PublicApi.getPayAssetAccountGetAccountTradeRecord({memberAssetAccountId: data.id + ''})
let statusRecord = await PublicApi.getPayAssetAccountGetAccountStatusRecord({memberAssetAccountId: data.id + ''})
setDealRecord(tradeRecord.data)
setMoveRecord(statusRecord.data)
}
PublicApi.getPayAssetAccountGetAccountStatusRecord({memberAssetAccountId: id + ''}).then(res => {
const { data } = res
setMoveData(data)
})
}
// 获取交易记录
const fetchTradeData = (params) => {
return new Promise((resolve, reject) => {
PublicApi.getPayAssetAccountGetAccountTradeRecord({memberAssetAccountId: history.location.query.id + '', ...params}).then(res => {
const { data } = res
resolve(data)
})
})
}
// // 获取流转记录
// const fetchMoveData = (params) => {
// return new Promise((resolve, reject) => {
// PublicApi.getPayAssetAccountGetAccountStatusRecord({memberAssetAccountId: history.location.query.id + ''}).then(res => {
// const { data } = res
// resolve(data)
// })
// })
// }
const columns: ColumnType<any>[] = [
{
title: '交易流水号',
......@@ -60,11 +83,7 @@ const AccountDetail: React.FC<{}> = () => {
title: '交易项目',
dataIndex: 'operation',
key: 'operation',
},
{
title: '交易金额(元)',
dataIndex: 'tradeMoney',
key: 'tradeMoney',
render: (t, r) => operationMap[t]
},
{
title: '状态',
......@@ -119,6 +138,7 @@ const AccountDetail: React.FC<{}> = () => {
];
const handleConfirm = () => {
setIsBtnLoading(true)
schemaActions.submit()
}
......@@ -127,7 +147,21 @@ const AccountDetail: React.FC<{}> = () => {
}
const handleSubmit = (value) => {
console.log(value)
// 提交重置
let parasm = {
memberAssetAccountId: pageId,
money: Number(value.money),
type: value['type'][0]
}
PublicApi.postPayAssetAccountRecharge(parasm).then(res => {
if(res.code === 1000){
getAccountInfo()
refTrade.current.reload()
// refMove.current.reload()
}
modalRef.current.setVisible(false)
setIsBtnLoading(false)
})
}
const handleRecharge = () => {
......@@ -149,7 +183,7 @@ const AccountDetail: React.FC<{}> = () => {
<div className={styles.statistic}>
<div className={styles['statistic-title']}>可用余额(元):</div>
<div className={styles['statistic-amount']}>
{`${details.accountBalance - details.lockBalance}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
{`${((details.accountBalance*100 - details.lockBalance*100)/100).toFixed(2)}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
</div>
</div>
<div className={styles['repayment-end']}>
......@@ -175,7 +209,7 @@ const AccountDetail: React.FC<{}> = () => {
<p className={styles.rightTitle}>账户余额(元):</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>{details?.accountBalance}</p>
<p className={styles.rightInfo}>{details?.accountBalance?.toFixed(2)}</p>
</Col>
</Row>
<Row>
......@@ -183,7 +217,7 @@ const AccountDetail: React.FC<{}> = () => {
<p className={styles.rightTitle}>锁定金额(元):</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>{details?.lockBalance}</p>
<p className={styles.rightInfo}>{details?.lockBalance?.toFixed(2)}</p>
</Col>
</Row>
<Row>
......@@ -212,12 +246,24 @@ const AccountDetail: React.FC<{}> = () => {
</Space>
<Space direction="vertical" style={{width:'100%'}}>
<Card headStyle={{borderBottom:'none'}} title="交易记录">
<Table dataSource={dealRecord} columns={columns} />
<StandardTable
columns={columns}
currentRef={refTrade}
fetchTableData={(params: any) => fetchTradeData(params)}
/>
</Card>
</Space>
<Space direction="vertical" style={{width:'100%'}}>
<Card headStyle={{borderBottom:'none'}} title="流转记录">
<Table dataSource={moveRecord} columns={moveColumns} />
<Table columns={moveColumns} dataSource={moveData} pagination={false} />
{/* <StandardTable
columns={moveColumns}
currentRef={refMove}
fetchTableData={(params: any) => fetchMoveData(params)}
tableProps={{
pagination: false
}}
/> */}
</Card>
</Space>
<ModalForm
......@@ -228,6 +274,11 @@ const AccountDetail: React.FC<{}> = () => {
confirm={handleConfirm}
onSubmit={handleSubmit}
cancel={handleCannel}
modalProps={{
okText: "确定充值",
confirmLoading: isBtnLoading,
destroyOnClose: true
}}
// effects={($, {setFieldState}) => {
// $('onFieldInputChange', 'money').subscribe(parentState => {
// console.log(parentState.value)
......
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, Steps, Row, Col, Button, InputNumber, Table, message } from 'antd'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import ReutrnEle from '@/components/ReturnEle'
import styles from './index.less'
......@@ -8,15 +8,19 @@ import StatusTag from '@/components/StatusTag'
import cx from 'classnames'
import moment from 'moment'
import { ColumnType } from 'antd/lib/table/interface'
import { memberStatusMap, statusMap } from '../../constant'
import { memberStatusMap, operationMap, statusMap } from '../../constant'
import { PublicApi } from '@/services/api'
import { GetSettleAccountsCorporateAccountConfigResponse } from '@/services/SettleApi'
import { StandardTable } from 'god'
const { Step } = Steps;
const AccountDetail: React.FC<{}> = () => {
const refTrade = useRef<any>({})
const [ details, setDetails ] = useState<any>({ accountBalance: 0, lockBalance: 0})
const [dealRecord, setDealRecord] = useState<any>()
const [withdrawAmount, setWidthdrawAmount] = useState<number>(0)
const [withdrawAmount, setWidthdrawAmount] = useState<any>(0)
const [bankDetail, setBankDetail] = useState<GetSettleAccountsCorporateAccountConfigResponse>()
const [btnLoading, setBtnLoading] = useState<boolean>(false)
useEffect(() => {
getAccountInfo()
......@@ -28,11 +32,20 @@ const AccountDetail: React.FC<{}> = () => {
const { code, data } = res
setDetails(data)
if(code === 1000){
let tradeRecord = await PublicApi.getPayAssetAccountGetAccountTradeRecord({memberAssetAccountId: data.id + ''})
setDealRecord(tradeRecord.data)
let bankRes = await PublicApi.getSettleAccountsCorporateAccountConfig({memberId: data.memberId + ''})
setBankDetail(bankRes.data)
}
}
const fetchTradeData = (params) => {
return new Promise((resolve, reject) => {
PublicApi.getPayAssetAccountGetAccountTradeRecord({memberAssetAccountId: history.location.query.id + '', ...params}).then(res => {
const { data } = res
resolve(data)
})
})
}
const columns: ColumnType<any>[] = [
{
title: '交易流水号',
......@@ -54,11 +67,7 @@ const AccountDetail: React.FC<{}> = () => {
title: '交易项目',
dataIndex: 'operation',
key: 'operation',
},
{
title: '交易金额(元)',
dataIndex: 'tradeMoney',
key: 'tradeMoney',
render: (t, r) => operationMap[t]
},
{
title: '状态',
......@@ -74,7 +83,32 @@ const AccountDetail: React.FC<{}> = () => {
];
const handleAllCharge = () => {
setWidthdrawAmount(details.accountBalance - details.lockBalance)
let amount = (details.accountBalance*100 - details.lockBalance*100)/100
setWidthdrawAmount(amount)
}
// 提交提现申请
const handleSubmitApply = () => {
setBtnLoading(true)
let amount = (details.accountBalance*100 - details.lockBalance*100)/100
if(withdrawAmount > 0 && withdrawAmount <= amount){ // 大于0并且小于可用金额
let params = {
memberAssetAccountId: details.id,
money: withdrawAmount,
bankAccountName: bankDetail.name,
bankAccount: bankDetail.bankAccount,
bankName: bankDetail.bankDeposit
}
PublicApi.postPayAssetAccountCashOut(params).then(res => {
setBtnLoading(false)
getAccountInfo()
setWidthdrawAmount(0)
refTrade.current.reload()
})
}else{
setBtnLoading(false)
message.error('请正确输入提现金额!')
}
}
return (
......@@ -108,8 +142,11 @@ const AccountDetail: React.FC<{}> = () => {
formatter={value => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
parser={value => value.replace(/\$\s?|(,*)/g, '')}
className={styles['statistic-input']}
onChange={value => setWidthdrawAmount(value)}
precision={2}
min={0}
/>
<Button
<Button
type="text"
size="small"
style={{marginLeft:24, color:'#fff'}}
......@@ -121,12 +158,12 @@ const AccountDetail: React.FC<{}> = () => {
</div>
<div className={styles['repayment-end']}>
<span className={styles['repayment-time']}>
最多可以提现:¥ {details.accountBalance - details.lockBalance}
最多可以提现:¥ {((details.accountBalance*100 - details.lockBalance*100)/100).toFixed(2)}
</span>
</div>
</div>
<div className={styles['repayment-right']}>
<Button ghost>提交</Button>
<Button ghost onClick={handleSubmitApply} loading={btnLoading}>提交</Button>
</div>
</div>
</Col>
......@@ -137,7 +174,7 @@ const AccountDetail: React.FC<{}> = () => {
<p className={styles.rightTitle}>账户归属:</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>{details?.parentMemberName}</p>
<p className={styles.rightInfo}>{bankDetail?.name}</p>
</Col>
</Row>
<Row>
......@@ -145,7 +182,7 @@ const AccountDetail: React.FC<{}> = () => {
<p className={styles.rightTitle}>银行账号:</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>6214 7812 3456 7891 1234</p>
<p className={styles.rightInfo}>{bankDetail?.bankAccount}</p>
</Col>
</Row>
<Row>
......@@ -153,7 +190,7 @@ const AccountDetail: React.FC<{}> = () => {
<p className={styles.rightTitle}>开户行:</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>中国建设银行广州市分行营业部</p>
<p className={styles.rightInfo}>{bankDetail?.bankDeposit}</p>
</Col>
</Row>
</div>
......@@ -170,7 +207,7 @@ const AccountDetail: React.FC<{}> = () => {
<div className={styles.statistic}>
<div className={styles['statistic-title']}>可用余额(元):</div>
<div className={styles['statistic-amount']}>
{`${details.accountBalance - details.lockBalance}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
{`${((details.accountBalance*100 - details.lockBalance*100)/100).toFixed(2)}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
</div>
</div>
<div className={styles['repayment-end']}>
......@@ -196,7 +233,7 @@ const AccountDetail: React.FC<{}> = () => {
<p className={styles.rightTitle}>账户余额(元):</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>{details?.accountBalance}</p>
<p className={styles.rightInfo}>{details?.accountBalance?.toFixed(2)}</p>
</Col>
</Row>
<Row>
......@@ -204,7 +241,7 @@ const AccountDetail: React.FC<{}> = () => {
<p className={styles.rightTitle}>锁定金额(元):</p>
</Col>
<Col span={20}>
<p className={styles.rightInfo}>{details?.lockBalance}</p>
<p className={styles.rightInfo}>{details?.lockBalance?.toFixed(2)}</p>
</Col>
</Row>
<Row>
......@@ -225,7 +262,11 @@ const AccountDetail: React.FC<{}> = () => {
</Space>
<Space direction="vertical" style={{width:'100%'}}>
<Card headStyle={{borderBottom:'none'}} title="提现处理记录">
<Table dataSource={dealRecord} columns={columns} />
<StandardTable
columns={columns}
currentRef={refTrade}
fetchTableData={(params: any) => fetchTradeData(params)}
/>
</Card>
</Space>
</PageHeaderWrapper>
......
import React, { useState, useEffect, useRef } from 'react'
import { Card, Space, Button, } from 'antd'
import { Card } from 'antd'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import { StandardTable } from 'god'
import { ColumnType } from 'antd/lib/table/interface'
......@@ -9,7 +9,6 @@ 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'
......@@ -69,21 +68,21 @@ const AccountLists: React.FC<{}> = () => {
},
{
title: '账户余额',
dataIndex: 'accountStatus',
key: 'accountStatus',
render: text => `¥${text}`
dataIndex: 'accountBalance',
key: 'accountBalance',
render: text => `¥${text.toFixed(2)}`
},
{
title: '锁定余额',
dataIndex: 'lockBalance',
key: 'lockBalance',
render: text => `¥${text}`
render: text => `¥${text.toFixed(2)}`
},
{
title: '可用余额',
dataIndex: 'usableBalance',
key: 'usableBalance',
render: (t, r) => `¥${r.accountStatus - r.lockBalance}`
render: (t, r) => `¥${((r.accountBalance*100 - r.lockBalance*100)/100).toFixed(2)}`
},
]
......
......@@ -121,6 +121,16 @@ export const rechargeSchema: ISchema = {
required: true,
message: '请输入充值金额'
},
{
validator: value => {
return isNaN(value)
},
message:'请正确输入数字金额'
},
{
pattern: /^\d+(\.\d{1,2})?$/,
message: '充值金额仅限两位小数',
},
]
},
......@@ -129,8 +139,6 @@ export const rechargeSchema: ISchema = {
"x-component": 'CardCheckBox',
"x-component-props": {
dataSource: [
// {id: 1, name: '支付宝', logo: 'https://shushangyun01.oss-cn-shenzhen.aliyuncs.com/66bf577211624304947938a2afde771b1603682420367.png'},
// {id: 2, name: '微信', logo: 'https://shushangyun01.oss-cn-shenzhen.aliyuncs.com/733815c243ce4cec8a8cb10e0e92876f1603682449715.png'}
{id: 1, name: '支付宝', logoUrl: alipay},
{id: 2, name: '微信', logoUrl: wxpay}
],
......
......@@ -99,6 +99,7 @@ export const CREDIT_OUTER_STATUS_BADGE_MAP = {
* 资金账户相关常量
*/
// 交易记录状态
export const statusMap = {
'1': { title: '申请提现', type: 'warning' },
'2': { title: '审核通过', type: 'success' },
......@@ -108,23 +109,36 @@ export const CREDIT_OUTER_STATUS_BADGE_MAP = {
'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': '账户充值',
'2': '账户提现',
'3': '订单支付',
'4': '订单退款',
'5': '订单返利'
}
\ No newline at end of file
......@@ -2,11 +2,11 @@
* @Author: XieZhiXiong
* @Date: 2020-09-29 10:47:07
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-10-26 17:11:54
* @LastEditTime: 2020-10-27 10:33:24
* @Description: 外部流转组件
*/
import React from 'react';
import { Steps } from 'antd';
import { Steps, Empty } from 'antd';
import MellowCard from '@/components/MellowCard';
import styles from './index.less';
......@@ -34,11 +34,15 @@ const OuterCirculation: React.FC<OuterCirculation> = ({
marginBottom: 24,
}}
>
<Steps style={{ marginTop: 30 }} progressDot current={current}>
{steps.map((item, index) => (
<Steps.Step key={index} title={item.title} description={item.description} />
))}
</Steps>
{(steps && steps.length > 0) ? (
<Steps style={{ marginTop: 30 }} progressDot current={current}>
{steps.map((item, index) => (
<Steps.Step key={index} title={item.title} description={item.description} />
))}
</Steps>
) : (
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
)}
</MellowCard>
);
};
......
......@@ -46,21 +46,28 @@ interface QuotaApplicationInfo {
repayPeriod: number,
// 审批时间
verifyTime: string,
},
} | null,
};
const QuotaApplicationInfo: React.FC<QuotaApplicationInfo> = ({
editable = false,
onSubmit,
quotaInfo = {},
verify = {},
verify,
}) => {
const [modalVisible, setModalVisible] = useState(false);
const handleSubmit = values => {
if (onSubmit) {
const { billDay, repayPeriod, ...rest } = values;
const {
applyQuota,
billDay,
repayPeriod,
quotaSlide,
...rest
} = values;
onSubmit({
applyQuota: +applyQuota,
billDay: +billDay,
repayPeriod: +repayPeriod,
...rest,
......@@ -114,7 +121,7 @@ const QuotaApplicationInfo: React.FC<QuotaApplicationInfo> = ({
marginBottom: 24
}}
>
<Col span={14}>
<Col span={verify ? 14 : 24}>
<MellowCard
title="授信申请信息"
extra={(
......@@ -210,36 +217,38 @@ const QuotaApplicationInfo: React.FC<QuotaApplicationInfo> = ({
</MellowCard>
</Col>
<Col span={10}>
<MellowCard
title={(
<div style={{ color: '#fff' }}>
授信审批信息
</div>
)}
style={{
background: '#4279DF',
}}
fullHeight
>
<div className={styles.approval}>
<div className={styles['approval-amountWrap']}>
{verify ? (
<Col span={10}>
<MellowCard
title={(
<div style={{ color: '#fff' }}>
授信审批信息
</div>
)}
style={{
background: '#4279DF',
}}
fullHeight
>
<div className={styles.approval}>
<div className={styles['approval-amountWrap']}>
<Descriptions column={1}>
<Descriptions.Item label="审批额度(元)">
<div className={styles['approval-amount']}>
{verify.quota}
</div>
</Descriptions.Item>
</Descriptions>
</div>
<Descriptions column={1}>
<Descriptions.Item label="审批额度(元)">
<div className={styles['approval-amount']}>
{verify.quota}
</div>
</Descriptions.Item>
<Descriptions.Item label="审批账单日期">{verify.billDay}</Descriptions.Item>
<Descriptions.Item label="审批还款周期">{verify.repayPeriod}</Descriptions.Item>
<Descriptions.Item label="审批时间">{verify.verifyTime}</Descriptions.Item>
</Descriptions>
</div>
<Descriptions column={1}>
<Descriptions.Item label="审批账单日期">{verify.billDay}</Descriptions.Item>
<Descriptions.Item label="审批还款周期">{verify.repayPeriod}</Descriptions.Item>
<Descriptions.Item label="审批时间">{verify.verifyTime}</Descriptions.Item>
</Descriptions>
</div>
</MellowCard>
</Col>
</MellowCard>
</Col>
) : null}
</Row>
<Modal
......
......@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2020-09-29 15:51:31
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-10-26 18:46:02
* @LastEditTime: 2020-10-27 09:52:57
* @Description:
*/
import { ISchema } from '@formily/antd';
......@@ -32,6 +32,10 @@ export const editModalSchema: ISchema = {
required: true,
message: '请填写申请调整额度',
},
{
pattern: PATTERN_MAPS.money,
message: '请填写正数',
},
],
},
quotaSlide: {
......
import React, { Suspense } from 'react';
import React, { Suspense, useEffect, useState } from 'react';
import {
PageHeader,
Descriptions,
......@@ -11,114 +11,167 @@ import {
import { FormOutlined } from '@ant-design/icons';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { history } from 'umi';
import { PublicApi } from '@/services/api';
import { GetPayCreditApplyGetApplyDetailResponse } from '@/services/PayApi';
import { CREDIT_INNER_STATUS, CREDIT_OUTER_STATUS } from '@/constants';
import { usePageStatus } from '@/hooks/usePageStatus';
import AvatarWrap from '@/components/AvatarWrap';
import StatusTag from '@/components/StatusTag';
import { MEMBER_STATUS_TAG_MAP, CREDIT_OUTER_STATUS_TAG_MAP, CREDIT_OUTER_STATUS_BADGE_MAP } from '../../constant';
const OuterCirculation = React.lazy(() => import('../components/OuterCirculation'));
const QuotaApplicationInfo = React.lazy(() => import('../components/QuotaApplicationInfo'));
const HitoryList = React.lazy(() => import('../components/HistoryList'));
const OuterCirculationRecord = React.lazy(() => import('../components/OuterCirculationRecord'));
interface DetailInfo {
// 授信id
id: string;
// 申请id
applyId: string;
// 是否是编辑的
isEdit?: boolean;
};
interface QuotaValues {
// 申请调整额度
applyQuota: number | null;
// 申请调整账单日期
billDay: number | null;
// 申请还款周期
repayPeriod: number | null;
};
const QuotaFormQueryDetail: React.FC = () => {
const { id } = usePageStatus();
const [quotaInfo, setQuotaInfo] = useState<GetPayCreditApplyGetApplyDetailResponse>(null);
const [quotaValues, setQuotaValues] = useState<QuotaValues>({
applyQuota: null,
billDay: null,
repayPeriod: null,
});
const [infoLoading, setInfoloading] = useState(false);
const steps = [
{
title: '提交授信申请单',
description: '采购商',
},
{
title: '确认授信申请单',
description: '供应商',
},
{
title: '完成',
description: '',
},
];
const getQuotaInfo = () => {
if (!id) {
return;
}
setInfoloading(true);
PublicApi.getPayCreditApplyGetApplyDetail({
id,
}).then(res => {
if (res.code === 1000) {
setQuotaInfo(res.data);
setQuotaValues({
applyQuota: res.data.applyQuota,
billDay: res.data.billDay,
repayPeriod: res.data.repayPeriod,
});
}
}).finally(() => {
setInfoloading(false);
});
};
const outerRecord = [
{
id: 1,
order: 1,
role: '采购商',
status: 2,
action: '提交授信申请单',
createTime: '2020-05-12 08:08',
opinion: '同意',
},
{
id: 2,
order: 2,
role: '采购商',
status: 2,
action: '提交授信申请单',
createTime: '2020-05-12 08:08',
opinion: '同意',
},
];
useEffect(() => {
getQuotaInfo();
}, []);
return (
<PageHeaderWrapper
title={
<>
<PageHeader
style={{ padding: '0' }}
onBack={() => history.goBack()}
title={
<AvatarWrap
info={{
aloneTxt: '单',
name: '申请单号:DPTY12',
<Spin spinning={infoLoading}>
<PageHeaderWrapper
title={
<>
<PageHeader
style={{ padding: '0' }}
onBack={() => history.goBack()}
title={
<AvatarWrap
info={{
aloneTxt: '单',
name: `申请单号:${quotaInfo && quotaInfo.applyNo ? quotaInfo.applyNo : ''}`,
}}
extra={quotaInfo && quotaInfo.member ? quotaInfo.member.levelTag || '' : ''}
/>
}
extra={(
<>
</>
)}
>
<Descriptions
size="small"
column={3}
style={{
padding: '0 32px',
}}
extra="青铜会员"
/>
>
<Descriptions.Item label="会员归属">{'暂无'}</Descriptions.Item>
<Descriptions.Item label="会员类型">{quotaInfo?.member?.memberTypeName}</Descriptions.Item>
<Descriptions.Item label="会员角色名称">{quotaInfo?.member?.roleName}</Descriptions.Item>
<Descriptions.Item label="会员状态">
<StatusTag
type={MEMBER_STATUS_TAG_MAP[quotaInfo && quotaInfo.member ? quotaInfo.member.status || 1 : 1]}
title={quotaInfo && quotaInfo.member ? quotaInfo.member.status || 1 : 1}
/>
</Descriptions.Item>
<Descriptions.Item label="外部状态">
<StatusTag type={CREDIT_OUTER_STATUS_TAG_MAP[quotaInfo?.outerStatus]} title={CREDIT_OUTER_STATUS[quotaInfo?.outerStatus]} />
</Descriptions.Item>
<Descriptions.Item label="内部状态">
<Badge color={CREDIT_OUTER_STATUS_BADGE_MAP[quotaInfo?.innerStatus]} text={CREDIT_INNER_STATUS[quotaInfo?.innerStatus]} />
</Descriptions.Item>
</Descriptions>
</PageHeader>
</>
}
>
<Suspense fallback={null}>
<OuterCirculation
steps={
quotaInfo && quotaInfo.outerVerifyRecordList ?
quotaInfo.outerVerifyRecordList.map(item => ({
title: item.operate,
description: item.roleName,
})) :
[]
}
extra={(
<>
</>
)}
>
<Descriptions
size="small"
column={3}
style={{
padding: '0 32px',
}}
>
<Descriptions.Item label="会员归属">广州白马皮具交易中心</Descriptions.Item>
<Descriptions.Item label="会员类型">企业会员</Descriptions.Item>
<Descriptions.Item label="会员角色名称">采购商</Descriptions.Item>
<Descriptions.Item label="会员状态">
<StatusTag type="success" title="正常" />
</Descriptions.Item>
<Descriptions.Item label="外部状态">
<StatusTag type="success" title="接受申请" />
</Descriptions.Item>
<Descriptions.Item label="内部状态">
<Badge color="#41CC9E" text="正常" />
</Descriptions.Item>
</Descriptions>
</PageHeader>
</>
}
>
<Suspense fallback={null}>
<OuterCirculation steps={steps} />
</Suspense>
<Suspense fallback={null}>
<QuotaApplicationInfo />
</Suspense>
<Suspense fallback={null}>
<HitoryList />
</Suspense>
<Suspense fallback={null}>
<OuterCirculationRecord dataSource={outerRecord} />
</Suspense>
</PageHeaderWrapper>
current={0}
/>
</Suspense>
<Suspense fallback={null}>
<QuotaApplicationInfo
quotaInfo={{
originalQuota: quotaInfo?.originalQuota,
applyQuota: quotaValues.applyQuota,
billDay: quotaValues.billDay,
repayPeriod: quotaValues.repayPeriod,
applyTime: quotaInfo?.applyTime,
}}
verify={
quotaInfo && quotaInfo.verify ? {
quota: quotaInfo?.verify?.quota,
billDay: quotaInfo?.verify?.billDay,
repayPeriod: quotaInfo?.verify?.repayPeriod,
verifyTime: quotaInfo?.verify?.verifyTime,
} :
null
}
editable={false}
/>
</Suspense>
<Suspense fallback={null}>
<HitoryList dataSource={quotaInfo?.historyApplyList} />
</Suspense>
<Suspense fallback={null}>
<OuterCirculationRecord dataSource={quotaInfo?.outerVerifyRecordList} />
</Suspense>
</PageHeaderWrapper>
</Spin>
);
};
......
......@@ -64,7 +64,7 @@ const QuotaFormQuery: React.FC = () => {
render: (text, record) => (
<>
<EyePreview
url={`/memberCenter/payandSettle/creditApplication/quotaFormQuery/detail`}
url={`/memberCenter/payandSettle/creditApplication/quotaFormQuery/detail?id=${record.id}`}
>
{text}
</EyePreview>
......
......@@ -9,6 +9,7 @@ import { PublicApi } from '@/services/api';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { coverColFiltersItem } from '@/utils';
import {
CREDIT_STATUS_NOT_APPLIED,
CREDIT_STATUS_APPLYING,
......@@ -192,7 +193,32 @@ const QuotaMenage: React.FC = () => {
};
// 初始化高级筛选选项
const fetchSelectOptions = async () => {
const fetchSearchItems = async () => {
const res = await PublicApi.getPayCreditApplyPageItemsByConsumer();
if (res.code === 1000) {
const { data } = res;
const {
statusList = [],
repayStatusList = [],
} = data;
const newColumns = columns.slice();
// filter 0 过滤掉全部选项
coverColFiltersItem(
newColumns,
'statusName',
statusList.map(item => ({ text: item.name, value: item.status })).filter(item => item.value),
);
setColumns(newColumns);
return {
status: statusList.map(item => ({ label: item.name, value: item.status })).filter(item => item.value),
rePayStatus: repayStatusList.map(item => ({ label: item.name, value: item.status })).filter(item => item.value),
};
}
return {};
};
......@@ -218,8 +244,8 @@ const QuotaMenage: React.FC = () => {
FORM_FILTER_PATH,
);
useAsyncInitSelect(
['innerStatus', 'outerStatus'],
fetchSelectOptions,
['status', 'rePayStatus'],
fetchSearchItems,
);
}}
schema={listSearchSchema}
......
......@@ -7,18 +7,6 @@
*/
import { ISchema } from '@formily/antd';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import {
CREDIT_STATUS_NOT_APPLIED,
CREDIT_STATUS_APPLYING,
CREDIT_STATUS_NORMAL,
CREDIT_STATUS_FROZEN,
CREDIT_STATUS,
CREDIT_REPAYMENT_STATUS_OUTSTANDING,
CREDIT_REPAYMENT_STATUS_UNCONFIRMED,
CREDIT_REPAYMENT_STATUS_PAID,
CREDIT_REPAYMENT_STATUS_OVERDUE,
CREDIT_REPAYMENT_STATUS,
} from '@/constants';
export const listSearchSchema: ISchema = {
type: 'object',
......@@ -49,24 +37,7 @@ export const listSearchSchema: ISchema = {
rePayStatus: {
type: 'string',
default: undefined,
enum: [
{
label: CREDIT_STATUS[CREDIT_STATUS_NOT_APPLIED],
value: CREDIT_STATUS_NOT_APPLIED,
},
{
label: CREDIT_STATUS[CREDIT_STATUS_APPLYING],
value: CREDIT_STATUS_APPLYING,
},
{
label: CREDIT_STATUS[CREDIT_STATUS_NORMAL],
value: CREDIT_STATUS_NORMAL,
},
{
label: CREDIT_STATUS[CREDIT_STATUS_FROZEN],
value: CREDIT_STATUS_FROZEN,
},
],
enum: [],
'x-component-props': {
placeholder: '还款状态(全部)',
allowClear: true,
......@@ -75,24 +46,7 @@ export const listSearchSchema: ISchema = {
status: {
type: 'string',
default: undefined,
enum: [
{
label: CREDIT_REPAYMENT_STATUS[CREDIT_REPAYMENT_STATUS_OUTSTANDING],
value: CREDIT_REPAYMENT_STATUS_OUTSTANDING
},
{
label: CREDIT_REPAYMENT_STATUS[CREDIT_REPAYMENT_STATUS_UNCONFIRMED],
value: CREDIT_REPAYMENT_STATUS_UNCONFIRMED
},
{
label: CREDIT_REPAYMENT_STATUS[CREDIT_REPAYMENT_STATUS_PAID],
value: CREDIT_REPAYMENT_STATUS_PAID
},
{
label: CREDIT_REPAYMENT_STATUS[CREDIT_REPAYMENT_STATUS_OVERDUE],
value: CREDIT_REPAYMENT_STATUS_OVERDUE
},
],
enum: [],
'x-component-props': {
placeholder: '状态(全部)',
allowClear: true,
......
......@@ -24,19 +24,26 @@ const HitoryList = React.lazy(() => import('../../../components/HistoryList'));
const OuterCirculationRecord = React.lazy(() => import('../../../components/OuterCirculationRecord'));
interface DetailInfo {
// 授信id
id: string;
// 申请id
applyId: string;
// 是否是编辑的
isEdit?: boolean;
};
interface QuotaValues {
// 申请调整额度
applyQuota: number | null;
// 申请调整账单日期
billDay: number | null;
// 申请还款周期
repayPeriod: number | null;
};
const DetailInfo: React.FC<DetailInfo> = ({
id,
applyId,
isEdit = false,
}) => {
const [quotaInfo, setQuotaInfo] = useState<GetPayCreditApplyGetApplyDetailResponse>(null);
......@@ -58,6 +65,11 @@ const DetailInfo: React.FC<DetailInfo> = ({
}).then(res => {
if (res.code === 1000) {
setQuotaInfo(res.data);
setQuotaValues({
applyQuota: res.data.applyQuota,
billDay: res.data.billDay,
repayPeriod: res.data.repayPeriod,
});
}
}).finally(() => {
setInfoloading(false);
......@@ -76,11 +88,14 @@ const DetailInfo: React.FC<DetailInfo> = ({
const handleSubmit = () => {
setSubmitLoading(true);
PublicApi.postPayCreditApplyAddCreditApply({
creditId: +id,
creditId: +id,
applyId: applyId ? +applyId : 0,
...quotaValues,
}).then(res => {
if (res.code === 1000) {
history.goBack();
setTimeout(() => {
history.goBack();
}, 800);
}
}).finally(() => {
setSubmitLoading(false);
......@@ -99,9 +114,9 @@ const DetailInfo: React.FC<DetailInfo> = ({
<AvatarWrap
info={{
aloneTxt: '单',
name: `申请单号:${quotaInfo?.applyNo}`,
name: `申请单号:${quotaInfo && quotaInfo.applyNo ? quotaInfo.applyNo : ''}`,
}}
extra={quotaInfo?.member?.levelTag}
extra={quotaInfo && quotaInfo.member ? quotaInfo.member.levelTag || '' : ''}
/>
}
extra={(
......@@ -163,17 +178,20 @@ const DetailInfo: React.FC<DetailInfo> = ({
<QuotaApplicationInfo
quotaInfo={{
originalQuota: quotaInfo?.originalQuota,
applyQuota: quotaInfo?.applyQuota,
billDay: quotaInfo?.billDay,
repayPeriod: quotaInfo?.repayPeriod,
applyQuota: quotaValues.applyQuota,
billDay: quotaValues.billDay,
repayPeriod: quotaValues.repayPeriod,
applyTime: quotaInfo?.applyTime,
}}
verify={{
quota: quotaInfo?.verify.quota,
billDay: quotaInfo?.verify.billDay,
repayPeriod: quotaInfo?.verify.repayPeriod,
verifyTime: quotaInfo?.verify.verifyTime,
}}
verify={
quotaInfo && quotaInfo.verify ? {
quota: quotaInfo?.verify?.quota,
billDay: quotaInfo?.verify?.billDay,
repayPeriod: quotaInfo?.verify?.repayPeriod,
verifyTime: quotaInfo?.verify?.verifyTime,
} :
null
}
editable={isEdit}
onSubmit={handleQuotaSubmit}
/>
......
......@@ -35,7 +35,7 @@ const QuotaPrSubmit: React.FC = () => {
render: (text, record) => (
<>
<EyePreview
url={`/memberCenter/payandSettle/creditApplication/quotaPrSubmit/detail`}
url={`/memberCenter/payandSettle/creditApplication/quotaPrSubmit/detail?id=${record.id}`}
>
{text}
</EyePreview>
......@@ -84,7 +84,7 @@ const QuotaPrSubmit: React.FC = () => {
filters: [],
onFilter: (value, record) => record.outerStatus === value,
render: (text, record) => (
<StatusTag type={CREDIT_OUTER_STATUS_TAG_MAP[record.outerStatus]} title={text} />
<StatusTag type={CREDIT_OUTER_STATUS_TAG_MAP[record.outerStatus]} title={record.outerStatusName} />
),
},
{
......@@ -93,7 +93,7 @@ const QuotaPrSubmit: React.FC = () => {
align: 'center',
filters: [],
onFilter: (value, record) => record.innerStatus === value,
render: (text, record) => <Badge color={CREDIT_OUTER_STATUS_BADGE_MAP[record.innerStatus]} text={text} />,
render: (text, record) => <Badge color={CREDIT_OUTER_STATUS_BADGE_MAP[record.innerStatus]} text={record.innerStatusName} />,
},
{
title: '操作',
......
......@@ -494,6 +494,27 @@ export const isJSONStr = str => {
return str;
}
/**
* 给 Table columns 的 filters 赋值
* @param {array} data 需要赋值的数组
* @param {string} dataIndex 索引
* @param {array} item 需要赋值的值
*/
export const coverColFiltersItem = (
data: Array<{[key: string]: any}>,
dataIndex: string,
item: {[key: string]: any}
) => {
const index = data.findIndex(i => i.dataIndex === dataIndex);
if (index !== -1) {
data.splice(index, 1, {
...data[index],
filters: item,
});
}
};
export default {
isArray,
isObject,
......
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