Commit f8939353 authored by LeeJiancong's avatar LeeJiancong

支付策略初始化

parent 560d4549
{"userRegister":{"useType":{"memberType":[],"businessType":[]},"useDetail":[]},"global":{"logo":"http://lingxi-frontend-test.oss-cn-hangzhou.aliyuncs.com/images/logo.png","countryList":[{"name":"简体中文-ZH","key":"cn","icon":"http://lingxi-frontend-test.oss-cn-hangzhou.aliyuncs.com/images/china.png"},{"name":"English-EN","key":"en","icon":"http://lingxi-frontend-test.oss-cn-hangzhou.aliyuncs.com/images/us.png"},{"name":"日本語-JP","key":"jp","icon":"http://lingxi-frontend-test.oss-cn-hangzhou.aliyuncs.com/images/japen.png"},{"name":"한국어-KO","key":"ko","icon":"http://lingxi-frontend-test.oss-cn-hangzhou.aliyuncs.com/images/koren.png"}]}}
const mockData = {
message: '',
code: 1000,
data: {
global: {
logo: 'http://lingxi-frontend-test.oss-cn-hangzhou.aliyuncs.com/images/logo.png',
countryList: [
{
name: '简体中文-ZH',
key: 'cn',
icon: 'http://lingxi-frontend-test.oss-cn-hangzhou.aliyuncs.com/images/china.png'
},
{
name: 'English-EN',
key: 'en',
icon: 'http://lingxi-frontend-test.oss-cn-hangzhou.aliyuncs.com/images/us.png'
},
{
name: '日本語-JP',
key: 'jp',
icon: 'http://lingxi-frontend-test.oss-cn-hangzhou.aliyuncs.com/images/japen.png'
},
{
name: '한국어-KO',
key: 'ko',
icon: 'http://lingxi-frontend-test.oss-cn-hangzhou.aliyuncs.com/images/koren.png'
}
],
menuList: [
{ code: '/memberCenter/commodityAbility', children: [ {code: '/mem'} ] },
{ code: '/memberCenter/commodityAbility/classAndProperty/class' },
]
}
}
}
exports.fetchConfig = async () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(mockData.data)
}, 2* 1000)
})
}
\ No newline at end of file
......@@ -3,7 +3,8 @@
"scripts": {
"api": "god-ytt",
"start:analyze": "ANALYZE=1 umi dev",
"start": "umi dev",
"scripts:build": "node scripts/run",
"start": "yarn scripts:build && umi dev",
"build": "umi build",
"build:analyze": "ANALYZE=1 umi build",
"postinstall": "umi generate tmp",
......@@ -42,6 +43,9 @@
},
"devDependencies": {
"axios": "^0.19.2",
"god-yapi2ts": "^1.6.0"
"god-yapi2ts": "^1.6.0",
"gulp": "^4.0.2",
"json2ts": "^0.0.7",
"ora": "^4.0.4"
}
}
const path = require('path')
const Logs = require('./utils/log')
const fse = require('fs-extra')
const Type = require('./utils/type')
const runFile = './services'
const fetchConfig = require(runFile).fetchConfig
const gulp = require('gulp')
const json2ts = require('json2ts')
const rootPath = '../';
const outputPath = path.resolve(__dirname, rootPath, 'config/base.config.json')
const outputDts = path.resolve(__dirname, rootPath, 'src/global/config/global.d.ts')
Logs.start('gulp start')
gulp.task('start', gulp.series(done => {
getAsyncConfig(done)
}))
/**
* 生成对应json文件
*/
function genarateBaseJson(obj, done) {
if (Type.isObject(obj)) {
fse.ensureFile(outputPath).then(() => {
fse.writeJson(outputPath, obj).then(() => {
Logs.success('\nstart genarate config json')
Logs.success('write success')
Logs.stop('Configuration has arrived locally', 'success')
genarateDtsFile(JSON.stringify(obj), done)
}).catch(err => {
Logs.error(err)
done()
})
})
} else {
Logs.error('!!!!!! value is not a object !!!!!')
Logs.error(`here is your value, the type is ${typeof obj}`)
console.log(obj)
Logs.stop('Append error!!!', 'fail')
done()
}
}
function genarateDtsFile(json, done) {
const dtsResult = json2ts.convert(json)
fse.outputFile(outputDts, dtsResult).then(() => {
done()
})
}
/**
* 异步获取远程配置
* @todo
*/
async function getAsyncConfig(done) {
const data = await fetchConfig()
genarateBaseJson(data, done)
}
\ No newline at end of file
const gulp = require('gulp')
function runTask(toRun) {
const metadata = { task: toRun };
// Gulp >= 4.0.0 (doesn't support events)
const taskInstance = gulp.task(toRun);
if (taskInstance === undefined) {
gulp.emit('task_not_found', metadata);
return;
}
const start = process.hrtime();
gulp.emit('task_start', metadata);
try {
taskInstance.apply(gulp);
metadata.hrDuration = process.hrtime(start);
gulp.emit('task_stop', metadata);
gulp.emit('stop');
} catch (err) {
err.hrDuration = process.hrtime(start);
err.task = metadata.task;
gulp.emit('task_err', err);
}
}
require('./gulpfile')
runTask('start')
\ No newline at end of file
/*
* @Author: LeeJiancong
* @Date: 2020-08-10 14:41:27
* @LastEditors: LeeJiancong
* @LastEditTime: 2020-08-10 16:43:05
*/
/**
* 用于在项目开始前获取所有的配置
* 在项目开始前运行`yarn scripts:build`
* @todo 缺少异常处理清空
* @author xjm
*/
const Axios = require('axios').default;
const deepClone = require('clone')
const demoFetch = require('../../demo').fetchConfig
const isDemo = true
const axios = Axios.create({
baseURL: 'http://10.0.0.25:8100',
responseType: 'json',
})
const serviceConfig = {
// 用于注册页
userRegister: {
useType: {
url: '/member/menu/register/type',
method: 'get'
},
useDetail: {
url: '/member/menu/register/detail',
method: 'get'
},
},
//初始化会员支付策略配置
payConfig:{
payInitializeConfig:{
url:'/pay/initialize/config',
method: 'post'
}
}
}
// 批量组装接口
async function batchAxiosHttps() {
const asyncHttpQueue = deepClone(serviceConfig)
for (const item in serviceConfig) {
if(JSON.stringify(item) !== '{}'){
for (const subItem in serviceConfig[item]) {
const data = await axios(serviceConfig[item][subItem])
asyncHttpQueue[item][subItem] = data.data.data
}
}
}
return isDemo ? Object.assign(asyncHttpQueue, await demoFetch()) : asyncHttpQueue
}
exports.fetchConfig = batchAxiosHttps
\ No newline at end of file
const chalk = require('chalk')
const ora = require('ora')
const spinner = ora('Loading remote configuration')
const log = console.log
const Logs = {
success(msg) {
log(chalk.green(msg))
},
error(msg) {
log(chalk.red(msg))
},
start() {
spinner.start()
},
stop(msg, type) {
const instance = spinner.stop()
type === 'success' ? instance.succeed(msg) : instance.fail(msg)
}
}
module.exports = Logs
\ No newline at end of file
const Type = {
isObject(data) {
return Object.prototype.toString.call(data) === '[object Object]'
}
}
module.exports = Type
\ No newline at end of file
import React from 'react'
import { Popconfirm, Button } from 'antd'
import { PlayCircleOutlined } from '@ant-design/icons'
import { PlayCircleOutlined,PauseCircleOutlined } from '@ant-design/icons'
export interface StatusSwitchProps {
record: any,
......@@ -20,7 +20,12 @@ const StatusSwitch:React.FC<StatusSwitchProps> = (props) => {
okText="是"
cancelText="否"
>
<Button type="link" style={record[fieldNames] === expectTrueValue?{color:'#00B37A'}:{color:'red'}}>{record[fieldNames] === expectTrueValue?'有效':'无效'} <PlayCircleOutlined /></Button>
<Button type="link" style={record[fieldNames] === expectTrueValue?{color:'#00B37A'}:{color:'red'}}>
{record[fieldNames] === expectTrueValue?'有效':'无效'}
{
record[fieldNames] === expectTrueValue ?<PlayCircleOutlined /> : <PauseCircleOutlined />
}
</Button>
</Popconfirm>
)
}
......
export interface MemberType {
id: number;
typeName: string;
}
export interface BusinessType {
id: number;
typeName: string;
}
export interface UseType {
memberType: any[];
businessType: any[];
memberType: MemberType[];
businessType: BusinessType[];
}
export interface Element {
id: number;
fieldName: string;
fieldCNName: string;
fieldType: string;
fieldLength: number;
fieldEmpty: number;
fieldOrder: number;
fieldRemark: string;
checkRules: any[];
}
export interface UseDetail {
groupName: string;
elements: Element[];
}
export interface UserRegister {
useType: UseType;
useDetail: any[];
useDetail: UseDetail[];
}
export interface RuleConfiguration {
id: number;
platformType: number;
platformWayName: string;
}
export interface PayWayResponse {
id: number;
payType: number;
way: string;
isPitchOn: number;
}
export interface PayInitializeConfig {
payType: number;
ruleConfigurations: RuleConfiguration[];
payWayResponses: PayWayResponse[];
}
export interface PayConfig {
payInitializeConfig: PayInitializeConfig[];
}
export interface CountryList {
......@@ -14,12 +64,23 @@ export interface CountryList {
icon: string;
}
export interface Children {
code: string;
}
export interface MenuList {
code: string;
children: Children[];
}
export interface Global {
logo: string;
countryList: CountryList[];
menuList: MenuList[];
}
export interface RootObject {
userRegister: UserRegister;
payConfig: PayConfig;
global: Global;
}
\ No newline at end of file
......@@ -3,10 +3,11 @@ import { Input, Space, Button, Table } from 'antd'
import { PlusOutlined } from '@ant-design/icons'
const MultTable = (props) => {
const { columns, suffix, rowKey } = props.props['x-component-props']
const { columns, suffix, prefix,rowKey } = props.props['x-component-props']
const value = props.value || []
return (
<div style={{width: '100%'}}>
{prefix}
<Table
rowKey={rowKey || 'id'}
columns={columns}
......
......@@ -3,13 +3,15 @@ import SchemaForm, { IAntdFormItemProps, IAntdSchemaFormProps} from '@formily/a
import Text from './components/Text'
import RadioGroud from './components/RadioGroud'
import PayTable from './components/PayTable'
import MultTable from '@/components/NiceForm/components/MultTable'
export interface PayFormProps extends IAntdSchemaFormProps {}
const PayForm:React.FC<PayFormProps> = props => {
const {children,components,...reset} = props
const customComponents = {
Text,
RadioGroud,
PayTable
PayTable,
MultTable
}
const defineComponents = Object.assign(customComponents,components)
return (
......
import React, { useEffect , useState,useRef } from 'react'
import {Card,Button,Modal} from 'antd'
import { PlusOutlined, SaveOutlined } from '@ant-design/icons'
import { PageHeaderWrapper} from '@ant-design/pro-layout'
import {StandardTable} from 'god'
import {ColumnType} from 'antd/lib/table/interface'
import EyePreview from '@/components/EyePreview'
import {createFormActions,ISchema} from '@formily/antd'
import PayForm from '../components/PayForm'
import {strategyDetailTab} from '../schema'
import {usePageStatus} from '@/hooks/usePageStatus'
import { useRowSelectionTable} from '@/hooks/useRowSelectionTable'
import {findItemAndDelete} from '@/utils'
import { GlobalConfig } from '@/global/config'
import { PublicApi } from '@/services/api'
const payActions = createFormActions()
const fetchMemberList = async (params) => {
const res = await PublicApi.getMemberMaintenancePage(params)
return res.data
}
const PaySetting: React.FC<{}> = () => {
const ref = useRef<any>({})
const [visible, setvisible] = useState<boolean>(false)
const [visibleChannelMember, setVisibleChannelMember] = useState(false)
const [memberRowSelection, memberRowCtl] = useRowSelectionTable()
const [optionType, setoptionType] = useState(0)
const columnsSetMember: ColumnType<any>[] = [
{
title: 'ID',
dataIndex: 'memberId',
align: 'center',
key: 'memberId',
},
{
title: '会员名称',
dataIndex: 'name',
align: 'center',
key: 'name',
},
{
title: '会员类型',
dataIndex: 'memberTypeName',
align: 'center',
key: 'memberTypeName',
},
{
title: '会员角色',
dataIndex: 'roleName',
align: 'center',
key: 'roleName',
},
{
title: '会员等级',
dataIndex: 'levelTag',
align: 'center',
key: 'levelTag',
}
]
const [infoData, setinfoData] = useState<any>(
{
paymentPolicyPayWayRequests:[{
id: 1,
payType: 1,
payWayIds: [{
label:'12',
value:'12'
}],
payList:[{
label:1,
value:'12'
}
],
ruleConfigurationId: 1,
}]
}
)
const [id, setid] = useState<any>('')
let [tabOption, settabOption] = useState({
tab: 1,
type: 1
})
const handleModalOK = () => {
setvisible(false)
ref.current.reload()
}
// 弹出会员
const handleAddMemberBtn = () => {
// const checkBoxs = payActions.getFieldValue('applyMember')
// memberRowCtl.setSelectedRowKeys(checkBoxs.map(v => v.memberId))
// memberRowCtl.setSelectRow(checkBoxs)
setvisible(true)
console.log(visibleChannelMember)
}
// 会员添加弹窗控制
const handleOkAddMember = () => {
setvisible(false)
payActions.setFieldValue('applyMember', memberRowCtl.selectRow)
}
const handleCancelAddMember = () => {
setvisible(false)
}
// 会员选择后的表格
const handleDeleteTable = (id) => {
const value = payActions.getFieldValue('applyMember')
payActions.setFieldValue('applyMember', findItemAndDelete(value, id))
}
const tableAddButton = <Button style={{marginBottom: 16}} block icon={<PlusOutlined/>} onClick={() =>handleAddMemberBtn()} type='dashed'>选择指定会员</Button>
const tableColumns = [
{ dataIndex: 'memberId', title: 'ID', align: 'center' },
{ dataIndex: 'name', title: '会员名称',key:'name', align: 'center' },
{ dataIndex: 'memberTypeName', key:'memberTypeName',align: 'center', title: '会员类型', render: (_, record) => <EyePreview url={`/memberCenter/memberAbility/manage/addMember?id=${record.memberId}&preview=1`}>{_}</EyePreview> },
{ dataIndex: 'roleName', key:'roleName',title: '会员角色', align: 'center' },
{ dataIndex: 'levelTag', key:'levelTag',title: '会员等级', align: 'center' },
{ dataIndex: 'ctl', title: '操作', align: 'center', render: (_, record) =>
<>
<Button type='link' onClick={() => handleDeleteTable(record.id)}>删除</Button>
</>
}
]
useEffect(() => {
console.log(usePageStatus().pageStatus,'状态')
PublicApi.getPayPayMemberTacticsDetails({id: usePageStatus().id}).then(res => {
let list = res.data
// setinfoData(list)
})
return () => {
}
}, [])
const formSearch: ISchema = {
type: 'object',
properties: {
name: {
type: 'string',
"x-component": 'Search',
"x-component-props": {
placeholder: '请输入会员名称'
}
}
}
}
// 整体表单提交
const handleSubmit = (values:any) => {
let baseList: any = GlobalConfig.payConfig.payInitializeConfig
//新增
if(!usePageStatus().id){
let list:any = []
baseList.forEach((item:any,index:number) => {
let payWayIds = `payWayIds-${index}`, ruleConfigurationId = `ruleConfigurationId-${index}`
list.push({
payType: item.payType,
['payWayIds']: values[payWayIds],
['ruleConfigurationId']:values[ruleConfigurationId]
})
});
console.log(list)
}
}
return (
<PageHeaderWrapper
extra={
<Button type="primary" onClick={() => payActions.submit()} icon={<SaveOutlined/>}>
保存
</Button>
}
>
<Card>
<PayForm
expressionScope={{
tableColumns,
tableAddButton
}}
onSubmit={handleSubmit}
actions={payActions}
schema={strategyDetailTab(infoData,usePageStatus)}
/>
</Card>
<Modal
width={704}
title='选择适用会员'
onOk={handleOkAddMember}
onCancel={handleCancelAddMember}
visible={visible}
>
<StandardTable
columns={columnsSetMember}
rowSelection={memberRowSelection}
fetchTableData={params => fetchMemberList(params)}
formilyProps={
{
ctx: { schema: formSearch }
}
}
tableProps={{
rowKey: 'memberId'
}}
>
</StandardTable>
</Modal>
</PageHeaderWrapper>
)
}
export default PaySetting
\ No newline at end of file
import React, { useEffect,useState, useRef } from 'react';
import {Card,Row,Col,Space,Button} from 'antd'
import {Card,Row,Col,Space,Button,Popconfirm} from 'antd'
import {history} from 'umi'
import {StandardTable} from 'god'
import { ColumnType} from 'antd/lib/table/interface'
import EyePreview from '@/components/EyePreview'
import NiceForm from '@/components/NiceForm'
import StatusSwitch from '@/components/StatusSwitch'
import {createFormActions} from '@formily/antd'
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch'
import {FORM_FILTER_PATH} from '@/formSchema/const'
......@@ -47,20 +49,58 @@ const List: React.FC<{}> = () => {
title:'状态',
dataIndex:'state',
key:'state',
align:'center'
align:'center',
render: (text: any, record: any) => (
<StatusSwitch
fieldNames="state"
handleConfirm={() => handleModify(record)}
record={record}
/>
)
},
{
title:'操作',
dataIndex:'options',
key:'options',
align:'center',
render: (_: any, record: any) => {
const status = record.status === 0?'启用':'停用'
const title = `确定要${status}吗?`
return (
<>
<Popconfirm title={title} okText="是" cancelText="否" onConfirm={() => handleChangeStatus(record.id,record.status)}>
<Button type='link'>
{ record.status === 0?'启用':'停用'}
</Button>
</Popconfirm>
{
record.status === 0 ?
<>
<Button type='link' onClick={() => history.push(`/memberCenter/logisticsAbility/logistics/list/templateForm?id=${record.id}`)}>编辑</Button>
<Popconfirm title="确定要删除吗?" okText="是" cancelText="否" onConfirm={() =>handleDelete(record.id)}>
<Button type='link'>
删除
</Button>
</Popconfirm>
</> : ''
}
</>
)
}
}
]
const handleToAdd = () => {
const handleModify = (record: any) => {
}
const handleDelete = (id:number) => {
}
const handleToAdd = () => {
history.push('/ruleSettingManager/payStrategyDetail')
}
const fetchData = (params:any) => {
return new Promise((resolve,reject)=> {
PublicApi.getPayPaymentPolicyList({...searchParams,...params}).then(res => {
......@@ -75,31 +115,39 @@ const List: React.FC<{}> = () => {
tableProps={{rowKey:'id'}}
columns={columns}
fetchTableData={(params:any) => fetchData(params)}
controlRender ={
<Row>
<Col>
<Button
type="primary"
onClick={handleToAdd}
icon={<PlusOutlined/>}
>
新建
</Button>
</Col>
<Col>
<NiceForm
actions = {formActions}
onSubmit={values => ref.current.reload(values)}
effects={($,actions) => {
useStateFilterSearchLinkageEffect($,actions,'search',FORM_FILTER_PATH)
}}
schema={strategySearch}
>
</NiceForm>
</Col>
</Row>
}
formilyLayouts ={{
justify:"space-between"
}}
formilyChilds={{
layouts:{
order:2
},
children:
<Button
type="primary"
onClick={handleToAdd}
icon={<PlusOutlined />}
>
新建
</Button>
}}
formilyProps={{
layouts:{
order:3
},
ctx: {
schema: {
type: 'object',
properties: {
name: {
type: 'string',
"x-component": 'search'
}
}
}
}
}}
/>
</Card>
)
......
......@@ -2,15 +2,211 @@
* @Author: LeeJiancong
* @Date: 2020-08-06 11:12:18
* @LastEditors: LeeJiancong
* @LastEditTime: 2020-08-07 15:43:28
* @LastEditTime: 2020-08-10 20:41:41
*/
import React, { Component } from 'react'
import { ISchema } from '@formily/antd'
import { FORM_FILTER_PATH } from '@/formSchema/const'
import { GlobalConfig } from '@/global/config'
import { AreaChartOutlined } from '@ant-design/icons'
let payType = ['', '线上支付', '线下支付', '授信额度支付', '货到付款支付']
//会员支付策略
export const strategyDetailTab = (props: any, usePageStatus: any) => {
//新增时候就初始化
let baseList: any = GlobalConfig.payConfig.payInitializeConfig
baseList.forEach((v, i) => {
let ruleList = [], payWayList = []
v.ruleConfigurations.forEach((child: any, childindex: number) => {
let ruleObj = {}
child['label'] = child.id
child['value'] = child.platformWayName
})
v.payWayResponses.forEach((child, childindex) => {
child['value'] = child.id
child['label'] = child.way
})
})
console.log('baseList', baseList)
let tabItem = {}, Tab1 = {},arr=[]
baseList.map((item, index) => {
Tab1[`MEGA_LAYOUT_LINE${index}`] = {
type: 'Text',
title: <div style={{ borderLeft: '2px solid #00B37A', padding: '1px 5px' }}>{payType[item.payType]}</div>,
}
Tab1[`MEGA_LAYOUT_TAB${index}`] = {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
label: '资金收集模式',
wrapperCol: 24,
required: true,
},
properties: {
[`ruleConfigurationId-${index}`]: {
type: 'string',
enum: item.ruleConfigurations,
'x-component-props': {
},
required: true,
},
[`payWayIds-${index}`]: {
type: 'array:number',
enum: item.payWayResponses,
"x-component": 'checkbox',
'x-component-props': {
},
required: false,
}
}
}
// arr.push({[`payWayIds${index}`: values[`payWayIds[${index}]`],[`ruleConfigurationId`]})
})
// props.paymentPolicyPayWayRequests
// baseList.forEach((v, i) => {
// Tab1[`payTitle-${payType[v.payType]}`] = {
// type: 'Text',
// title: <div style={{ borderLeft: '2px solid #00B37A', padding: '1px 5px' }}>{payType[v.payType]}</div>,
// }
// Tab1[`ruleConfigurationId-${v.payType}`] = {
// type: 'string',
// required: true,
// title: '资金归集模式',
// enum: v.ruleConfigurations
// }
// Tab1[`payWayId-${v.payType}`] = {
// type: 'array:number',
// "x-component": 'checkbox',
// enum: v.payWayResponses,
// properties:{
// }
// }
// console.log('tab1', Tab1)
// })
tabItem[`tab-0`] = {
"type": 'object',
"x-component": 'tabpane',
"x-component-props": {
tab: '基本信息'
},
"properties": {
MEGA_LAYOUT1: {
type: 'object',
"x-component": 'mega-layout',
"x-component-props": {
labelCol: 4,
wrapperCol: 8,
labelAlign: 'left'
},
properties: {
paymentPolicyName: {
type: 'string',
required: true,
title: '策略名称',
'x-component-props': {
placeholder: '请输入策略名称',
},
},
...Tab1
}
}
}
}
tabItem[`tab-1`] = {
"type": 'object',
"x-component": 'tabpane',
"x-component-props": {
tab: '适用会员'
},
properties: {
MEGA_LAYOUT2: {
type: 'object',
"x-component": 'mega-layout',
"x-component-props": {
labelCol: 4,
labelAlign: 'left'
},
properties: {
"isSelected": {
"type": "radio",
enum: [
{ label: '所有会员共享(默认)', value: 1 },
{ label: '指定会员', value: 0 },
],
"title": "适用会员",
default: 1,
required: true,
"x-linkages": [
{
type: 'value:visible',
target: 'applyMember',
"condition": "{{!$value}}"
}
]
},
applyMember: {
type: 'array:number',
"x-component": 'PayTable',
"x-component-props": {
rowKey: 'memberId',
columns: "{{tableColumns}}",
prefix: "{{tableAddButton}}"
}
}
}
}
}
}
console.log('tabItem', tabItem)
let payTabSetting: ISchema = {
type: 'object',
properties: {
PAY_TABS: {
type: 'object',
"x-component": 'tab',
"x-component-props": {
type: 'card'
},
properties: { ...tabItem }
}
}
}
return payTabSetting
}
//列表搜索 多条件的schema
export const strategySearch: ISchema = {
type:'onbject',
properties:{
type: 'object',
properties: {
megaLayout: {
type: 'object',
"x-component": 'mega-layout',
properties: {
search: {
type: 'string',
"x-component": 'Search',
"x-mega-props": {
},
"x-component-props": {
placeholder: '搜素'
}
}
}
}
}
}
export const paySetting: ISchema = {
......@@ -26,6 +222,8 @@ export const paySetting: ISchema = {
}
}
//会员支付参数配置
export const TabSetting = (props: any[]) => {
let tabItem = {}
props.forEach((v, i) => {
......
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