Merge branch 'dev' into release

This commit is contained in:
Xu Chang 2024-06-28 16:25:07 +08:00
commit 2199279916
182 changed files with 3280 additions and 444 deletions

View File

@ -1,9 +1,9 @@
import { BRC } from '../types/RuntimeCxt';
import { BackendRuntimeContext } from '../context/BackendRuntimeContext';
import { EntityDict } from '../oak-app-domain';
export type AspectDict = {
export type AspectDict<ED extends EntityDict> = {
getWithdrawCreateData: (params: {
accountId: string;
price: number;
withdrawAccountId?: string;
}, context: BRC) => Promise<EntityDict['withdraw']['CreateSingle']['data']>;
}, context: BackendRuntimeContext<ED>) => Promise<EntityDict['withdraw']['CreateSingle']['data']>;
};

View File

@ -1,4 +1,5 @@
import { EntityDict } from '../oak-app-domain';
import { AspectDict } from './AspectDict';
declare const aspectDict: AspectDict;
declare const aspectDict: AspectDict<EntityDict>;
export default aspectDict;
export { AspectDict, };

View File

@ -54,14 +54,15 @@ const checkers = [
case 'refund':
case 'withdraw': {
if (totalPlus >= 0 || availPlus >= 0 || totalPlus !== availPlus) {
throw new OakInputIllegalException('accountOper', ['availPlus'], 'accountOper为withdraw时其totalPlus和availPlus必须为不相等的负数');
throw new OakInputIllegalException('accountOper', ['availPlus'], `accountOper为${type}其totalPlus和availPlus必须为不相等的负数`);
}
break;
}
case 'refundFailure':
case 'withdrawBack': {
case 'withdrawBack':
case 'consumeBack': {
if (totalPlus <= 0 || availPlus <= 0 || totalPlus !== availPlus) {
throw new OakInputIllegalException('accountOper', ['availPlus'], 'accountOper为withdraw时其totalPlus和availPlus必须为不相等的正数');
throw new OakInputIllegalException('accountOper', ['availPlus'], `accountOper为${type}其totalPlus和availPlus必须为不相等的正数`);
}
break;
}

View File

@ -27,13 +27,16 @@ function checkAttributes(data) {
}
}
}
const { refundCompensateRatio, refundGapDays } = data;
const { refundCompensateRatio, refundGapDays, withdrawTransferLossRatio } = data;
if (typeof refundGapDays !== 'number' || refundGapDays < 0) {
throw new OakInputIllegalException('offlineAccount', ['refundGapDays'], 'offlineAccount::error.refundGapDaysNotNegative');
}
if (typeof refundCompensateRatio !== 'number' || refundCompensateRatio < 0 || refundCompensateRatio > 100) {
throw new OakInputIllegalException('offlineAccount', ['refundGapDays'], 'offlineAccount::error.refundCompensateIllegal');
}
if (typeof withdrawTransferLossRatio !== 'number' || withdrawTransferLossRatio < 0) {
throw new OakInputIllegalException('offlineAccount', ['withdrawTransferLossRatio'], 'offlineAccount::error.withdrawTransferLossRatioNotNegative');
}
}
const checkers = [
{

View File

@ -15,6 +15,7 @@ const checkers = [
},
},
action: 'create',
errMsg: 'error::refund.create.hasAnotherRefunding',
},
{
entity: 'refund',

View File

@ -16,8 +16,8 @@ declare const List: <T extends keyof EntityDict>(props: ReactComponentProps<Enti
attributes: OakAbsAttrDef[];
data: RowWithActions<EntityDict, T>[];
loading: boolean;
tablePagination?: any;
rowSelection?: any;
tablePagination?: false | import("antd").TablePaginationConfig | undefined;
rowSelection?: import("antd/es/table/interface").TableRowSelection<RowWithActions<EntityDict, T>> | undefined;
hideHeader?: boolean | undefined;
disableSerialNumber?: boolean | undefined;
size?: "small" | "middle" | "large" | undefined;
@ -27,7 +27,7 @@ declare const List: <T extends keyof EntityDict>(props: ReactComponentProps<Enti
} & {
scrollToFirstRowOnChange?: boolean | undefined;
}) | undefined;
locale?: any;
locale?: import("antd/es/table/interface").TableLocale | undefined;
opWidth?: number | undefined;
}>) => React.ReactElement;
declare const ListPro: <T extends keyof EntityDict>(props: {
@ -43,29 +43,34 @@ declare const ListPro: <T extends keyof EntityDict>(props: {
attributes: OakAbsAttrDef[];
data: RowWithActions<EntityDict, T>[];
loading?: boolean | undefined;
tablePagination?: any;
rowSelection?: any;
tablePagination?: false | import("antd").TablePaginationConfig | undefined;
rowSelection?: import("antd/es/table/interface").TableRowSelection<RowWithActions<EntityDict, T>> | undefined;
disableSerialNumber?: boolean | undefined;
size?: "small" | "middle" | "large" | undefined;
scroll?: any;
locale?: any;
scroll?: ({
x?: string | number | true | undefined;
y?: string | number | undefined;
} & {
scrollToFirstRowOnChange?: boolean | undefined;
}) | undefined;
locale?: import("antd/es/table/interface").TableLocale | undefined;
opWidth?: number | undefined;
}) => React.ReactElement;
declare const Detail: <T extends keyof EntityDict>(props: ReactComponentProps<EntityDict, T, false, {
column?: number | Record<Breakpoint, number> | undefined;
column?: number | Record<import("antd").Breakpoint, number> | undefined;
entity: T;
attributes: OakAbsAttrDef[];
data: Partial<EntityDict[T]["Schema"]>;
title?: string | undefined;
bordered?: boolean | undefined;
layout?: "horizontal" | "vertical" | undefined;
layout?: "vertical" | "horizontal" | undefined;
}>) => React.ReactElement;
declare const Upsert: <T extends keyof EntityDict>(props: ReactComponentProps<EntityDict, T, false, {
helps: Record<string, string>;
entity: T;
attributes: OakAbsAttrUpsertDef<EntityDict, T, string | number>[];
data: EntityDict[T]["Schema"];
layout: "horizontal" | "vertical";
layout: "vertical" | "horizontal";
mode: "default" | "card";
}>) => React.ReactElement;
export { FilterPanel, List, ListPro, Detail, Upsert, ReactComponentProps, ColumnProps, RowWithActions, OakExtraActionProps, OakAbsAttrDef, onActionFnDef, };

View File

@ -74,7 +74,7 @@ export default function render(props) {
update({ allowWithdrawTransfer });
}}/>
</Form.Item>
<Form.Item label={t('offlineAccount:attr.withdrawTransferLossRatio')} help={t('placeholder.withdrawTransferLossRatio')}>
<Form.Item label={t('offlineAccount:attr.withdrawTransferLossRatio')} help={t('placeholder.withdrawTransferLossRatio')} required>
<InputNumber value={offlineAccount.withdrawTransferLossRatio} max={5} min={0.01} addonAfter={"%"} step={0.01} precision={2} onChange={(value) => {
const withdrawTransferLossRatio = value;
update({ withdrawTransferLossRatio });

View File

@ -24,5 +24,7 @@
"orderPriceSum": "订单总额",
"orderManage": "订单管理",
"orderList": "订单列表",
"tips1": "总账户余额+退款总额+转账总额+订单总额应该等于系统账户总余额"
"tips1": "总账户余额+退款总额+转账总额+订单总额应该等于系统账户总余额",
"move": "移动资金",
"history": "账单"
}

View File

@ -1,10 +1,13 @@
import React from 'react';
import React, { useState } from 'react';
import { Descriptions, Tag, Modal, Flex, Button, Divider, Alert } from 'antd';
import { AlipayOutlined, WechatOutlined } from '@ant-design/icons';
import Styles from './web.pc.module.less';
import { ThousandCont, ToYuan } from "oak-domain/lib/utils/money";
import { OfflineAccount as OADetail } from '../../offlineAccount/config/web.pc';
import { WpAccount as WADetail } from '../../wpAccount/config/web.pc';
import TransferList from '../transferList';
import SysAccountMoveCreate from '../../sysAccountMove/create';
import SysAccountOperList from '../../sysAccountOper/list';
function OfflineAccount(props) {
const { data, t } = props;
const { type, channel, color, name } = data;
@ -65,6 +68,10 @@ export default function render(props) {
const { accounts, total, systemId, accountNum, accountTotalSum, accountAvailSum, refundCnt, refundPriceSum, transferCnt, transferPriceSum, orderCnt, orderPaidSum, orderRefundSum, } = props.data;
const { t, setMessage } = props.methods;
if (accounts && systemId) {
const [showTransferList, setShowTransferList] = useState(false);
const [showMoveCreate, setShowMoveCreate] = useState(false);
const [showHistoryList, setShowHistoryList] = useState(false);
const [showHistoryAcc, setShowHistoryAcc] = useState(undefined);
return (<div className={Styles.container}>
<Descriptions title={t('sysAccount')} bordered items={[
{
@ -78,7 +85,14 @@ export default function render(props) {
label: t('count'),
children: accounts.length,
}
]} column={2}/>
]} column={2} extra={<>
<Button type="primary" onClick={() => setShowMoveCreate(true)}>
{t('move')}
</Button>
<Modal destroyOnClose open={showMoveCreate} onCancel={() => setShowMoveCreate(false)} closeIcon={null} width={800} title={t('move')} footer={null}>
<SysAccountMoveCreate oakPath="$opb-sysAccount-survery-saMoveCreate" systemId={systemId} onSuccess={() => setShowMoveCreate(false)}/>
</Modal>
</>}/>
<div className={Styles.sysAccounts}>
{accounts.map(({ entity, data }, idx) => {
const TopRender = RenderSysAccountCardTopDict[entity];
@ -92,6 +106,12 @@ export default function render(props) {
</div>
<div className={Styles.bottom}>
<Button onClick={() => {
setShowHistoryAcc({ entity, data });
setShowHistoryList(true);
}} style={{ marginRight: 8, }}>
{t('history')}
</Button>
<Button onClick={() => {
const DetailRender = RenderSysAccountDetailDict[entity];
if (DetailRender) {
Modal.info({
@ -110,6 +130,20 @@ export default function render(props) {
}}>
{t('common::action.detail')}
</Button>
{!!showHistoryAcc && showHistoryList &&
<Modal destroyOnClose open={showHistoryList} onCancel={() => {
setShowHistoryAcc(undefined);
setShowHistoryList(false);
}} width={800} title={showHistoryAcc.entity === 'offlineAccount' ?
(showHistoryAcc.data.type === 'bank' ?
`${t(`${showHistoryAcc.entity}:v.type.${showHistoryAcc.data.type}`)}-${showHistoryAcc.data.channel}-${t('history')}`
: `${t(`${showHistoryAcc.entity}:v.type.${showHistoryAcc.data.type}`)}-${showHistoryAcc.data.name}-${t('history')}`) : `${t(`${showHistoryAcc.entity}:name`)}-${t('history')}`} footer={null}>
<div style={{ height: '65vh' }}>
<SysAccountOperList entity={showHistoryAcc.entity} entityId={showHistoryAcc.data.id} oakPath="$opb-sysAccount-survery-operList"/>
</div>
</Modal>}
</div>
</div>);
})}
@ -119,16 +153,16 @@ export default function render(props) {
{
label: t('accountTotalSum'),
children: <div className={Styles.total}>
<span className={Styles.symbol}>{t('common::pay.symbol')}</span>
<span className={Styles.value}>{ThousandCont(ToYuan(accountTotalSum || 0), 2)}</span>
</div>
<span className={Styles.symbol}>{t('common::pay.symbol')}</span>
<span className={Styles.value}>{ThousandCont(ToYuan(accountTotalSum || 0), 2)}</span>
</div>
},
{
label: t('accountAvailSum'),
children: <div className={Styles.total}>
<span className={Styles.symbol}>{t('common::pay.symbol')}</span>
<span className={Styles.value}>{ThousandCont(ToYuan(accountAvailSum || 0), 2)}</span>
</div>
<span className={Styles.symbol}>{t('common::pay.symbol')}</span>
<span className={Styles.value}>{ThousandCont(ToYuan(accountAvailSum || 0), 2)}</span>
</div>
},
{
label: t('accountNum'),
@ -142,14 +176,14 @@ export default function render(props) {
label: t('refundPriceSum'),
span: 2,
children: (<div className={Styles.span2}>
<span className={Styles.total}>
<span className={Styles.symbol}>{t('common::pay.symbol')}</span>
<span className={Styles.value}>{ThousandCont(ToYuan(refundPriceSum || 0), 2)}</span>
</span>
<Button style={{ marginLeft: 20 }}>
{t('refundList')}
</Button>
</div>)
<span className={Styles.total}>
<span className={Styles.symbol}>{t('common::pay.symbol')}</span>
<span className={Styles.value}>{ThousandCont(ToYuan(refundPriceSum || 0), 2)}</span>
</span>
<Button style={{ marginLeft: 20 }}>
{t('refundList')}
</Button>
</div>)
},
{
label: t('transferCnt'),
@ -159,14 +193,17 @@ export default function render(props) {
label: t('transferPriceSum'),
span: 2,
children: (<div className={Styles.span2}>
<span className={Styles.total}>
<span className={Styles.symbol}>{t('common::pay.symbol')}</span>
<span className={Styles.value}>{ThousandCont(ToYuan(transferPriceSum || 0), 2)}</span>
</span>
<Button>
{t('transferList')}
</Button>
</div>)
<span className={Styles.total}>
<span className={Styles.symbol}>{t('common::pay.symbol')}</span>
<span className={Styles.value}>{ThousandCont(ToYuan(transferPriceSum || 0), 2)}</span>
</span>
<Button onClick={() => setShowTransferList(true)}>
{t('transferList')}
</Button>
<Modal open={showTransferList} onCancel={() => setShowTransferList(false)} footer={null} closeIcon={null} width={800}>
<TransferList oakPath="$opb-sysAccount-survery-transferList"/>
</Modal>
</div>)
},
{
label: t('orderCnt'),
@ -175,14 +212,14 @@ export default function render(props) {
{
label: t('orderPriceSum'),
children: (<div className={Styles.span2}>
<div className={Styles.total}>
<span className={Styles.symbol}>{t('common::pay.symbol')}</span>
<span className={Styles.value}>{ThousandCont(ToYuan((orderPaidSum || 0) - (orderRefundSum || 0)), 2)}</span>
</div>
<Button>
{t('orderList')}
</Button>
</div>)
<div className={Styles.total}>
<span className={Styles.symbol}>{t('common::pay.symbol')}</span>
<span className={Styles.value}>{ThousandCont(ToYuan((orderPaidSum || 0) - (orderRefundSum || 0)), 2)}</span>
</div>
<Button>
{t('orderList')}
</Button>
</div>)
}
]} column={3}/>}
</div>);

View File

@ -19,13 +19,14 @@
padding: 8px;
flex-wrap: wrap;
margin-top: 12px;
gap: 14px;
.sysAccount {
width: 244px;
height: 284px;
border: solid 0.1px silver;
border-radius: 5px;
margin-right: 14px;
// margin-right: 14px;
display: flex;
flex-direction: column;
align-items: stretch;
@ -64,7 +65,7 @@
}
}
}
.span2 {
display: flex;
flex-direction: row;

View File

@ -0,0 +1,3 @@
/// <reference types="wechat-miniprogram" />
declare const _default: (props: import("oak-frontend-base").ReactComponentProps<import("../../../oak-app-domain").EntityDict, "withdrawTransfer", true, WechatMiniprogram.Component.DataOption>) => React.ReactElement;
export default _default;

View File

@ -0,0 +1,52 @@
export default OakComponent({
entity: 'withdrawTransfer',
isList: true,
projection: {
id: 1,
price: 1,
loss: 1,
externalId: 1,
iState: 1,
withdrawAccount: {
org: 1,
name: 1,
code: 1,
channel: {
entity: 1,
entityId: 1,
offlineAccount: {
id: 1,
type: 1,
}
},
id: 1,
}
},
filters: [
{
filter() {
const systemId = this.features.application.getApplication().systemId;
return {
withdrawAccount: {
ofSystemId: systemId,
},
iState: 'transferring',
};
}
}
],
formData({ data }) {
return {
transfers: data?.map((ele) => {
const { withdrawAccount, ...rest } = ele;
const { entity, offlineAccount } = withdrawAccount.channel;
const channel = entity === 'offlineAccount' ? this.t(`withdraw::channel.offlineAccount.${offlineAccount?.type}`) : this.t(`withdraw::channel.${entity}`);
return {
...rest,
withdrawAccount,
channel,
};
}),
};
},
});

View File

@ -0,0 +1 @@
{}

View File

@ -0,0 +1,6 @@
{
"label": {
"channel": "转账渠道"
},
"tips": "正在转账的金额不计入任何账户,请到\"提现转账管理\"菜单完成操作"
}

View File

@ -0,0 +1,12 @@
import React from 'react';
import { RowWithActions, WebComponentProps } from 'oak-frontend-base';
import { EntityDict } from '../../../oak-app-domain';
export default function Render(props: WebComponentProps<EntityDict, 'pay', false, {
transfers?: (RowWithActions<EntityDict, 'withdrawTransfer'> & {
creatorName: string;
creatorMobile: string;
operatorName: string;
operatorMobile: string;
channel: string;
})[];
}>): React.JSX.Element;

View File

@ -0,0 +1,45 @@
import React from 'react';
import { Result, Alert } from 'antd';
import ListPro from 'oak-frontend-base/es/components/listPro';
import { ThousandCont, ToYuan } from 'oak-domain/lib/utils/money';
export default function Render(props) {
const { transfers, oakFullpath, oakExecutable } = props.data;
const { t } = props.methods;
if (transfers?.length) {
return (<ListPro entity="withdrawTransfer" data={transfers} title={<Alert type="info" message={t('tips')}/>} attributes={[
{
path: 'price',
label: t('withdrawTransfer:attr.price'),
width: 100,
render: (row) => {
return `${t('common::pay.symbol')} ${ThousandCont(ToYuan(row.price), 2)}`;
}
},
{
path: 'loss',
label: t('withdrawTransfer:attr.loss'),
width: 100,
render: (row) => {
return `${t('common::pay.symbol')} ${ThousandCont(ToYuan(row.loss), 2)}`;
}
},
{
path: '$$createAt$$',
label: t('common::$$createAt$$'),
width: 100,
},
{
path: 'channel',
label: t('label.channel'),
type: 'string',
width: 100,
},
{
path: 'externalId',
label: t('withdrawTransfer:attr.externalId'),
width: 120,
},
]} disabledOp={true}/>);
}
return (<Result status="404" title={t('common::noData')}/>);
}

View File

@ -0,0 +1,7 @@
import { EntityDict } from "../../../oak-app-domain";
declare const _default: (props: import("oak-frontend-base").ReactComponentProps<EntityDict, keyof EntityDict, boolean, {
systemId: string;
entities: string[];
onSuccess: (id: string) => void;
}>) => React.ReactElement;
export default _default;

View File

@ -0,0 +1,145 @@
import { uniq } from "oak-domain/lib/utils/lodash";
import { generateNewIdAsync } from 'oak-domain/lib/utils/uuid';
import { ThousandCont, ToCent, ToYuan } from 'oak-domain/lib/utils/money';
export default OakComponent({
properties: {
systemId: '',
entities: [],
onSuccess: (id) => undefined,
},
data: {
accounts: [],
fromEntity: '',
fromEntityId: '',
toEntity: '',
toEntityId: '',
price: 0,
externalId: '',
remark: '',
max: 0,
},
lifetimes: {
ready() {
this.refreshSysAccount();
}
},
methods: {
async refreshSysAccount() {
const { entities, systemId } = this.props;
const accounts2 = await Promise.all(uniq(['wpAccount', 'offlineAccount'].concat(entities || [])).map(async (entity) => {
const { data: rows } = await this.features.cache.refresh(entity, {
data: entity === 'offlineAccount' ? {
id: 1,
price: 1,
name: 1,
type: 1,
channel: 1,
} : {
id: 1,
price: 1,
},
filter: {
systemId,
}
});
const accounts = rows.map((row) => {
const { id, price, name, type, channel } = row;
return {
id: id,
entity: entity,
priceStr: ThousandCont(ToYuan(price)),
price: price,
label: entity === 'offlineAccount' ? `${this.t(`${entity}:name`)}-${this.t(`offlineAccount:v.type.${type}`)}` : this.t(`${entity}:name`),
name: name || undefined,
};
});
return accounts;
}));
this.setState({
accounts: accounts2.flat(),
});
},
setFromId(id) {
const { accounts } = this.state;
const account = accounts.find(ele => ele.id === id);
this.setState({
fromEntity: account.entity,
fromEntityId: account.id,
max: ToYuan(account.price),
});
},
setToId(id) {
const { accounts } = this.state;
const account = accounts.find(ele => ele.id === id);
this.setState({
toEntity: account.entity,
toEntityId: account.id,
});
},
setPrice(price) {
this.setState({
price,
});
},
setExternalId(externalId) {
this.setState({
externalId,
});
},
setRemark(remark) {
this.setState({
remark,
});
},
async createMove() {
const { fromEntity, fromEntityId, toEntity, toEntityId, price, remark, externalId } = this.state;
const userId = this.features.token.getUserId();
const systemId = this.features.application.getApplication().systemId;
const id = await generateNewIdAsync();
const price2 = ToCent(price);
const { onSuccess } = this.props;
await this.execute(undefined, undefined, undefined, [
{
entity: 'sysAccountMove',
operation: {
id: await generateNewIdAsync(),
action: 'create',
data: {
id,
price: price2,
externalId,
remark,
systemId,
operatorId: userId,
sysAccountOper$sysAccountMove: [
{
id: await generateNewIdAsync(),
action: 'create',
data: {
id: await generateNewIdAsync(),
entity: fromEntity,
entityId: fromEntityId,
delta: -price2,
type: 'moveOut',
},
},
{
id: await generateNewIdAsync(),
action: 'create',
data: {
id: await generateNewIdAsync(),
entity: toEntity,
entityId: toEntityId,
delta: price2,
type: 'moveIn',
},
},
]
}
},
}
]);
onSuccess && onSuccess(id);
}
}
});

View File

@ -0,0 +1 @@
{}

View File

@ -0,0 +1,6 @@
{
"label": {
"from": "从账户",
"to": "到账户"
}
}

View File

@ -0,0 +1,26 @@
import React from 'react';
import { WebComponentProps } from 'oak-frontend-base';
import { EntityDict } from '../../../oak-app-domain';
export default function Render(props: WebComponentProps<EntityDict, 'pay', false, {
fromEntityId?: string;
toEntityId?: string;
price: number;
max?: number;
externalId: string;
remark: string;
accounts: Array<{
id: string;
entity: string;
price: number;
priceStr: string;
label: string;
name?: string;
}>;
}, {
setFromId: (id: string) => void;
setToId: (id: string) => void;
setPrice: (price: number) => void;
setExternalId: (externalId: string) => void;
setRemark: (remark: string) => void;
createMove: () => Promise<void>;
}>): React.JSX.Element | null;

View File

@ -0,0 +1,68 @@
import React from 'react';
import { Button, Form, Input, InputNumber, Radio, Space, Flex } from 'antd';
export default function Render(props) {
const { price, externalId, max, remark, fromEntityId, toEntityId, accounts } = props.data;
const { t, setFromId, setToId, setPrice, setExternalId, setRemark, createMove } = props.methods;
if (accounts.length) {
return (<>
<Form labelCol={{ span: 4 }} wrapperCol={{ span: 14 }} layout="horizontal" style={{
marginTop: 20,
}}>
<Form.Item label={t('label.from')} required>
<Radio.Group onChange={({ target }) => {
setFromId(target.value);
}} value={fromEntityId}>
<Space direction="vertical">
{accounts.filter(ele => ele.price > 0).map(ele => {
const { id, label, price, priceStr } = ele;
return (<Radio value={id} key={id} disabled={price <= 0}>
{`${label}: ${t('common::pay.symbol')}${priceStr}`}
</Radio>);
})}
</Space>
</Radio.Group>
</Form.Item>
{fromEntityId && <Form.Item label={t('label.to')} required>
<Radio.Group onChange={({ target }) => {
setToId(target.value);
}} value={toEntityId}>
<Space direction="vertical">
{accounts.filter(ele => ele.id !== fromEntityId).map(ele => {
const { id, label, price, priceStr } = ele;
return (<Radio value={id} key={id}>
{`${label}: ${t('common::pay.symbol')}${priceStr}`}
</Radio>);
})}
</Space>
</Radio.Group>
</Form.Item>}
{fromEntityId && toEntityId && <Form.Item label={t('sysAccountMove:attr.price')} required>
<InputNumber value={price} style={{
width: 240,
}} max={max} precision={2} onChange={(value) => {
const price = value;
setPrice(price);
}}/>
</Form.Item>}
{fromEntityId && toEntityId && <Form.Item label={t('sysAccountMove:attr.externalId')} required>
<Input value={externalId} onChange={({ currentTarget }) => {
const externalId = currentTarget.value;
setExternalId(externalId);
}} maxLength={64}/>
</Form.Item>}
{fromEntityId && toEntityId && <Form.Item label={t('sysAccountMove:attr.remark')}>
<Input.TextArea value={remark || undefined} onChange={({ currentTarget }) => {
const remark = currentTarget.value;
setRemark(remark);
}} rows={4}/>
</Form.Item>}
</Form>
<Flex style={{ width: '100%', padding: 12 }} justify="end">
<Button type="primary" disabled={!fromEntityId || !toEntityId || !price || !externalId} onClick={() => createMove()}>
{t('common::confirm')}
</Button>
</Flex>
</>);
}
return null;
}

View File

@ -0,0 +1,5 @@
declare const _default: (props: import("oak-frontend-base").ReactComponentProps<import("../../../oak-app-domain").EntityDict, "sysAccountOper", true, {
entity: string;
entityId: string;
}>) => React.ReactElement;
export default _default;

View File

@ -0,0 +1,127 @@
import dayjs from 'dayjs';
import { ToYuan, ThousandCont } from "oak-domain/lib/utils/money";
export default OakComponent({
entity: 'sysAccountOper',
isList: true,
projection: {
id: 1,
delta: 1,
type: 1,
entity: 1,
entityId: 1,
$$createAt$$: 1,
},
filters: [
{
filter() {
const { entity, entityId } = this.props;
return {
entity,
entityId,
};
}
}
],
formData({ data }) {
return {
sysAccountOpers: data.map((oper) => {
const { $$createAt$$, type, delta } = oper;
const num = Math.abs(delta);
const plus = ThousandCont(ToYuan(num), 2);
const sign = delta > 0 ? '+' : '-';
const time = dayjs($$createAt$$).format('YYYY-MM-DD HH:mm');
const symbol = this.t(`sysAccountOper:v.type.${type}`)[0];
const bgColor = this.features.style.getColor('sysAccountOper', 'type', type);
return {
value: `${sign}${plus}`,
time,
type: this.t(`sysAccountOper:v.type.${type}`),
symbol,
bgColor,
};
}),
};
},
pagination: {
pageSize: 7,
currentPage: 1,
},
getTotal: 100,
properties: {
entity: '',
entityId: '',
},
data: {
month: new Date(),
monthStr: '',
type: 'all',
typesOptions: []
},
lifetimes: {
ready() {
let typesOptions = [{
label: this.t('all'),
value: 'all',
}];
const types = ['withdrawTransfer', 'pay', 'refund', 'compensate', 'moveIn', 'moveOut'];
types.forEach((ele) => {
typesOptions.push({
label: this.t(`sysAccountOper:v.type.${ele}`),
value: ele,
});
});
this.setState({
typesOptions,
});
this.setTypeFilter();
}
},
methods: {
setType(type) {
this.setState({
type,
}, () => this.setTypeFilter());
},
setTypeFilter() {
const { type } = this.state;
if (type === 'all') {
this.removeNamedFilterByName('type', true);
}
else {
this.addNamedFilter({
'#name': 'type',
filter: {
type,
}
}, true);
}
},
setMonth(month) {
if (month) {
const m = dayjs(month);
const begin = m.startOf('month').valueOf();
const end = m.endOf('month').valueOf();
this.setState({
monthStr: m.format('YYYY-MM'),
month,
}, () => this.addNamedFilter({
'#name': 'month',
filter: {
$$createAt$$: {
$between: [begin, end],
}
}
}, true));
}
else {
this.setState({
monthStr: '',
month: undefined,
}, () => this.removeNamedFilter({
'#name': 'month',
filter: {}
}, true));
}
},
}
});

View File

@ -0,0 +1 @@
{}

View File

@ -0,0 +1,5 @@
{
"history": "账户历史",
"chooseMonth": "选择月份",
"all": "全部"
}

View File

@ -0,0 +1,42 @@
.container {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
}
.control {
padding: 4px;
}
.value {
font-size: x-large;
font-weight: bold;
}
.content{
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.types {
padding: 20px;
width: 100%;
}
.pagi{
display: flex;
align-items: center;
justify-content: center;
}
.empty {
display: flex;
width: 100%;
flex: 1;
background-color: white;
align-items: center;
justify-content: center;
}

View File

@ -0,0 +1,25 @@
import React from 'react';
import { WebComponentProps } from 'oak-frontend-base';
import { EntityDict } from '../../../oak-app-domain';
import { SysAccountOperType } from '../../../types/sysAccountOper';
type SAOType = SysAccountOperType | 'all';
export default function Render(props: WebComponentProps<EntityDict, 'accountOper', true, {
sysAccountOpers?: Array<{
value: string;
time: string;
type: string;
symbol: string;
bgColor: string;
}>;
month?: Date;
monthStr: string;
type: SAOType;
typesOptions: {
label: string;
value: SAOType;
}[];
}, {
setMonth: (month?: Date) => void;
setType: (type: SAOType) => void;
}>): React.JSX.Element;
export {};

View File

@ -0,0 +1,36 @@
import React from 'react';
import { Avatar, List, Select, Flex, DatePicker, Empty, Pagination } from 'antd';
import Styles from './web.module.less';
import dayJs from 'dayjs';
export default function Render(props) {
const { sysAccountOpers, month, type, monthStr, oakLoading, oakLoadingMore, typesOptions, oakPagination } = props.data;
const { t, setType, setMonth, setPageSize, setCurrentPage } = props.methods;
const { pageSize, total, currentPage } = oakPagination || {};
return (<div className={Styles.container}>
<Flex gap="middle" justify="flex-end" className={Styles.control}>
<DatePicker picker="month" onChange={(value) => {
setMonth(value?.toDate());
}} maxDate={dayJs()}/>
<Select style={{ width: 120 }} onChange={(value) => {
setType(value);
}} value={type} options={typesOptions}/>
</Flex>
{sysAccountOpers?.length ?
<div className={Styles.content}>
<List loading={oakLoading || oakLoadingMore} dataSource={sysAccountOpers} renderItem={(item, idx) => (<List.Item key={idx}>
<List.Item.Meta avatar={<Avatar style={{ backgroundColor: item.bgColor }}>{item.symbol}</Avatar>} title={<span className={Styles.type}>{item.type}</span>} description={<div>{item.time}</div>}/>
<div className={Styles.value} style={{
color: item.bgColor,
}}>
{item.value}
</div>
</List.Item>)}/>
<div className={Styles.pagi}>
<Pagination current={currentPage} total={total} pageSize={pageSize} onShowSizeChange={(size) => setPageSize(size)} onChange={(page) => setCurrentPage(page)}/>
</div>
</div>
: (<Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/>)}
</div>);
}

View File

@ -1,6 +1,6 @@
{
"label": {
"channel": "提现渠道",
"channel": "转账渠道",
"transferActualPrice": "实际转账金额",
"sysAccountAmount": "系统账户余额",
"cn": "创建者",

View File

@ -8,7 +8,7 @@ export default function render(props) {
if (wpAccount) {
return (<Form labelCol={{ span: 8 }} wrapperCol={{ span: 12 }} layout="horizontal" style={{ minWidth: 860 }}>
{(!wechatPay || wechatPay.$$createAt$$ === 1) && <WechatPayUpsert oakPath={`${oakFullpath}.wechatPay`} systemId={systemId} key="wpCreate"/>}
{(wpAccount.wechatPayId && wechatPay?.$$createAt$$ !== 1) && <WechatPayUpsert oakPath={`${oakFullpath}.wechatPay`} systemId={systemId} key="wpUpdate" oakId={wpAccount.wechatPayId}/>}
{(wpAccount.wechatPayId && wpAccount?.$$createAt$$ !== 1) && <WechatPayUpsert oakPath={`${oakFullpath}.wechatPay`} systemId={systemId} key="wpUpdate" oakId={wpAccount.wechatPayId}/>}
<Form.Item label="说明">
<div className={Styles.tips}>
{t('wechatPayIsShared')}

View File

@ -138,7 +138,7 @@ const attrUpdateMatrix = {
actions: ['update'],
},
price: {
actions: ['pay', 'refund', 'deposit', 'withdraw', 'tax'],
actions: ['pay', 'refund', 'deposit', 'withdrawTransfer', 'tax', 'moveOut', 'moveIn', 'compensate'],
},
allowDeposit: {
actions: ['update'],
@ -200,7 +200,7 @@ const attrUpdateMatrix = {
actions: ['update'],
},
price: {
actions: ['pay', 'refund', 'deposit', 'withdraw', 'tax'],
actions: ['pay', 'refund', 'deposit', 'withdrawTransfer', 'tax', 'moveOut', 'moveIn', 'compensate'],
}
},
withdrawAccount: {

View File

@ -15,7 +15,7 @@ export declare class BackendRuntimeContext<ED extends EntityDict & BaseEntityDic
type?: number | undefined;
systemId?: number | undefined;
system?: import("../oak-app-domain/System/Schema").Projection | undefined;
config?: number | import("oak-domain/lib/types").JsonProjection<import("../oak-app-domain/Application/Schema").WechatMpConfig | import("../oak-app-domain/Application/Schema").WebConfig | import("../oak-app-domain/Application/Schema").WechatPublicConfig | import("../oak-app-domain/Application/Schema").NativeConfig> | undefined;
config?: number | import("oak-domain/lib/types").JsonProjection<import("../oak-app-domain/Application/Schema").WebConfig | import("../oak-app-domain/Application/Schema").WechatMpConfig | import("../oak-app-domain/Application/Schema").WechatPublicConfig | import("../oak-app-domain/Application/Schema").NativeConfig> | undefined;
style?: number | import("oak-domain/lib/types").JsonProjection<import("oak-general-business/lib/types/Style").Style> | undefined;
domainId?: number | undefined;
domain?: import("../oak-app-domain/Domain/Schema").Projection | undefined;

View File

@ -10,8 +10,13 @@ const actionAuths = [
deActions: ['select', 'create']
},
{
id: 'user-acc-pay',
pathId: 'user-acc-pay',
id: 'creator-order-pay',
pathId: 'creator-order-pay',
deActions: ['select', 'create', 'startPaying', 'startRefunding', 'close']
},
{
id: 'user-dep-acc-pay',
pathId: 'user-dep-acc-pay',
deActions: ['select', 'update', 'startPaying', 'startRefunding', 'close']
},
{

View File

@ -406,7 +406,47 @@ const i18ns = [
"orderPriceSum": "订单总额",
"orderManage": "订单管理",
"orderList": "订单列表",
"tips1": "总账户余额+退款总额+转账总额+订单总额应该等于系统账户总余额"
"tips1": "总账户余额+退款总额+转账总额+订单总额应该等于系统账户总余额",
"move": "移动资金",
"history": "账单"
}
},
{
id: "207fd2189d3697d15672176ae88f4175",
namespace: "oak-pay-business-c-sysAccount-transferList",
language: "zh-CN",
module: "oak-pay-business",
position: "src/components/sysAccount/transferList",
data: {
"label": {
"channel": "转账渠道"
},
"tips": "正在转账的金额不计入任何账户,请到\"提现转账管理\"菜单完成操作"
}
},
{
id: "17a11f164c9977d8eb5b59fbc78755d5",
namespace: "oak-pay-business-c-sysAccountMove-create",
language: "zh-CN",
module: "oak-pay-business",
position: "src/components/sysAccountMove/create",
data: {
"label": {
"from": "从账户",
"to": "到账户"
}
}
},
{
id: "f89e1a2d0e88d8e2b3f900cfe28a893e",
namespace: "oak-pay-business-c-sysAccountOper-list",
language: "zh-CN",
module: "oak-pay-business",
position: "src/components/sysAccountOper/list",
data: {
"history": "账户历史",
"chooseMonth": "选择月份",
"all": "全部"
}
},
{
@ -583,7 +623,7 @@ const i18ns = [
position: "src/components/withdrawTransfer/list",
data: {
"label": {
"channel": "提现渠道",
"channel": "转账渠道",
"transferActualPrice": "实际转账金额",
"sysAccountAmount": "系统账户余额",
"cn": "创建者",
@ -753,6 +793,11 @@ const i18ns = [
"order": {
"payAmountNotEnough": "支付的额度总和不足",
"nonePay": "没有传入支付信息"
},
"refund": {
"create": {
"hasAnotherRefunding": "您有一笔退款正在进行中"
}
}
}
},
@ -786,7 +831,8 @@ const i18ns = [
"error": {
"nameQrCodeBothNull": "账号名和二维码不能同时为空",
"refundGapDaysNotNegative": "允许退款天数不能为负数或空",
"refundCompensateIllegal": "退款补偿百分比必须在0到100之间"
"refundCompensateIllegal": "退款补偿百分比必须在0到100之间",
"withdrawTransferLossRatioNotNegative": "提现转账费率必须在0到100之间"
}
}
},

View File

@ -7,10 +7,10 @@ const paths = [
recursive: false,
},
{
id: 'user-acc-pay',
id: 'user-dep-acc-pay',
sourceEntity: 'user',
destEntity: 'pay',
value: 'account.user',
value: 'deposit.account.user',
recursive: false,
},
{

View File

@ -2,7 +2,7 @@ import { String, Price } from 'oak-domain/lib/types/DataType';
import { EntityShape } from 'oak-domain/lib/types/Entity';
import { EntityDesc } from 'oak-domain/lib/types';
import { Schema as Account } from './Account';
type Type = 'deposit' | 'withdraw' | 'consume' | 'loan' | 'repay' | 'withdrawBack' | 'earn' | 'encash' | 'cutoffRefundable' | 'tax' | 'taxRefund' | 'refund' | 'refundFailure';
type Type = 'deposit' | 'withdraw' | 'consume' | 'consumeBack' | 'loan' | 'repay' | 'withdrawBack' | 'earn' | 'encash' | 'cutoffRefundable' | 'tax' | 'taxRefund' | 'refund' | 'refundFailure';
export interface Schema extends EntityShape {
account: Account;
type: Type;

View File

@ -20,9 +20,10 @@ export const entityDesc = {
deposit: '充值',
withdraw: '提现',
consume: '消费',
consumeBack: '消费退还',
loan: '抵押',
repay: '偿还',
withdrawBack: '提现未遂',
withdrawBack: '提现退还',
earn: '赚取',
encash: '兑现',
tax: '渠道费',
@ -41,6 +42,7 @@ export const entityDesc = {
withdraw: '#F7DC6F',
withdrawBack: '#F7DC6F',
consume: '#A569BD',
consumeBack: '#009933',
loan: '#CD6155',
repay: '#82E0AA',
earn: '#FF3333',

View File

@ -19,7 +19,7 @@ export interface Schema extends AbstractAccount {
channels: WithdrawChannel[];
enabled: Boolean;
}
export type Action = 'pay' | 'refund' | 'deposit' | 'withdraw' | 'tax';
export type Action = 'pay' | 'refund' | 'withdrawTransfer' | 'compensate' | 'moveIn' | 'moveOut' | 'deposit' | 'tax';
export declare const entityDesc: EntityDesc<Schema, Action, '', {
type: Schema['type'];
}>;

View File

@ -34,8 +34,11 @@ export const entityDesc = {
action: {
pay: '支付',
refund: '退款',
withdrawTransfer: '提现转账',
compensate: '补偿',
moveIn: '转入',
moveOut: '转出',
deposit: '充值',
withdraw: '提现',
tax: '渠道费',
}
},
@ -53,8 +56,11 @@ export const entityDesc = {
icon: {
pay: '',
refund: '',
withdrawTransfer: '',
compensate: '',
moveIn: '',
moveOut: '',
deposit: '',
withdraw: '',
tax: '',
}
},

13
es/entities/SysAccountMove.d.ts vendored Normal file
View File

@ -0,0 +1,13 @@
import { String, Text, Price } from 'oak-domain/lib/types/DataType';
import { EntityShape } from 'oak-domain/lib/types/Entity';
import { EntityDesc } from 'oak-domain/lib/types';
import { Schema as User } from './User';
import { Schema as System } from './System';
export interface Schema extends EntityShape {
price: Price;
externalId: String<64>;
operator: User;
remark?: Text;
system: System;
}
export declare const entityDesc: EntityDesc<Schema>;

View File

@ -0,0 +1,18 @@
;
export const entityDesc = {
locales: {
zh_CN: {
name: '系统资金移动',
attr: {
price: '金额',
externalId: '外部流水号',
operator: '操作者',
remark: '备注',
system: '所属系统'
},
},
},
configuration: {
actionType: 'appendOnly',
}
};

View File

@ -4,14 +4,17 @@ import { EntityDesc } from 'oak-domain/lib/types';
import { Schema as Pay } from './Pay';
import { Schema as Refund } from './Refund';
import { Schema as WithdrawTransfer } from './WithdrawTransfer';
import { Schema as SysAccountMove } from './SysAccountMove';
import { SysAccountOperType } from '../types/sysAccountOper';
export interface Schema extends EntityShape {
delta: Price;
type: 'pay' | 'refund' | 'withdrawTransfer' | 'compensate' | 'moveIn' | 'moveOut';
type: SysAccountOperType;
entity: String<32>;
entityId: String<64>;
pay?: Pay;
refund?: Refund;
withdrawTransfer?: WithdrawTransfer;
sysAccountMove?: SysAccountMove;
}
export declare const entityDesc: EntityDesc<Schema, '', '', {
type: Schema['type'];

View File

@ -11,6 +11,7 @@ export const entityDesc = {
pay: '关联支付',
refund: '关联退款',
withdrawTransfer: '关联转账提现',
sysAccountMove: '系统资金移动',
},
v: {
type: {

View File

@ -17,5 +17,5 @@ export interface Schema extends AbstractAccount {
channels: WithdrawChannel[];
enabled: Boolean;
}
export type Action = 'pay' | 'refund' | 'deposit' | 'withdraw' | 'tax';
export type Action = 'pay' | 'refund' | 'withdrawTransfer' | 'compensate' | 'moveIn' | 'moveOut' | 'deposit' | 'tax';
export declare const entityDesc: EntityDesc<Schema, Action>;

View File

@ -23,8 +23,11 @@ export const entityDesc = {
action: {
pay: '支付',
refund: '退款',
withdrawTransfer: '提现转账',
compensate: '补偿',
moveIn: '转入',
moveOut: '转出',
deposit: '充值',
withdraw: '提现',
tax: '渠道费',
}
},
@ -33,8 +36,11 @@ export const entityDesc = {
icon: {
pay: '',
refund: '',
withdrawTransfer: '',
compensate: '',
moveIn: '',
moveOut: '',
deposit: '',
withdraw: '',
tax: '',
}
}

View File

@ -16,5 +16,10 @@
"order": {
"payAmountNotEnough": "支付的额度总和不足",
"nonePay": "没有传入支付信息"
},
"refund": {
"create": {
"hasAnotherRefunding": "您有一笔退款正在进行中"
}
}
}

View File

@ -22,6 +22,7 @@
"error": {
"nameQrCodeBothNull": "账号名和二维码不能同时为空",
"refundGapDaysNotNegative": "允许退款天数不能为负数或空",
"refundCompensateIllegal": "退款补偿百分比必须在0到100之间"
"refundCompensateIllegal": "退款补偿百分比必须在0到100之间",
"withdrawTransferLossRatioNotNegative": "提现转账费率必须在0到100之间"
}
}

View File

@ -11,7 +11,7 @@ import * as Pay from "../Pay/Schema";
import * as Refund from "../Refund/Schema";
import * as Withdraw from "../Withdraw/Schema";
import * as WithdrawTransfer from "../WithdrawTransfer/Schema";
type Type = "deposit" | "withdraw" | "consume" | "loan" | "repay" | "withdrawBack" | "earn" | "encash" | "cutoffRefundable" | "tax" | "taxRefund" | "refund" | "refundFailure";
type Type = "deposit" | "withdraw" | "consume" | "consumeBack" | "loan" | "repay" | "withdrawBack" | "earn" | "encash" | "cutoffRefundable" | "tax" | "taxRefund" | "refund" | "refundFailure";
export type OpSchema = EntityShape & {
accountId: ForeignKey<"account">;
type: Type;

View File

@ -9,7 +9,7 @@ export const desc = {
type: {
notNull: true,
type: "enum",
enumeration: ["deposit", "withdraw", "consume", "loan", "repay", "withdrawBack", "earn", "encash", "cutoffRefundable", "tax", "taxRefund", "refund", "refundFailure"]
enumeration: ["deposit", "withdraw", "consume", "consumeBack", "loan", "repay", "withdrawBack", "earn", "encash", "cutoffRefundable", "tax", "taxRefund", "refund", "refundFailure"]
},
totalPlus: {
notNull: true,

View File

@ -5,6 +5,7 @@ export const style = {
withdraw: '#F7DC6F',
withdrawBack: '#F7DC6F',
consume: '#A569BD',
consumeBack: '#009933',
loan: '#CD6155',
repay: '#82E0AA',
earn: '#FF3333',

View File

@ -1 +1 @@
{ "name": "帐号操作", "attr": { "account": "帐号", "type": "类型", "totalPlus": "余额变化", "availPlus": "可用余额变化", "refundablePlus": "可退款余额变化", "total": "操作后余额", "avail": "操作后可用余额", "refundable": "操作后可退款余额", "entity": "关联对象", "entityId": "关联对象Id" }, "v": { "type": { "deposit": "充值", "withdraw": "提现", "consume": "消费", "loan": "抵押", "repay": "偿还", "withdrawBack": "提现未遂", "earn": "赚取", "encash": "兑现", "tax": "渠道费", "taxRefund": "渠道费用退还", "cutoffRefundable": "削减可自由退额度", "refund": "退款", "refundFailure": "退款失败" } } }
{ "name": "帐号操作", "attr": { "account": "帐号", "type": "类型", "totalPlus": "余额变化", "availPlus": "可用余额变化", "refundablePlus": "可退款余额变化", "total": "操作后余额", "avail": "操作后可用余额", "refundable": "操作后可退款余额", "entity": "关联对象", "entityId": "关联对象Id" }, "v": { "type": { "deposit": "充值", "withdraw": "提现", "consume": "消费", "consumeBack": "消费退还", "loan": "抵押", "repay": "偿还", "withdrawBack": "提现退还", "earn": "赚取", "encash": "兑现", "tax": "渠道费", "taxRefund": "渠道费用退还", "cutoffRefundable": "削减可自由退额度", "refund": "退款", "refundFailure": "退款失败" } } }

View File

@ -60,6 +60,7 @@ import { EntityDef as OfflineAccount } from "./OfflineAccount/Schema";
import { EntityDef as Order } from "./Order/Schema";
import { EntityDef as Pay } from "./Pay/Schema";
import { EntityDef as Refund } from "./Refund/Schema";
import { EntityDef as SysAccountMove } from "./SysAccountMove/Schema";
import { EntityDef as SysAccountOper } from "./SysAccountOper/Schema";
import { EntityDef as WechatPay } from "./WechatPay/Schema";
import { EntityDef as Withdraw } from "./Withdraw/Schema";
@ -131,6 +132,7 @@ export type EntityDict = {
order: Order;
pay: Pay;
refund: Refund;
sysAccountMove: SysAccountMove;
sysAccountOper: SysAccountOper;
wechatPay: WechatPay;
withdraw: Withdraw;

View File

@ -1,5 +1,5 @@
import { GenericAction } from "oak-domain/lib/actions/action";
export type ParticularAction = 'pay' | 'refund' | 'deposit' | 'withdraw' | 'tax';
export type ParticularAction = 'pay' | 'refund' | 'withdrawTransfer' | 'compensate' | 'moveIn' | 'moveOut' | 'deposit' | 'tax';
export declare const actions: string[];
export type Action = GenericAction | ParticularAction | string;
export declare const actionDefDict: {};

View File

@ -1,2 +1,2 @@
export const actions = ["count", "stat", "download", "select", "aggregate", "create", "remove", "update", "pay", "refund", "deposit", "withdraw", "tax"];
export const actions = ["count", "stat", "download", "select", "aggregate", "create", "remove", "update", "pay", "refund", "withdrawTransfer", "compensate", "moveIn", "moveOut", "deposit", "tax"];
export const actionDefDict = {};

View File

@ -11,8 +11,11 @@ export const style = {
icon: {
pay: '',
refund: '',
withdrawTransfer: '',
compensate: '',
moveIn: '',
moveOut: '',
deposit: '',
withdraw: '',
tax: '',
}
};

View File

@ -1 +1 @@
{ "name": "线下账户", "attr": { "type": "类型", "channel": "通道", "name": "用户/帐号", "qrCode": "收款二维码", "taxLossRatio": "商户号手续费(百分比)", "refundCompensateRatio": "退款补偿百分比", "refundGapDays": "(支付后)允许退款的天数", "allowWithdrawTransfer": "允许提现转账", "withdrawTransferLossRatio": "提现转账费率(百分数)", "allowDeposit": "允许主动充值", "allowPay": "允许主动支付", "system": "所属系统", "price": "余额", "pays": "支付", "opers": "操作记录", "channels": "提现通道", "enabled": "是否启用" }, "v": { "type": { "bank": "银行", "alipay": "支付宝", "wechat": "微信", "shouqianba": "收钱吧", "others": "其它" } }, "action": { "pay": "支付", "refund": "退款", "deposit": "充值", "withdraw": "提现", "tax": "渠道费" } }
{ "name": "线下账户", "attr": { "type": "类型", "channel": "通道", "name": "用户/帐号", "qrCode": "收款二维码", "taxLossRatio": "商户号手续费(百分比)", "refundCompensateRatio": "退款补偿百分比", "refundGapDays": "(支付后)允许退款的天数", "allowWithdrawTransfer": "允许提现转账", "withdrawTransferLossRatio": "提现转账费率(百分数)", "allowDeposit": "允许主动充值", "allowPay": "允许主动支付", "system": "所属系统", "price": "余额", "pays": "支付", "opers": "操作记录", "channels": "提现通道", "enabled": "是否启用" }, "v": { "type": { "bank": "银行", "alipay": "支付宝", "wechat": "微信", "shouqianba": "收钱吧", "others": "其它" } }, "action": { "pay": "支付", "refund": "退款", "withdrawTransfer": "提现转账", "compensate": "补偿", "moveIn": "转入", "moveOut": "转出", "deposit": "充值", "tax": "渠道费" } }

View File

@ -10,6 +10,7 @@ export type OpSchema = EntityShape & {
value: String<256>;
recursive: Boolean;
sourceEntity: String<32>;
desc?: String<256> | null;
};
export type OpAttr = keyof OpSchema;
export type Schema = EntityShape & {
@ -17,6 +18,7 @@ export type Schema = EntityShape & {
value: String<256>;
recursive: Boolean;
sourceEntity: String<32>;
desc?: String<256> | null;
actionAuth$path?: Array<ActionAuth.Schema>;
actionAuth$path$$aggr?: AggregationResult<ActionAuth.Schema>;
relationAuth$path?: Array<RelationAuth.Schema>;
@ -33,6 +35,7 @@ type AttrFilter = {
value: Q_StringValue;
recursive: Q_BooleanValue;
sourceEntity: Q_StringValue;
desc: Q_StringValue;
actionAuth$path: ActionAuth.Filter & SubQueryPredicateMetadata;
relationAuth$path: RelationAuth.Filter & SubQueryPredicateMetadata;
};
@ -48,6 +51,7 @@ export type Projection = {
value?: number;
recursive?: number;
sourceEntity?: number;
desc?: number;
actionAuth$path?: ActionAuth.Selection & {
$entity: "actionAuth";
};
@ -80,6 +84,8 @@ export type SortAttr = {
recursive: number;
} | {
sourceEntity: number;
} | {
desc: number;
} | {
[k: string]: any;
} | OneOf<ExprOp<OpAttr | string>>;

View File

@ -25,6 +25,12 @@ export const desc = {
params: {
length: 32
}
},
desc: {
type: "varchar",
params: {
length: 256
}
}
},
static: true,

View File

@ -1 +1 @@
{ "name": "关系路径", "attr": { "sourceEntity": "源对象", "value": "路径从dest到source", "destEntity": "目标对象", "recursive": "是否递归(目标对象)" } }
{ "name": "关系路径", "attr": { "sourceEntity": "源对象", "value": "路径", "destEntity": "目标对象", "recursive": "是否递归", "desc": "描述" } }

View File

@ -60,6 +60,7 @@ import { desc as offlineAccountDesc } from "./OfflineAccount/Storage";
import { desc as orderDesc } from "./Order/Storage";
import { desc as payDesc } from "./Pay/Storage";
import { desc as refundDesc } from "./Refund/Storage";
import { desc as sysAccountMoveDesc } from "./SysAccountMove/Storage";
import { desc as sysAccountOperDesc } from "./SysAccountOper/Storage";
import { desc as wechatPayDesc } from "./WechatPay/Storage";
import { desc as withdrawDesc } from "./Withdraw/Storage";
@ -131,6 +132,7 @@ export const storageSchema = {
order: orderDesc,
pay: payDesc,
refund: refundDesc,
sysAccountMove: sysAccountMoveDesc,
sysAccountOper: sysAccountOperDesc,
wechatPay: wechatPayDesc,
withdraw: withdrawDesc,

View File

@ -0,0 +1,185 @@
import { ForeignKey } from "oak-domain/lib/types/DataType";
import { Q_DateValue, Q_NumberValue, Q_StringValue, NodeId, MakeFilter, ExprOp, ExpressionKey, SubQueryPredicateMetadata } from "oak-domain/lib/types/Demand";
import { OneOf } from "oak-domain/lib/types/Polyfill";
import { FormCreateData, FormUpdateData, DeduceAggregation, Operation as OakOperation, Selection as OakSelection, MakeAction as OakMakeAction, AggregationResult, EntityShape } from "oak-domain/lib/types/Entity";
import { AppendOnlyAction } from "oak-domain/lib/actions/action";
import { Price, String, Text } from "oak-domain/lib/types/DataType";
import * as User from "../User/Schema";
import * as System from "../System/Schema";
import * as SysAccountOper from "../SysAccountOper/Schema";
export type OpSchema = EntityShape & {
price: Price;
externalId: String<64>;
operatorId: ForeignKey<"user">;
remark?: Text | null;
systemId: ForeignKey<"system">;
};
export type OpAttr = keyof OpSchema;
export type Schema = EntityShape & {
price: Price;
externalId: String<64>;
operatorId: ForeignKey<"user">;
remark?: Text | null;
systemId: ForeignKey<"system">;
operator: User.Schema;
system: System.Schema;
sysAccountOper$sysAccountMove?: Array<SysAccountOper.Schema>;
sysAccountOper$sysAccountMove$$aggr?: AggregationResult<SysAccountOper.Schema>;
} & {
[A in ExpressionKey]?: any;
};
type AttrFilter = {
id: Q_StringValue;
$$createAt$$: Q_DateValue;
$$seq$$: Q_NumberValue;
$$updateAt$$: Q_DateValue;
price: Q_NumberValue;
externalId: Q_StringValue;
operatorId: Q_StringValue;
operator: User.Filter;
remark: Q_StringValue;
systemId: Q_StringValue;
system: System.Filter;
sysAccountOper$sysAccountMove: SysAccountOper.Filter & SubQueryPredicateMetadata;
};
export type Filter = MakeFilter<AttrFilter & ExprOp<OpAttr | string>>;
export type Projection = {
"#id"?: NodeId;
[k: string]: any;
id?: number;
$$createAt$$?: number;
$$updateAt$$?: number;
$$seq$$?: number;
price?: number;
externalId?: number;
operatorId?: number;
operator?: User.Projection;
remark?: number;
systemId?: number;
system?: System.Projection;
sysAccountOper$sysAccountMove?: SysAccountOper.Selection & {
$entity: "sysAccountOper";
};
sysAccountOper$sysAccountMove$$aggr?: SysAccountOper.Aggregation & {
$entity: "sysAccountOper";
};
} & Partial<ExprOp<OpAttr | string>>;
type SysAccountMoveIdProjection = OneOf<{
id: number;
}>;
type UserIdProjection = OneOf<{
operatorId: number;
}>;
type SystemIdProjection = OneOf<{
systemId: number;
}>;
export type SortAttr = {
id: number;
} | {
$$createAt$$: number;
} | {
$$seq$$: number;
} | {
$$updateAt$$: number;
} | {
price: number;
} | {
externalId: number;
} | {
operatorId: number;
} | {
operator: User.SortAttr;
} | {
remark: number;
} | {
systemId: number;
} | {
system: System.SortAttr;
} | {
[k: string]: any;
} | OneOf<ExprOp<OpAttr | string>>;
export type SortNode = {
$attr: SortAttr;
$direction?: "asc" | "desc";
};
export type Sorter = SortNode[];
export type SelectOperation<P extends Object = Projection> = OakSelection<"select", P, Filter, Sorter>;
export type Selection<P extends Object = Projection> = SelectOperation<P>;
export type Aggregation = DeduceAggregation<Projection, Filter, Sorter>;
export type CreateOperationData = FormCreateData<Omit<OpSchema, "operatorId" | "systemId">> & (({
operatorId?: never;
operator: User.CreateSingleOperation;
} | {
operatorId: ForeignKey<"operator">;
operator?: User.UpdateOperation;
} | {
operator?: never;
operatorId: ForeignKey<"operator">;
}) & ({
systemId?: never;
system: System.CreateSingleOperation;
} | {
systemId: ForeignKey<"system">;
system?: System.UpdateOperation;
} | {
system?: never;
systemId: ForeignKey<"system">;
})) & {
sysAccountOper$sysAccountMove?: OakOperation<"create", Omit<SysAccountOper.CreateOperationData, "sysAccountMove" | "sysAccountMoveId">[]> | Array<OakOperation<"create", Omit<SysAccountOper.CreateOperationData, "sysAccountMove" | "sysAccountMoveId">>>;
};
export type CreateSingleOperation = OakOperation<"create", CreateOperationData>;
export type CreateMultipleOperation = OakOperation<"create", Array<CreateOperationData>>;
export type CreateOperation = CreateSingleOperation | CreateMultipleOperation;
export type UpdateOperationData = FormUpdateData<Omit<OpSchema, "operatorId" | "systemId">> & (({
operator?: User.CreateSingleOperation;
operatorId?: never;
} | {
operator?: User.UpdateOperation;
operatorId?: never;
} | {
operator?: User.RemoveOperation;
operatorId?: never;
} | {
operator?: never;
operatorId?: ForeignKey<"operator">;
}) & ({
system?: System.CreateSingleOperation;
systemId?: never;
} | {
system?: System.UpdateOperation;
systemId?: never;
} | {
system?: System.RemoveOperation;
systemId?: never;
} | {
system?: never;
systemId?: ForeignKey<"system">;
})) & {
[k: string]: any;
sysAccountOper$sysAccountMove?: OakOperation<"create", Omit<SysAccountOper.CreateOperationData, "sysAccountMove" | "sysAccountMoveId">[]> | Array<OakOperation<"create", Omit<SysAccountOper.CreateOperationData, "sysAccountMove" | "sysAccountMoveId">>>;
};
export type UpdateOperation = OakOperation<"update" | string, UpdateOperationData, Filter, Sorter>;
export type RemoveOperationData = {} & (({
operator?: User.UpdateOperation | User.RemoveOperation;
}) & ({
system?: System.UpdateOperation | System.RemoveOperation;
}));
export type RemoveOperation = OakOperation<"remove", RemoveOperationData, Filter, Sorter>;
export type Operation = CreateOperation | UpdateOperation | RemoveOperation;
export type UserIdSubQuery = Selection<UserIdProjection>;
export type SystemIdSubQuery = Selection<SystemIdProjection>;
export type SysAccountMoveIdSubQuery = Selection<SysAccountMoveIdProjection>;
export type EntityDef = {
Schema: Schema;
OpSchema: OpSchema;
Action: OakMakeAction<AppendOnlyAction> | string;
Selection: Selection;
Aggregation: Aggregation;
Operation: Operation;
Create: CreateOperation;
Update: UpdateOperation;
Remove: RemoveOperation;
CreateSingle: CreateSingleOperation;
CreateMulti: CreateMultipleOperation;
};
export {};

View File

@ -0,0 +1 @@
export {};

View File

@ -0,0 +1,3 @@
import { StorageDesc } from "oak-domain/lib/types/Storage";
import { OpSchema } from "./Schema";
export declare const desc: StorageDesc<OpSchema>;

View File

@ -0,0 +1,31 @@
import { appendOnlyActions as actions } from "oak-domain/lib/actions/action";
export const desc = {
attributes: {
price: {
notNull: true,
type: "money"
},
externalId: {
notNull: true,
type: "varchar",
params: {
length: 64
}
},
operatorId: {
notNull: true,
type: "ref",
ref: "user"
},
remark: {
type: "text"
},
systemId: {
notNull: true,
type: "ref",
ref: "system"
}
},
actionType: "appendOnly",
actions
};

View File

@ -0,0 +1 @@
{ "name": "系统资金移动", "attr": { "price": "金额", "externalId": "外部流水号", "operator": "操作者", "remark": "备注", "system": "所属系统" } }

View File

@ -4,32 +4,37 @@ import { OneOf } from "oak-domain/lib/types/Polyfill";
import { FormCreateData, FormUpdateData, DeduceAggregation, Operation as OakOperation, Selection as OakSelection, MakeAction as OakMakeAction, EntityShape } from "oak-domain/lib/types/Entity";
import { AppendOnlyAction } from "oak-domain/lib/actions/action";
import { Price, String } from "oak-domain/lib/types/DataType";
import { SysAccountOperType } from "../../types/sysAccountOper";
import * as Pay from "../Pay/Schema";
import * as Refund from "../Refund/Schema";
import * as WithdrawTransfer from "../WithdrawTransfer/Schema";
import * as SysAccountMove from "../SysAccountMove/Schema";
import * as OfflineAccount from "../OfflineAccount/Schema";
import * as WpAccount from "../WpAccount/Schema";
export type OpSchema = EntityShape & {
delta: Price;
type: "pay" | "refund" | "withdrawTransfer" | "compensate" | "moveIn" | "moveOut";
type: SysAccountOperType;
entity: "offlineAccount" | "wpAccount" | string;
entityId: String<64>;
payId?: ForeignKey<"pay"> | null;
refundId?: ForeignKey<"refund"> | null;
withdrawTransferId?: ForeignKey<"withdrawTransfer"> | null;
sysAccountMoveId?: ForeignKey<"sysAccountMove"> | null;
};
export type OpAttr = keyof OpSchema;
export type Schema = EntityShape & {
delta: Price;
type: "pay" | "refund" | "withdrawTransfer" | "compensate" | "moveIn" | "moveOut";
type: SysAccountOperType;
entity: "offlineAccount" | "wpAccount" | string;
entityId: String<64>;
payId?: ForeignKey<"pay"> | null;
refundId?: ForeignKey<"refund"> | null;
withdrawTransferId?: ForeignKey<"withdrawTransfer"> | null;
sysAccountMoveId?: ForeignKey<"sysAccountMove"> | null;
pay?: Pay.Schema | null;
refund?: Refund.Schema | null;
withdrawTransfer?: WithdrawTransfer.Schema | null;
sysAccountMove?: SysAccountMove.Schema | null;
offlineAccount?: OfflineAccount.Schema;
wpAccount?: WpAccount.Schema;
} & {
@ -41,7 +46,7 @@ type AttrFilter = {
$$seq$$: Q_NumberValue;
$$updateAt$$: Q_DateValue;
delta: Q_NumberValue;
type: Q_EnumValue<"pay" | "refund" | "withdrawTransfer" | "compensate" | "moveIn" | "moveOut">;
type: Q_EnumValue<SysAccountOperType>;
entity: Q_EnumValue<"offlineAccount" | "wpAccount" | string>;
entityId: Q_StringValue;
payId: Q_StringValue;
@ -50,6 +55,8 @@ type AttrFilter = {
refund: Refund.Filter;
withdrawTransferId: Q_StringValue;
withdrawTransfer: WithdrawTransfer.Filter;
sysAccountMoveId: Q_StringValue;
sysAccountMove: SysAccountMove.Filter;
offlineAccount: OfflineAccount.Filter;
wpAccount: WpAccount.Filter;
};
@ -71,6 +78,8 @@ export type Projection = {
refund?: Refund.Projection;
withdrawTransferId?: number;
withdrawTransfer?: WithdrawTransfer.Projection;
sysAccountMoveId?: number;
sysAccountMove?: SysAccountMove.Projection;
offlineAccount?: OfflineAccount.Projection;
wpAccount?: WpAccount.Projection;
} & Partial<ExprOp<OpAttr | string>>;
@ -86,6 +95,9 @@ type RefundIdProjection = OneOf<{
type WithdrawTransferIdProjection = OneOf<{
withdrawTransferId: number;
}>;
type SysAccountMoveIdProjection = OneOf<{
sysAccountMoveId: number;
}>;
type OfflineAccountIdProjection = OneOf<{
entityId: number;
}>;
@ -120,6 +132,10 @@ export type SortAttr = {
withdrawTransferId: number;
} | {
withdrawTransfer: WithdrawTransfer.SortAttr;
} | {
sysAccountMoveId: number;
} | {
sysAccountMove: SysAccountMove.SortAttr;
} | {
offlineAccount: OfflineAccount.SortAttr;
} | {
@ -135,7 +151,7 @@ export type Sorter = SortNode[];
export type SelectOperation<P extends Object = Projection> = OakSelection<"select", P, Filter, Sorter>;
export type Selection<P extends Object = Projection> = SelectOperation<P>;
export type Aggregation = DeduceAggregation<Projection, Filter, Sorter>;
export type CreateOperationData = FormCreateData<Omit<OpSchema, "entity" | "entityId" | "payId" | "refundId" | "withdrawTransferId">> & (({
export type CreateOperationData = FormCreateData<Omit<OpSchema, "entity" | "entityId" | "payId" | "refundId" | "withdrawTransferId" | "sysAccountMoveId">> & (({
payId?: never;
pay?: Pay.CreateSingleOperation;
} | {
@ -162,6 +178,12 @@ export type CreateOperationData = FormCreateData<Omit<OpSchema, "entity" | "enti
} | {
withdrawTransfer?: never;
withdrawTransferId?: ForeignKey<"withdrawTransfer">;
}) & ({
sysAccountMoveId?: never;
sysAccountMove?: SysAccountMove.CreateSingleOperation;
} | {
sysAccountMove?: never;
sysAccountMoveId?: ForeignKey<"sysAccountMove">;
})) & ({
entity?: never;
entityId?: never;
@ -194,7 +216,7 @@ export type CreateOperationData = FormCreateData<Omit<OpSchema, "entity" | "enti
export type CreateSingleOperation = OakOperation<"create", CreateOperationData>;
export type CreateMultipleOperation = OakOperation<"create", Array<CreateOperationData>>;
export type CreateOperation = CreateSingleOperation | CreateMultipleOperation;
export type UpdateOperationData = FormUpdateData<Omit<OpSchema, "entity" | "entityId" | "payId" | "refundId" | "withdrawTransferId">> & (({
export type UpdateOperationData = FormUpdateData<Omit<OpSchema, "entity" | "entityId" | "payId" | "refundId" | "withdrawTransferId" | "sysAccountMoveId">> & (({
pay?: Pay.CreateSingleOperation;
payId?: never;
} | {
@ -230,6 +252,12 @@ export type UpdateOperationData = FormUpdateData<Omit<OpSchema, "entity" | "enti
} | {
withdrawTransfer?: never;
withdrawTransferId?: ForeignKey<"withdrawTransfer"> | null;
}) & ({
sysAccountMove?: SysAccountMove.CreateSingleOperation;
sysAccountMoveId?: never;
} | {
sysAccountMove?: never;
sysAccountMoveId?: ForeignKey<"sysAccountMove"> | null;
})) & ({
offlineAccount?: OfflineAccount.CreateSingleOperation | OfflineAccount.UpdateOperation | OfflineAccount.RemoveOperation;
entityId?: never;
@ -265,6 +293,7 @@ export type Operation = CreateOperation | UpdateOperation | RemoveOperation;
export type PayIdSubQuery = Selection<PayIdProjection>;
export type RefundIdSubQuery = Selection<RefundIdProjection>;
export type WithdrawTransferIdSubQuery = Selection<WithdrawTransferIdProjection>;
export type SysAccountMoveIdSubQuery = Selection<SysAccountMoveIdProjection>;
export type OfflineAccountIdSubQuery = Selection<OfflineAccountIdProjection>;
export type WpAccountIdSubQuery = Selection<WpAccountIdProjection>;
export type SysAccountOperIdSubQuery = Selection<SysAccountOperIdProjection>;

View File

@ -36,6 +36,10 @@ export const desc = {
withdrawTransferId: {
type: "ref",
ref: "withdrawTransfer"
},
sysAccountMoveId: {
type: "ref",
ref: "sysAccountMove"
}
},
actionType: "appendOnly",

View File

@ -1 +1 @@
{ "name": "系统账户操作", "attr": { "type": "类型", "delta": "余额变化", "entity": "关联对象", "entityId": "关联对象Id", "pay": "关联支付", "refund": "关联退款", "withdrawTransfer": "关联转账提现" }, "v": { "type": { "withdrawTransfer": "提现转账", "pay": "支付", "refund": "退款", "compensate": "补偿", "moveIn": "转入", "moveOut": "转出" } } }
{ "name": "系统账户操作", "attr": { "type": "类型", "delta": "余额变化", "entity": "关联对象", "entityId": "关联对象Id", "pay": "关联支付", "refund": "关联退款", "withdrawTransfer": "关联转账提现", "sysAccountMove": "系统资金移动" }, "v": { "type": { "withdrawTransfer": "提现转账", "pay": "支付", "refund": "退款", "compensate": "补偿", "moveIn": "转入", "moveOut": "转出" } } }

View File

@ -15,6 +15,7 @@ import * as UserSystem from "../UserSystem/Schema";
import * as Account from "../Account/Schema";
import * as OfflineAccount from "../OfflineAccount/Schema";
import * as Order from "../Order/Schema";
import * as SysAccountMove from "../SysAccountMove/Schema";
import * as WechatPay from "../WechatPay/Schema";
import * as WithdrawAccount from "../WithdrawAccount/Schema";
import * as WithdrawChannel from "../WithdrawChannel/Schema";
@ -76,6 +77,8 @@ export type Schema = EntityShape & {
offlineAccount$system$$aggr?: AggregationResult<OfflineAccount.Schema>;
order$system?: Array<Order.Schema>;
order$system$$aggr?: AggregationResult<Order.Schema>;
sysAccountMove$system?: Array<SysAccountMove.Schema>;
sysAccountMove$system$$aggr?: AggregationResult<SysAccountMove.Schema>;
wechatPay$system?: Array<WechatPay.Schema>;
wechatPay$system$$aggr?: AggregationResult<WechatPay.Schema>;
withdrawAccount$ofSystem?: Array<WithdrawAccount.Schema>;
@ -114,6 +117,7 @@ type AttrFilter = {
account$entity: Account.Filter & SubQueryPredicateMetadata;
offlineAccount$system: OfflineAccount.Filter & SubQueryPredicateMetadata;
order$system: Order.Filter & SubQueryPredicateMetadata;
sysAccountMove$system: SysAccountMove.Filter & SubQueryPredicateMetadata;
wechatPay$system: WechatPay.Filter & SubQueryPredicateMetadata;
withdrawAccount$ofSystem: WithdrawAccount.Filter & SubQueryPredicateMetadata;
withdrawAccount$entity: WithdrawAccount.Filter & SubQueryPredicateMetadata;
@ -193,6 +197,12 @@ export type Projection = {
order$system$$aggr?: Order.Aggregation & {
$entity: "order";
};
sysAccountMove$system?: SysAccountMove.Selection & {
$entity: "sysAccountMove";
};
sysAccountMove$system$$aggr?: SysAccountMove.Aggregation & {
$entity: "sysAccountMove";
};
wechatPay$system?: WechatPay.Selection & {
$entity: "wechatPay";
};
@ -294,6 +304,7 @@ export type CreateOperationData = FormCreateData<Omit<OpSchema, "entity" | "enti
account$entity?: OakOperation<Account.UpdateOperation["action"], Omit<Account.UpdateOperationData, "entity" | "entityId">, Omit<Account.Filter, "entity" | "entityId">> | OakOperation<"create", Omit<Account.CreateOperationData, "entity" | "entityId">[]> | Array<OakOperation<"create", Omit<Account.CreateOperationData, "entity" | "entityId">> | OakOperation<Account.UpdateOperation["action"], Omit<Account.UpdateOperationData, "entity" | "entityId">, Omit<Account.Filter, "entity" | "entityId">>>;
offlineAccount$system?: OakOperation<OfflineAccount.UpdateOperation["action"], Omit<OfflineAccount.UpdateOperationData, "system" | "systemId">, Omit<OfflineAccount.Filter, "system" | "systemId">> | OakOperation<"create", Omit<OfflineAccount.CreateOperationData, "system" | "systemId">[]> | Array<OakOperation<"create", Omit<OfflineAccount.CreateOperationData, "system" | "systemId">> | OakOperation<OfflineAccount.UpdateOperation["action"], Omit<OfflineAccount.UpdateOperationData, "system" | "systemId">, Omit<OfflineAccount.Filter, "system" | "systemId">>>;
order$system?: OakOperation<Order.UpdateOperation["action"], Omit<Order.UpdateOperationData, "system" | "systemId">, Omit<Order.Filter, "system" | "systemId">> | OakOperation<"create", Omit<Order.CreateOperationData, "system" | "systemId">[]> | Array<OakOperation<"create", Omit<Order.CreateOperationData, "system" | "systemId">> | OakOperation<Order.UpdateOperation["action"], Omit<Order.UpdateOperationData, "system" | "systemId">, Omit<Order.Filter, "system" | "systemId">>>;
sysAccountMove$system?: OakOperation<"create", Omit<SysAccountMove.CreateOperationData, "system" | "systemId">[]> | Array<OakOperation<"create", Omit<SysAccountMove.CreateOperationData, "system" | "systemId">>>;
wechatPay$system?: OakOperation<WechatPay.UpdateOperation["action"], Omit<WechatPay.UpdateOperationData, "system" | "systemId">, Omit<WechatPay.Filter, "system" | "systemId">> | OakOperation<"create", Omit<WechatPay.CreateOperationData, "system" | "systemId">[]> | Array<OakOperation<"create", Omit<WechatPay.CreateOperationData, "system" | "systemId">> | OakOperation<WechatPay.UpdateOperation["action"], Omit<WechatPay.UpdateOperationData, "system" | "systemId">, Omit<WechatPay.Filter, "system" | "systemId">>>;
withdrawAccount$ofSystem?: OakOperation<WithdrawAccount.UpdateOperation["action"], Omit<WithdrawAccount.UpdateOperationData, "ofSystem" | "ofSystemId">, Omit<WithdrawAccount.Filter, "ofSystem" | "ofSystemId">> | OakOperation<"create", Omit<WithdrawAccount.CreateOperationData, "ofSystem" | "ofSystemId">[]> | Array<OakOperation<"create", Omit<WithdrawAccount.CreateOperationData, "ofSystem" | "ofSystemId">> | OakOperation<WithdrawAccount.UpdateOperation["action"], Omit<WithdrawAccount.UpdateOperationData, "ofSystem" | "ofSystemId">, Omit<WithdrawAccount.Filter, "ofSystem" | "ofSystemId">>>;
withdrawAccount$entity?: OakOperation<WithdrawAccount.UpdateOperation["action"], Omit<WithdrawAccount.UpdateOperationData, "entity" | "entityId">, Omit<WithdrawAccount.Filter, "entity" | "entityId">> | OakOperation<"create", Omit<WithdrawAccount.CreateOperationData, "entity" | "entityId">[]> | Array<OakOperation<"create", Omit<WithdrawAccount.CreateOperationData, "entity" | "entityId">> | OakOperation<WithdrawAccount.UpdateOperation["action"], Omit<WithdrawAccount.UpdateOperationData, "entity" | "entityId">, Omit<WithdrawAccount.Filter, "entity" | "entityId">>>;
@ -326,6 +337,7 @@ export type UpdateOperationData = FormUpdateData<Omit<OpSchema, "platformId">> &
account$entity?: OakOperation<Account.UpdateOperation["action"], Omit<Account.UpdateOperationData, "entity" | "entityId">, Omit<Account.Filter, "entity" | "entityId">> | OakOperation<Account.RemoveOperation["action"], Omit<Account.RemoveOperationData, "entity" | "entityId">, Omit<Account.Filter, "entity" | "entityId">> | OakOperation<"create", Omit<Account.CreateOperationData, "entity" | "entityId">[]> | Array<OakOperation<"create", Omit<Account.CreateOperationData, "entity" | "entityId">> | OakOperation<Account.UpdateOperation["action"], Omit<Account.UpdateOperationData, "entity" | "entityId">, Omit<Account.Filter, "entity" | "entityId">> | OakOperation<Account.RemoveOperation["action"], Omit<Account.RemoveOperationData, "entity" | "entityId">, Omit<Account.Filter, "entity" | "entityId">>>;
offlineAccount$system?: OakOperation<OfflineAccount.UpdateOperation["action"], Omit<OfflineAccount.UpdateOperationData, "system" | "systemId">, Omit<OfflineAccount.Filter, "system" | "systemId">> | OakOperation<OfflineAccount.RemoveOperation["action"], Omit<OfflineAccount.RemoveOperationData, "system" | "systemId">, Omit<OfflineAccount.Filter, "system" | "systemId">> | OakOperation<"create", Omit<OfflineAccount.CreateOperationData, "system" | "systemId">[]> | Array<OakOperation<"create", Omit<OfflineAccount.CreateOperationData, "system" | "systemId">> | OakOperation<OfflineAccount.UpdateOperation["action"], Omit<OfflineAccount.UpdateOperationData, "system" | "systemId">, Omit<OfflineAccount.Filter, "system" | "systemId">> | OakOperation<OfflineAccount.RemoveOperation["action"], Omit<OfflineAccount.RemoveOperationData, "system" | "systemId">, Omit<OfflineAccount.Filter, "system" | "systemId">>>;
order$system?: OakOperation<Order.UpdateOperation["action"], Omit<Order.UpdateOperationData, "system" | "systemId">, Omit<Order.Filter, "system" | "systemId">> | OakOperation<Order.RemoveOperation["action"], Omit<Order.RemoveOperationData, "system" | "systemId">, Omit<Order.Filter, "system" | "systemId">> | OakOperation<"create", Omit<Order.CreateOperationData, "system" | "systemId">[]> | Array<OakOperation<"create", Omit<Order.CreateOperationData, "system" | "systemId">> | OakOperation<Order.UpdateOperation["action"], Omit<Order.UpdateOperationData, "system" | "systemId">, Omit<Order.Filter, "system" | "systemId">> | OakOperation<Order.RemoveOperation["action"], Omit<Order.RemoveOperationData, "system" | "systemId">, Omit<Order.Filter, "system" | "systemId">>>;
sysAccountMove$system?: OakOperation<"create", Omit<SysAccountMove.CreateOperationData, "system" | "systemId">[]> | Array<OakOperation<"create", Omit<SysAccountMove.CreateOperationData, "system" | "systemId">>>;
wechatPay$system?: OakOperation<WechatPay.UpdateOperation["action"], Omit<WechatPay.UpdateOperationData, "system" | "systemId">, Omit<WechatPay.Filter, "system" | "systemId">> | OakOperation<WechatPay.RemoveOperation["action"], Omit<WechatPay.RemoveOperationData, "system" | "systemId">, Omit<WechatPay.Filter, "system" | "systemId">> | OakOperation<"create", Omit<WechatPay.CreateOperationData, "system" | "systemId">[]> | Array<OakOperation<"create", Omit<WechatPay.CreateOperationData, "system" | "systemId">> | OakOperation<WechatPay.UpdateOperation["action"], Omit<WechatPay.UpdateOperationData, "system" | "systemId">, Omit<WechatPay.Filter, "system" | "systemId">> | OakOperation<WechatPay.RemoveOperation["action"], Omit<WechatPay.RemoveOperationData, "system" | "systemId">, Omit<WechatPay.Filter, "system" | "systemId">>>;
withdrawAccount$ofSystem?: OakOperation<WithdrawAccount.UpdateOperation["action"], Omit<WithdrawAccount.UpdateOperationData, "ofSystem" | "ofSystemId">, Omit<WithdrawAccount.Filter, "ofSystem" | "ofSystemId">> | OakOperation<WithdrawAccount.RemoveOperation["action"], Omit<WithdrawAccount.RemoveOperationData, "ofSystem" | "ofSystemId">, Omit<WithdrawAccount.Filter, "ofSystem" | "ofSystemId">> | OakOperation<"create", Omit<WithdrawAccount.CreateOperationData, "ofSystem" | "ofSystemId">[]> | Array<OakOperation<"create", Omit<WithdrawAccount.CreateOperationData, "ofSystem" | "ofSystemId">> | OakOperation<WithdrawAccount.UpdateOperation["action"], Omit<WithdrawAccount.UpdateOperationData, "ofSystem" | "ofSystemId">, Omit<WithdrawAccount.Filter, "ofSystem" | "ofSystemId">> | OakOperation<WithdrawAccount.RemoveOperation["action"], Omit<WithdrawAccount.RemoveOperationData, "ofSystem" | "ofSystemId">, Omit<WithdrawAccount.Filter, "ofSystem" | "ofSystemId">>>;
withdrawAccount$entity?: OakOperation<WithdrawAccount.UpdateOperation["action"], Omit<WithdrawAccount.UpdateOperationData, "entity" | "entityId">, Omit<WithdrawAccount.Filter, "entity" | "entityId">> | OakOperation<WithdrawAccount.RemoveOperation["action"], Omit<WithdrawAccount.RemoveOperationData, "entity" | "entityId">, Omit<WithdrawAccount.Filter, "entity" | "entityId">> | OakOperation<"create", Omit<WithdrawAccount.CreateOperationData, "entity" | "entityId">[]> | Array<OakOperation<"create", Omit<WithdrawAccount.CreateOperationData, "entity" | "entityId">> | OakOperation<WithdrawAccount.UpdateOperation["action"], Omit<WithdrawAccount.UpdateOperationData, "entity" | "entityId">, Omit<WithdrawAccount.Filter, "entity" | "entityId">> | OakOperation<WithdrawAccount.RemoveOperation["action"], Omit<WithdrawAccount.RemoveOperationData, "entity" | "entityId">, Omit<WithdrawAccount.Filter, "entity" | "entityId">>>;

View File

@ -34,7 +34,8 @@ export const desc = {
: {
type: "object"
},
entity: {
entity // 如果为true则按照渠道taxLossRatio和refundCompensateRatio进行扣取(如果因为depositLossRatio已经大于taxLossRatio则全额退款)
: {
type: "varchar",
params: {
length: 32

View File

@ -26,6 +26,7 @@ import * as Deposit from "../Deposit/Schema";
import * as Order from "../Order/Schema";
import * as Pay from "../Pay/Schema";
import * as Refund from "../Refund/Schema";
import * as SysAccountMove from "../SysAccountMove/Schema";
import * as Withdraw from "../Withdraw/Schema";
import * as WithdrawTransfer from "../WithdrawTransfer/Schema";
import * as ModiEntity from "../ModiEntity/Schema";
@ -108,6 +109,8 @@ export type Schema = EntityShape & {
pay$creator$$aggr?: AggregationResult<Pay.Schema>;
refund$creator?: Array<Refund.Schema>;
refund$creator$$aggr?: AggregationResult<Refund.Schema>;
sysAccountMove$operator?: Array<SysAccountMove.Schema>;
sysAccountMove$operator$$aggr?: AggregationResult<SysAccountMove.Schema>;
withdraw$creator?: Array<Withdraw.Schema>;
withdraw$creator$$aggr?: AggregationResult<Withdraw.Schema>;
withdrawTransfer$operator?: Array<WithdrawTransfer.Schema>;
@ -171,6 +174,7 @@ type AttrFilter = {
order$creator: Order.Filter & SubQueryPredicateMetadata;
pay$creator: Pay.Filter & SubQueryPredicateMetadata;
refund$creator: Refund.Filter & SubQueryPredicateMetadata;
sysAccountMove$operator: SysAccountMove.Filter & SubQueryPredicateMetadata;
withdraw$creator: Withdraw.Filter & SubQueryPredicateMetadata;
withdrawTransfer$operator: WithdrawTransfer.Filter & SubQueryPredicateMetadata;
withdrawTransfer$creator: WithdrawTransfer.Filter & SubQueryPredicateMetadata;
@ -335,6 +339,12 @@ export type Projection = {
refund$creator$$aggr?: Refund.Aggregation & {
$entity: "refund";
};
sysAccountMove$operator?: SysAccountMove.Selection & {
$entity: "sysAccountMove";
};
sysAccountMove$operator$$aggr?: SysAccountMove.Aggregation & {
$entity: "sysAccountMove";
};
withdraw$creator?: Withdraw.Selection & {
$entity: "withdraw";
};
@ -477,6 +487,7 @@ export type CreateOperationData = FormCreateData<Omit<OpSchema, "refId">> & (({
order$creator?: OakOperation<Order.UpdateOperation["action"], Omit<Order.UpdateOperationData, "creator" | "creatorId">, Omit<Order.Filter, "creator" | "creatorId">> | OakOperation<"create", Omit<Order.CreateOperationData, "creator" | "creatorId">[]> | Array<OakOperation<"create", Omit<Order.CreateOperationData, "creator" | "creatorId">> | OakOperation<Order.UpdateOperation["action"], Omit<Order.UpdateOperationData, "creator" | "creatorId">, Omit<Order.Filter, "creator" | "creatorId">>>;
pay$creator?: OakOperation<Pay.UpdateOperation["action"], Omit<Pay.UpdateOperationData, "creator" | "creatorId">, Omit<Pay.Filter, "creator" | "creatorId">> | OakOperation<"create", Omit<Pay.CreateOperationData, "creator" | "creatorId">[]> | Array<OakOperation<"create", Omit<Pay.CreateOperationData, "creator" | "creatorId">> | OakOperation<Pay.UpdateOperation["action"], Omit<Pay.UpdateOperationData, "creator" | "creatorId">, Omit<Pay.Filter, "creator" | "creatorId">>>;
refund$creator?: OakOperation<Refund.UpdateOperation["action"], Omit<Refund.UpdateOperationData, "creator" | "creatorId">, Omit<Refund.Filter, "creator" | "creatorId">> | OakOperation<"create", Omit<Refund.CreateOperationData, "creator" | "creatorId">[]> | Array<OakOperation<"create", Omit<Refund.CreateOperationData, "creator" | "creatorId">> | OakOperation<Refund.UpdateOperation["action"], Omit<Refund.UpdateOperationData, "creator" | "creatorId">, Omit<Refund.Filter, "creator" | "creatorId">>>;
sysAccountMove$operator?: OakOperation<"create", Omit<SysAccountMove.CreateOperationData, "operator" | "operatorId">[]> | Array<OakOperation<"create", Omit<SysAccountMove.CreateOperationData, "operator" | "operatorId">>>;
withdraw$creator?: OakOperation<Withdraw.UpdateOperation["action"], Omit<Withdraw.UpdateOperationData, "creator" | "creatorId">, Omit<Withdraw.Filter, "creator" | "creatorId">> | OakOperation<"create", Omit<Withdraw.CreateOperationData, "creator" | "creatorId">[]> | Array<OakOperation<"create", Omit<Withdraw.CreateOperationData, "creator" | "creatorId">> | OakOperation<Withdraw.UpdateOperation["action"], Omit<Withdraw.UpdateOperationData, "creator" | "creatorId">, Omit<Withdraw.Filter, "creator" | "creatorId">>>;
withdrawTransfer$operator?: OakOperation<WithdrawTransfer.UpdateOperation["action"], Omit<WithdrawTransfer.UpdateOperationData, "operator" | "operatorId">, Omit<WithdrawTransfer.Filter, "operator" | "operatorId">> | OakOperation<"create", Omit<WithdrawTransfer.CreateOperationData, "operator" | "operatorId">[]> | Array<OakOperation<"create", Omit<WithdrawTransfer.CreateOperationData, "operator" | "operatorId">> | OakOperation<WithdrawTransfer.UpdateOperation["action"], Omit<WithdrawTransfer.UpdateOperationData, "operator" | "operatorId">, Omit<WithdrawTransfer.Filter, "operator" | "operatorId">>>;
withdrawTransfer$creator?: OakOperation<WithdrawTransfer.UpdateOperation["action"], Omit<WithdrawTransfer.UpdateOperationData, "creator" | "creatorId">, Omit<WithdrawTransfer.Filter, "creator" | "creatorId">> | OakOperation<"create", Omit<WithdrawTransfer.CreateOperationData, "creator" | "creatorId">[]> | Array<OakOperation<"create", Omit<WithdrawTransfer.CreateOperationData, "creator" | "creatorId">> | OakOperation<WithdrawTransfer.UpdateOperation["action"], Omit<WithdrawTransfer.UpdateOperationData, "creator" | "creatorId">, Omit<WithdrawTransfer.Filter, "creator" | "creatorId">>>;
@ -527,6 +538,7 @@ export type UpdateOperationData = FormUpdateData<Omit<OpSchema, "refId">> & (({
order$creator?: OakOperation<Order.UpdateOperation["action"], Omit<Order.UpdateOperationData, "creator" | "creatorId">, Omit<Order.Filter, "creator" | "creatorId">> | OakOperation<Order.RemoveOperation["action"], Omit<Order.RemoveOperationData, "creator" | "creatorId">, Omit<Order.Filter, "creator" | "creatorId">> | OakOperation<"create", Omit<Order.CreateOperationData, "creator" | "creatorId">[]> | Array<OakOperation<"create", Omit<Order.CreateOperationData, "creator" | "creatorId">> | OakOperation<Order.UpdateOperation["action"], Omit<Order.UpdateOperationData, "creator" | "creatorId">, Omit<Order.Filter, "creator" | "creatorId">> | OakOperation<Order.RemoveOperation["action"], Omit<Order.RemoveOperationData, "creator" | "creatorId">, Omit<Order.Filter, "creator" | "creatorId">>>;
pay$creator?: OakOperation<Pay.UpdateOperation["action"], Omit<Pay.UpdateOperationData, "creator" | "creatorId">, Omit<Pay.Filter, "creator" | "creatorId">> | OakOperation<Pay.RemoveOperation["action"], Omit<Pay.RemoveOperationData, "creator" | "creatorId">, Omit<Pay.Filter, "creator" | "creatorId">> | OakOperation<"create", Omit<Pay.CreateOperationData, "creator" | "creatorId">[]> | Array<OakOperation<"create", Omit<Pay.CreateOperationData, "creator" | "creatorId">> | OakOperation<Pay.UpdateOperation["action"], Omit<Pay.UpdateOperationData, "creator" | "creatorId">, Omit<Pay.Filter, "creator" | "creatorId">> | OakOperation<Pay.RemoveOperation["action"], Omit<Pay.RemoveOperationData, "creator" | "creatorId">, Omit<Pay.Filter, "creator" | "creatorId">>>;
refund$creator?: OakOperation<Refund.UpdateOperation["action"], Omit<Refund.UpdateOperationData, "creator" | "creatorId">, Omit<Refund.Filter, "creator" | "creatorId">> | OakOperation<Refund.RemoveOperation["action"], Omit<Refund.RemoveOperationData, "creator" | "creatorId">, Omit<Refund.Filter, "creator" | "creatorId">> | OakOperation<"create", Omit<Refund.CreateOperationData, "creator" | "creatorId">[]> | Array<OakOperation<"create", Omit<Refund.CreateOperationData, "creator" | "creatorId">> | OakOperation<Refund.UpdateOperation["action"], Omit<Refund.UpdateOperationData, "creator" | "creatorId">, Omit<Refund.Filter, "creator" | "creatorId">> | OakOperation<Refund.RemoveOperation["action"], Omit<Refund.RemoveOperationData, "creator" | "creatorId">, Omit<Refund.Filter, "creator" | "creatorId">>>;
sysAccountMove$operator?: OakOperation<"create", Omit<SysAccountMove.CreateOperationData, "operator" | "operatorId">[]> | Array<OakOperation<"create", Omit<SysAccountMove.CreateOperationData, "operator" | "operatorId">>>;
withdraw$creator?: OakOperation<Withdraw.UpdateOperation["action"], Omit<Withdraw.UpdateOperationData, "creator" | "creatorId">, Omit<Withdraw.Filter, "creator" | "creatorId">> | OakOperation<Withdraw.RemoveOperation["action"], Omit<Withdraw.RemoveOperationData, "creator" | "creatorId">, Omit<Withdraw.Filter, "creator" | "creatorId">> | OakOperation<"create", Omit<Withdraw.CreateOperationData, "creator" | "creatorId">[]> | Array<OakOperation<"create", Omit<Withdraw.CreateOperationData, "creator" | "creatorId">> | OakOperation<Withdraw.UpdateOperation["action"], Omit<Withdraw.UpdateOperationData, "creator" | "creatorId">, Omit<Withdraw.Filter, "creator" | "creatorId">> | OakOperation<Withdraw.RemoveOperation["action"], Omit<Withdraw.RemoveOperationData, "creator" | "creatorId">, Omit<Withdraw.Filter, "creator" | "creatorId">>>;
withdrawTransfer$operator?: OakOperation<WithdrawTransfer.UpdateOperation["action"], Omit<WithdrawTransfer.UpdateOperationData, "operator" | "operatorId">, Omit<WithdrawTransfer.Filter, "operator" | "operatorId">> | OakOperation<WithdrawTransfer.RemoveOperation["action"], Omit<WithdrawTransfer.RemoveOperationData, "operator" | "operatorId">, Omit<WithdrawTransfer.Filter, "operator" | "operatorId">> | OakOperation<"create", Omit<WithdrawTransfer.CreateOperationData, "operator" | "operatorId">[]> | Array<OakOperation<"create", Omit<WithdrawTransfer.CreateOperationData, "operator" | "operatorId">> | OakOperation<WithdrawTransfer.UpdateOperation["action"], Omit<WithdrawTransfer.UpdateOperationData, "operator" | "operatorId">, Omit<WithdrawTransfer.Filter, "operator" | "operatorId">> | OakOperation<WithdrawTransfer.RemoveOperation["action"], Omit<WithdrawTransfer.RemoveOperationData, "operator" | "operatorId">, Omit<WithdrawTransfer.Filter, "operator" | "operatorId">>>;
withdrawTransfer$creator?: OakOperation<WithdrawTransfer.UpdateOperation["action"], Omit<WithdrawTransfer.UpdateOperationData, "creator" | "creatorId">, Omit<WithdrawTransfer.Filter, "creator" | "creatorId">> | OakOperation<WithdrawTransfer.RemoveOperation["action"], Omit<WithdrawTransfer.RemoveOperationData, "creator" | "creatorId">, Omit<WithdrawTransfer.Filter, "creator" | "creatorId">> | OakOperation<"create", Omit<WithdrawTransfer.CreateOperationData, "creator" | "creatorId">[]> | Array<OakOperation<"create", Omit<WithdrawTransfer.CreateOperationData, "creator" | "creatorId">> | OakOperation<WithdrawTransfer.UpdateOperation["action"], Omit<WithdrawTransfer.UpdateOperationData, "creator" | "creatorId">, Omit<WithdrawTransfer.Filter, "creator" | "creatorId">> | OakOperation<WithdrawTransfer.RemoveOperation["action"], Omit<WithdrawTransfer.RemoveOperationData, "creator" | "creatorId">, Omit<WithdrawTransfer.Filter, "creator" | "creatorId">>>;

View File

@ -1,5 +1,5 @@
import { GenericAction } from "oak-domain/lib/actions/action";
export type ParticularAction = 'pay' | 'refund' | 'deposit' | 'withdraw' | 'tax';
export type ParticularAction = 'pay' | 'refund' | 'withdrawTransfer' | 'compensate' | 'moveIn' | 'moveOut' | 'deposit' | 'tax';
export declare const actions: string[];
export type Action = GenericAction | ParticularAction | string;
export declare const actionDefDict: {};

View File

@ -1,2 +1,2 @@
export const actions = ["count", "stat", "download", "select", "aggregate", "create", "remove", "update", "pay", "refund", "deposit", "withdraw", "tax"];
export const actions = ["count", "stat", "download", "select", "aggregate", "create", "remove", "update", "pay", "refund", "withdrawTransfer", "compensate", "moveIn", "moveOut", "deposit", "tax"];
export const actionDefDict = {};

View File

@ -2,8 +2,11 @@ export const style = {
icon: {
pay: '',
refund: '',
withdrawTransfer: '',
compensate: '',
moveIn: '',
moveOut: '',
deposit: '',
withdraw: '',
tax: '',
}
};

View File

@ -1 +1 @@
{ "name": "微信支付帐号", "attr": { "wechatPay": "微信支付", "taxLossRatio": "商户号手续费(百分比)", "refundCompensateRatio": "退款补偿百分比", "refundGapDays": "(支付后)允许退款的天数", "allowWithdrawTransfer": "允许提现转账", "withdrawTransferLossRatio": "提现转账费率(百分数)", "mchId": "商户号", "publicKeyFilePath": "公钥文件路径", "privateKeyFilePath": "私钥文件路径", "apiV3Key": "apiV3Key", "price": "余额", "system": "关联系统", "opers": "操作记录", "channels": "提现通道", "enabled": "是否启用" }, "action": { "pay": "支付", "refund": "退款", "deposit": "充值", "withdraw": "提现", "tax": "渠道费" } }
{ "name": "微信支付帐号", "attr": { "wechatPay": "微信支付", "taxLossRatio": "商户号手续费(百分比)", "refundCompensateRatio": "退款补偿百分比", "refundGapDays": "(支付后)允许退款的天数", "allowWithdrawTransfer": "允许提现转账", "withdrawTransferLossRatio": "提现转账费率(百分数)", "mchId": "商户号", "publicKeyFilePath": "公钥文件路径", "privateKeyFilePath": "私钥文件路径", "apiV3Key": "apiV3Key", "price": "余额", "system": "关联系统", "opers": "操作记录", "channels": "提现通道", "enabled": "是否启用" }, "action": { "pay": "支付", "refund": "退款", "withdrawTransfer": "提现转账", "compensate": "补偿", "moveIn": "转入", "moveOut": "转出", "deposit": "充值", "tax": "渠道费" } }

View File

@ -60,6 +60,7 @@ import * as OfflineAccount from "./OfflineAccount/Schema";
import * as Order from "./Order/Schema";
import * as Pay from "./Pay/Schema";
import * as Refund from "./Refund/Schema";
import * as SysAccountMove from "./SysAccountMove/Schema";
import * as SysAccountOper from "./SysAccountOper/Schema";
import * as WechatPay from "./WechatPay/Schema";
import * as Withdraw from "./Withdraw/Schema";
@ -172,6 +173,8 @@ export type UserIdSubQuery = {
entity: "pay";
}) | (Refund.UserIdSubQuery & {
entity: "refund";
}) | (SysAccountMove.UserIdSubQuery & {
entity: "sysAccountMove";
}) | (Withdraw.UserIdSubQuery & {
entity: "withdraw";
}) | (WithdrawTransfer.UserIdSubQuery & {
@ -448,6 +451,8 @@ export type SystemIdSubQuery = {
entity: "offlineAccount";
}) | (Order.SystemIdSubQuery & {
entity: "order";
}) | (SysAccountMove.SystemIdSubQuery & {
entity: "sysAccountMove";
}) | (WechatPay.SystemIdSubQuery & {
entity: "wechatPay";
}) | (WithdrawAccount.SystemIdSubQuery & {
@ -610,6 +615,13 @@ export type RefundIdSubQuery = {
entity: "refund";
}) | any;
};
export type SysAccountMoveIdSubQuery = {
[K in "$in" | "$nin"]?: (SysAccountOper.SysAccountMoveIdSubQuery & {
entity: "sysAccountOper";
}) | (SysAccountMove.SysAccountMoveIdSubQuery & {
entity: "sysAccountMove";
}) | any;
};
export type SysAccountOperIdSubQuery = {
[K in "$in" | "$nin"]?: (SysAccountOper.SysAccountOperIdSubQuery & {
entity: "sysAccountOper";

View File

@ -3,6 +3,7 @@ import assert from 'assert';
import { getPayClazz } from '../utils/payClazz';
import { fullPayProjection } from '../utils/pay';
import { DATA_SUBSCRIBER_KEYS } from '../config/constants';
import { getRelevantIds } from 'oak-domain/lib/store/filter';
async function changeOrderStateByPay(filter, context, option) {
const orders = await context.select('order', {
data: {
@ -144,6 +145,96 @@ async function changeOrderStateByPay(filter, context, option) {
throw err;
}
}
/**
* 当订单上其它的支付全部完成/失败时将对应的order上类型为account的pay处理掉
* 现在的逻辑是account类型的pay必须等所有其它的pay都完成了自己才能完成如果其它都失败了自己就也失败钱返回付款的account
* @param payId
* @param context
*/
async function tryCompleteAccountPay(payId, context) {
const [pay] = await context.select('pay', {
data: {
id: 1,
paid: 1,
price: 1,
iState: 1,
order: {
iState: 1,
price: 1,
pay$order: {
$entity: 'pay',
data: {
id: 1,
iState: 1,
price: 1,
entity: 1,
paid: 1,
},
filter: {
iState: {
$in: ['paid', 'paying'],
},
},
},
},
},
filter: {
id: payId,
}
}, {});
const { order } = pay;
if (order) {
const { price, iState, pay$order: pays } = order;
assert(iState === 'paying');
const successfulPayIds = [];
const accountPayIds = [];
let totalPaid = 0;
pays?.forEach((pay) => {
const { iState, entity, paid, price } = pay;
if (iState === 'paid') {
assert(paid === price);
totalPaid += paid;
}
else if (entity === 'account') {
totalPaid += paid;
accountPayIds.push(pay.id);
if (price === paid) {
successfulPayIds.push(pay.id);
}
}
});
if (totalPaid === price) {
for (const payId2 of successfulPayIds) {
await context.operate('pay', {
id: await generateNewIdAsync(),
action: 'succeedPaying',
data: {
successAt: Date.now(),
},
filter: {
id: payId2,
}
}, {});
}
return successfulPayIds.length;
}
else if (pay.iState === 'closed') {
// 本条支付关闭则其它的account pay也跟随关闭
for (const payId2 of accountPayIds) {
await context.operate('pay', {
id: await generateNewIdAsync(),
action: 'close',
data: {},
filter: {
id: payId2,
}
}, {});
}
return accountPayIds.length;
}
}
return 0;
}
const triggers = [
{
name: '当生成pay时自动开始支付流程',
@ -169,10 +260,11 @@ const triggers = [
{
name: '当pay的状态发生变化时修改相应的order的状态或者deposit的状态同时尝试向订阅者推送',
entity: 'pay',
action: ['startPaying', 'succeedPaying', 'continuePaying', 'startClosing', 'succeedClosing', 'startRefunding',
action: ['startPaying', 'succeedPaying', 'continuePaying', 'close', 'startRefunding',
'refundAll', 'refundPartially'],
when: 'after',
asRoot: true,
priority: 99,
fn: async ({ operation }, context, option) => {
const { data, filter, action, id } = operation;
assert(typeof filter.id === 'string');
@ -313,13 +405,14 @@ const triggers = [
},
},
{
name: '当pay完成支付时计算相应的account以及syste account中的余额变化使deposit完成',
name: '当pay完成支付时计算相应的account以及system account中的余额变化使deposit完成',
entity: 'pay',
action: 'succeedPaying',
when: 'after',
asRoot: true,
fn: async ({ operation }, context) => {
const { data, filter } = operation;
assert(typeof filter.id === 'string');
const projection = {
id: 1,
paid: 1,
@ -448,50 +541,6 @@ const triggers = [
return cnt;
},
},
{
name: '当account类型的pay的paid达到price改为支付成功',
entity: 'pay',
asRoot: true,
action: ['startPaying', 'continuePaying'],
check(operation) {
return (!!operation.data.paid) && operation.data.paid > 0;
},
filter: {
entity: 'account',
},
when: 'commit',
fn: async ({ ids }, context) => {
for (const id of ids) {
const [row] = await context.select('pay', {
data: {
id: 1,
orderId: 1,
entity: 1,
price: 1,
paid: 1,
},
filter: {
id,
}
}, { dontCollect: true });
assert(row && row.entity === 'account');
if (row.paid && row.paid === row.price) {
const closeFn = context.openRootMode();
await context.operate('pay', {
id: await generateNewIdAsync(),
action: 'succeedPaying',
data: {
successAt: Date.now(),
},
filter: {
id,
}
}, {});
closeFn();
}
}
}
},
{
name: '当pay完成支付时计算其refundable和forbidRefundAt',
entity: 'pay',
@ -519,5 +568,59 @@ const triggers = [
return 1;
},
},
{
entity: 'pay',
name: '当有pay支付成功时尝试将account类型的pay完成',
action: ['startPaying', 'continuePaying', 'succeedPaying'],
attributes: ['paid'],
when: 'after',
fn: async ({ operation }, context, option) => {
const { filter } = operation;
const ids = getRelevantIds(filter);
assert(ids.length === 1);
return tryCompleteAccountPay(ids[0], context);
}
},
{
entity: 'pay',
name: '当有pay关闭时如果是account类型的将金额还给account否则检查会否测试相关Account pay是否需要关闭',
action: 'close',
when: 'after',
fn: async ({ operation }, context, option) => {
const { filter } = operation;
const ids = getRelevantIds(filter);
assert(ids.length === 1);
const [pay] = await context.select('pay', {
data: {
id: 1,
price: 1,
paid: 1,
entity: 1,
entityId: 1,
},
filter: {
id: ids[0],
},
}, {});
if (pay.entity === 'account') {
await context.operate('accountOper', {
id: await generateNewIdAsync(),
action: 'create',
data: {
id: await generateNewIdAsync(),
accountId: pay.entityId,
entity: 'pay',
entityId: ids[0],
type: 'consumeBack',
totalPlus: pay.paid,
availPlus: pay.paid,
},
}, {});
}
else {
return tryCompleteAccountPay(ids[0], context);
}
}
},
];
export default triggers;

View File

@ -24,6 +24,9 @@ async function startRefunding(context, data) {
settled: 1,
}
},
filter: {
id: data.payId,
}
}, { dontCollect: true });
const { paid, refunded, deposit, order } = pay;
assert(paid - refunded >= data.price);

View File

@ -6,6 +6,6 @@ import { BRC } from '../types/RuntimeCxt';
* @param context
* @param refunds
*/
export declare function updateWithdrawState(context: BRC, id: string): Promise<1 | 0>;
export declare function updateWithdrawState(context: BRC, id: string): Promise<0 | 1>;
declare const triggers: Trigger<EntityDict, 'withdraw', BRC>[];
export default triggers;

View File

@ -8,5 +8,5 @@ import { FeatureDict as Ogb0FeatureDict, AspectDict as Ogb0AspectDict } from "oa
export type BRC = BackendRuntimeContext<EntityDict>;
export type FRC = FrontendRuntimeContext<EntityDict>;
export type RuntimeCxt = FRC | BRC;
export type AAD = AspectDict & Ogb0AspectDict<EntityDict>;
export type AAD = AspectDict<EntityDict> & Ogb0AspectDict<EntityDict>;
export type AFD = FeatureDict<EntityDict> & BasicFeatures<EntityDict> & Ogb0FeatureDict<EntityDict>;

1
es/types/sysAccountOper.d.ts vendored Normal file
View File

@ -0,0 +1 @@
export type SysAccountOperType = 'pay' | 'refund' | 'withdrawTransfer' | 'compensate' | 'moveIn' | 'moveOut';

View File

@ -0,0 +1 @@
export {};

View File

@ -14,7 +14,7 @@ export declare const mergedProjection: {
type?: number | undefined;
systemId?: number | undefined;
system?: import("../oak-app-domain/System/Schema").Projection | undefined;
config?: number | import("oak-domain/lib/types").JsonProjection<import("../oak-app-domain/Application/Schema").WechatMpConfig | import("../oak-app-domain/Application/Schema").WebConfig | import("../oak-app-domain/Application/Schema").WechatPublicConfig | import("../oak-app-domain/Application/Schema").NativeConfig> | undefined;
config?: number | import("oak-domain/lib/types").JsonProjection<import("../oak-app-domain/Application/Schema").WebConfig | import("../oak-app-domain/Application/Schema").WechatMpConfig | import("../oak-app-domain/Application/Schema").WechatPublicConfig | import("../oak-app-domain/Application/Schema").NativeConfig> | undefined;
style?: number | import("oak-domain/lib/types").JsonProjection<import("oak-general-business/lib/types/Style").Style> | undefined;
domainId?: number | undefined;
domain?: import("../oak-app-domain/Domain/Schema").Projection | undefined;

View File

@ -72,7 +72,8 @@ export default class Account {
getState(pay) {
throw new Error("account类型的pay不应该需要查询此状态");
}
close(pay) {
throw new Error("account类型的pay无法关闭");
async close(pay) {
// throw new Error("account类型的pay无法关闭");
return;
}
}

View File

@ -1,4 +1,4 @@
import WechatPay from './WechatPay';
import WechatPayDebug from './WechatPay.debug';
declare const _default: typeof WechatPayDebug | typeof WechatPay;
declare const _default: typeof WechatPay | typeof WechatPayDebug;
export default _default;

View File

@ -1,9 +1,9 @@
import { BRC } from '../types/RuntimeCxt';
import { BackendRuntimeContext } from '../context/BackendRuntimeContext';
import { EntityDict } from '../oak-app-domain';
export type AspectDict = {
export type AspectDict<ED extends EntityDict> = {
getWithdrawCreateData: (params: {
accountId: string;
price: number;
withdrawAccountId?: string;
}, context: BRC) => Promise<EntityDict['withdraw']['CreateSingle']['data']>;
}, context: BackendRuntimeContext<ED>) => Promise<EntityDict['withdraw']['CreateSingle']['data']>;
};

View File

@ -1,4 +1,5 @@
import { EntityDict } from '../oak-app-domain';
import { AspectDict } from './AspectDict';
declare const aspectDict: AspectDict;
declare const aspectDict: AspectDict<EntityDict>;
export default aspectDict;
export { AspectDict, };

View File

@ -12,8 +12,8 @@ export declare function getWithdrawCreateData(params: {
creatorId: string;
creator?: import("../oak-app-domain/User/Schema").UpdateOperation | undefined;
} & {
refund$withdraw?: import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/Refund/Schema").UpdateOperationData, "withdraw" | "withdrawId">, Omit<import("../oak-app-domain/Refund/Schema").Filter, "withdraw" | "withdrawId">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/Refund/Schema").CreateOperationData, "withdraw" | "withdrawId">[]> | (import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/Refund/Schema").UpdateOperationData, "withdraw" | "withdrawId">, Omit<import("../oak-app-domain/Refund/Schema").Filter, "withdraw" | "withdrawId">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/Refund/Schema").CreateOperationData, "withdraw" | "withdrawId">>)[] | undefined;
withdrawTransfer$withdraw?: import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").UpdateOperationData, "withdraw" | "withdrawId">, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").Filter, "withdraw" | "withdrawId">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/WithdrawTransfer/Schema").CreateOperationData, "withdraw" | "withdrawId">[]> | (import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").UpdateOperationData, "withdraw" | "withdrawId">, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").Filter, "withdraw" | "withdrawId">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/WithdrawTransfer/Schema").CreateOperationData, "withdraw" | "withdrawId">>)[] | undefined;
refund$withdraw?: import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/Refund/Schema").UpdateOperationData, "withdrawId" | "withdraw">, Omit<import("../oak-app-domain/Refund/Schema").Filter, "withdrawId" | "withdraw">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/Refund/Schema").CreateOperationData, "withdrawId" | "withdraw">[]> | (import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/Refund/Schema").UpdateOperationData, "withdrawId" | "withdraw">, Omit<import("../oak-app-domain/Refund/Schema").Filter, "withdrawId" | "withdraw">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/Refund/Schema").CreateOperationData, "withdrawId" | "withdraw">>)[] | undefined;
withdrawTransfer$withdraw?: import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").UpdateOperationData, "withdrawId" | "withdraw">, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").Filter, "withdrawId" | "withdraw">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/WithdrawTransfer/Schema").CreateOperationData, "withdrawId" | "withdraw">[]> | (import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").UpdateOperationData, "withdrawId" | "withdraw">, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").Filter, "withdrawId" | "withdraw">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/WithdrawTransfer/Schema").CreateOperationData, "withdrawId" | "withdraw">>)[] | undefined;
modiEntity$entity?: import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/ModiEntity/Schema").CreateOperationData, "entity" | "entityId">[]> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/ModiEntity/Schema").CreateOperationData, "entity" | "entityId">>[] | undefined;
operEntity$entity?: import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/OperEntity/Schema").CreateOperationData, "entity" | "entityId">[]> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/OperEntity/Schema").CreateOperationData, "entity" | "entityId">>[] | undefined;
accountOper$entity?: import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/AccountOper/Schema").CreateOperationData, "entity" | "entityId">[]> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/AccountOper/Schema").CreateOperationData, "entity" | "entityId">>[] | undefined;
@ -26,8 +26,8 @@ export declare function getWithdrawCreateData(params: {
creator?: undefined;
creatorId: string;
} & {
refund$withdraw?: import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/Refund/Schema").UpdateOperationData, "withdraw" | "withdrawId">, Omit<import("../oak-app-domain/Refund/Schema").Filter, "withdraw" | "withdrawId">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/Refund/Schema").CreateOperationData, "withdraw" | "withdrawId">[]> | (import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/Refund/Schema").UpdateOperationData, "withdraw" | "withdrawId">, Omit<import("../oak-app-domain/Refund/Schema").Filter, "withdraw" | "withdrawId">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/Refund/Schema").CreateOperationData, "withdraw" | "withdrawId">>)[] | undefined;
withdrawTransfer$withdraw?: import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").UpdateOperationData, "withdraw" | "withdrawId">, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").Filter, "withdraw" | "withdrawId">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/WithdrawTransfer/Schema").CreateOperationData, "withdraw" | "withdrawId">[]> | (import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").UpdateOperationData, "withdraw" | "withdrawId">, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").Filter, "withdraw" | "withdrawId">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/WithdrawTransfer/Schema").CreateOperationData, "withdraw" | "withdrawId">>)[] | undefined;
refund$withdraw?: import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/Refund/Schema").UpdateOperationData, "withdrawId" | "withdraw">, Omit<import("../oak-app-domain/Refund/Schema").Filter, "withdrawId" | "withdraw">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/Refund/Schema").CreateOperationData, "withdrawId" | "withdraw">[]> | (import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/Refund/Schema").UpdateOperationData, "withdrawId" | "withdraw">, Omit<import("../oak-app-domain/Refund/Schema").Filter, "withdrawId" | "withdraw">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/Refund/Schema").CreateOperationData, "withdrawId" | "withdraw">>)[] | undefined;
withdrawTransfer$withdraw?: import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").UpdateOperationData, "withdrawId" | "withdraw">, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").Filter, "withdrawId" | "withdraw">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/WithdrawTransfer/Schema").CreateOperationData, "withdrawId" | "withdraw">[]> | (import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").UpdateOperationData, "withdrawId" | "withdraw">, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").Filter, "withdrawId" | "withdraw">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/WithdrawTransfer/Schema").CreateOperationData, "withdrawId" | "withdraw">>)[] | undefined;
modiEntity$entity?: import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/ModiEntity/Schema").CreateOperationData, "entity" | "entityId">[]> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/ModiEntity/Schema").CreateOperationData, "entity" | "entityId">>[] | undefined;
operEntity$entity?: import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/OperEntity/Schema").CreateOperationData, "entity" | "entityId">[]> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/OperEntity/Schema").CreateOperationData, "entity" | "entityId">>[] | undefined;
accountOper$entity?: import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/AccountOper/Schema").CreateOperationData, "entity" | "entityId">[]> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/AccountOper/Schema").CreateOperationData, "entity" | "entityId">>[] | undefined;
@ -40,8 +40,8 @@ export declare function getWithdrawCreateData(params: {
creatorId: string;
creator?: import("../oak-app-domain/User/Schema").UpdateOperation | undefined;
} & {
refund$withdraw?: import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/Refund/Schema").UpdateOperationData, "withdraw" | "withdrawId">, Omit<import("../oak-app-domain/Refund/Schema").Filter, "withdraw" | "withdrawId">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/Refund/Schema").CreateOperationData, "withdraw" | "withdrawId">[]> | (import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/Refund/Schema").UpdateOperationData, "withdraw" | "withdrawId">, Omit<import("../oak-app-domain/Refund/Schema").Filter, "withdraw" | "withdrawId">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/Refund/Schema").CreateOperationData, "withdraw" | "withdrawId">>)[] | undefined;
withdrawTransfer$withdraw?: import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").UpdateOperationData, "withdraw" | "withdrawId">, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").Filter, "withdraw" | "withdrawId">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/WithdrawTransfer/Schema").CreateOperationData, "withdraw" | "withdrawId">[]> | (import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").UpdateOperationData, "withdraw" | "withdrawId">, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").Filter, "withdraw" | "withdrawId">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/WithdrawTransfer/Schema").CreateOperationData, "withdraw" | "withdrawId">>)[] | undefined;
refund$withdraw?: import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/Refund/Schema").UpdateOperationData, "withdrawId" | "withdraw">, Omit<import("../oak-app-domain/Refund/Schema").Filter, "withdrawId" | "withdraw">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/Refund/Schema").CreateOperationData, "withdrawId" | "withdraw">[]> | (import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/Refund/Schema").UpdateOperationData, "withdrawId" | "withdraw">, Omit<import("../oak-app-domain/Refund/Schema").Filter, "withdrawId" | "withdraw">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/Refund/Schema").CreateOperationData, "withdrawId" | "withdraw">>)[] | undefined;
withdrawTransfer$withdraw?: import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").UpdateOperationData, "withdrawId" | "withdraw">, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").Filter, "withdrawId" | "withdraw">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/WithdrawTransfer/Schema").CreateOperationData, "withdrawId" | "withdraw">[]> | (import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").UpdateOperationData, "withdrawId" | "withdraw">, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").Filter, "withdrawId" | "withdraw">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/WithdrawTransfer/Schema").CreateOperationData, "withdrawId" | "withdraw">>)[] | undefined;
modiEntity$entity?: import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/ModiEntity/Schema").CreateOperationData, "entity" | "entityId">[]> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/ModiEntity/Schema").CreateOperationData, "entity" | "entityId">>[] | undefined;
operEntity$entity?: import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/OperEntity/Schema").CreateOperationData, "entity" | "entityId">[]> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/OperEntity/Schema").CreateOperationData, "entity" | "entityId">>[] | undefined;
accountOper$entity?: import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/AccountOper/Schema").CreateOperationData, "entity" | "entityId">[]> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/AccountOper/Schema").CreateOperationData, "entity" | "entityId">>[] | undefined;
@ -54,8 +54,8 @@ export declare function getWithdrawCreateData(params: {
creator?: undefined;
creatorId: string;
} & {
refund$withdraw?: import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/Refund/Schema").UpdateOperationData, "withdraw" | "withdrawId">, Omit<import("../oak-app-domain/Refund/Schema").Filter, "withdraw" | "withdrawId">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/Refund/Schema").CreateOperationData, "withdraw" | "withdrawId">[]> | (import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/Refund/Schema").UpdateOperationData, "withdraw" | "withdrawId">, Omit<import("../oak-app-domain/Refund/Schema").Filter, "withdraw" | "withdrawId">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/Refund/Schema").CreateOperationData, "withdraw" | "withdrawId">>)[] | undefined;
withdrawTransfer$withdraw?: import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").UpdateOperationData, "withdraw" | "withdrawId">, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").Filter, "withdraw" | "withdrawId">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/WithdrawTransfer/Schema").CreateOperationData, "withdraw" | "withdrawId">[]> | (import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").UpdateOperationData, "withdraw" | "withdrawId">, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").Filter, "withdraw" | "withdrawId">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/WithdrawTransfer/Schema").CreateOperationData, "withdraw" | "withdrawId">>)[] | undefined;
refund$withdraw?: import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/Refund/Schema").UpdateOperationData, "withdrawId" | "withdraw">, Omit<import("../oak-app-domain/Refund/Schema").Filter, "withdrawId" | "withdraw">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/Refund/Schema").CreateOperationData, "withdrawId" | "withdraw">[]> | (import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/Refund/Schema").UpdateOperationData, "withdrawId" | "withdraw">, Omit<import("../oak-app-domain/Refund/Schema").Filter, "withdrawId" | "withdraw">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/Refund/Schema").CreateOperationData, "withdrawId" | "withdraw">>)[] | undefined;
withdrawTransfer$withdraw?: import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").UpdateOperationData, "withdrawId" | "withdraw">, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").Filter, "withdrawId" | "withdraw">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/WithdrawTransfer/Schema").CreateOperationData, "withdrawId" | "withdraw">[]> | (import("oak-domain/lib/types").Operation<string, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").UpdateOperationData, "withdrawId" | "withdraw">, Omit<import("../oak-app-domain/WithdrawTransfer/Schema").Filter, "withdrawId" | "withdraw">> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/WithdrawTransfer/Schema").CreateOperationData, "withdrawId" | "withdraw">>)[] | undefined;
modiEntity$entity?: import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/ModiEntity/Schema").CreateOperationData, "entity" | "entityId">[]> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/ModiEntity/Schema").CreateOperationData, "entity" | "entityId">>[] | undefined;
operEntity$entity?: import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/OperEntity/Schema").CreateOperationData, "entity" | "entityId">[]> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/OperEntity/Schema").CreateOperationData, "entity" | "entityId">>[] | undefined;
accountOper$entity?: import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/AccountOper/Schema").CreateOperationData, "entity" | "entityId">[]> | import("oak-domain/lib/types").Operation<"create", Omit<import("../oak-app-domain/AccountOper/Schema").CreateOperationData, "entity" | "entityId">>[] | undefined;

View File

@ -57,14 +57,15 @@ const checkers = [
case 'refund':
case 'withdraw': {
if (totalPlus >= 0 || availPlus >= 0 || totalPlus !== availPlus) {
throw new types_1.OakInputIllegalException('accountOper', ['availPlus'], 'accountOper为withdraw时其totalPlus和availPlus必须为不相等的负数');
throw new types_1.OakInputIllegalException('accountOper', ['availPlus'], `accountOper为${type}其totalPlus和availPlus必须为不相等的负数`);
}
break;
}
case 'refundFailure':
case 'withdrawBack': {
case 'withdrawBack':
case 'consumeBack': {
if (totalPlus <= 0 || availPlus <= 0 || totalPlus !== availPlus) {
throw new types_1.OakInputIllegalException('accountOper', ['availPlus'], 'accountOper为withdraw时其totalPlus和availPlus必须为不相等的正数');
throw new types_1.OakInputIllegalException('accountOper', ['availPlus'], `accountOper为${type}其totalPlus和availPlus必须为不相等的正数`);
}
break;
}

View File

@ -30,13 +30,16 @@ function checkAttributes(data) {
}
}
}
const { refundCompensateRatio, refundGapDays } = data;
const { refundCompensateRatio, refundGapDays, withdrawTransferLossRatio } = data;
if (typeof refundGapDays !== 'number' || refundGapDays < 0) {
throw new types_1.OakInputIllegalException('offlineAccount', ['refundGapDays'], 'offlineAccount::error.refundGapDaysNotNegative');
}
if (typeof refundCompensateRatio !== 'number' || refundCompensateRatio < 0 || refundCompensateRatio > 100) {
throw new types_1.OakInputIllegalException('offlineAccount', ['refundGapDays'], 'offlineAccount::error.refundCompensateIllegal');
}
if (typeof withdrawTransferLossRatio !== 'number' || withdrawTransferLossRatio < 0) {
throw new types_1.OakInputIllegalException('offlineAccount', ['withdrawTransferLossRatio'], 'offlineAccount::error.withdrawTransferLossRatioNotNegative');
}
}
const checkers = [
{

View File

@ -17,6 +17,7 @@ const checkers = [
},
},
action: 'create',
errMsg: 'error::refund.create.hasAnotherRefunding',
},
{
entity: 'refund',

View File

@ -140,7 +140,7 @@ const attrUpdateMatrix = {
actions: ['update'],
},
price: {
actions: ['pay', 'refund', 'deposit', 'withdraw', 'tax'],
actions: ['pay', 'refund', 'deposit', 'withdrawTransfer', 'tax', 'moveOut', 'moveIn', 'compensate'],
},
allowDeposit: {
actions: ['update'],
@ -202,7 +202,7 @@ const attrUpdateMatrix = {
actions: ['update'],
},
price: {
actions: ['pay', 'refund', 'deposit', 'withdraw', 'tax'],
actions: ['pay', 'refund', 'deposit', 'withdrawTransfer', 'tax', 'moveOut', 'moveIn', 'compensate'],
}
},
withdrawAccount: {

View File

@ -12,8 +12,13 @@ const actionAuths = [
deActions: ['select', 'create']
},
{
id: 'user-acc-pay',
pathId: 'user-acc-pay',
id: 'creator-order-pay',
pathId: 'creator-order-pay',
deActions: ['select', 'create', 'startPaying', 'startRefunding', 'close']
},
{
id: 'user-dep-acc-pay',
pathId: 'user-dep-acc-pay',
deActions: ['select', 'update', 'startPaying', 'startRefunding', 'close']
},
{

View File

@ -408,7 +408,47 @@ const i18ns = [
"orderPriceSum": "订单总额",
"orderManage": "订单管理",
"orderList": "订单列表",
"tips1": "总账户余额+退款总额+转账总额+订单总额应该等于系统账户总余额"
"tips1": "总账户余额+退款总额+转账总额+订单总额应该等于系统账户总余额",
"move": "移动资金",
"history": "账单"
}
},
{
id: "207fd2189d3697d15672176ae88f4175",
namespace: "oak-pay-business-c-sysAccount-transferList",
language: "zh-CN",
module: "oak-pay-business",
position: "src/components/sysAccount/transferList",
data: {
"label": {
"channel": "转账渠道"
},
"tips": "正在转账的金额不计入任何账户,请到\"提现转账管理\"菜单完成操作"
}
},
{
id: "17a11f164c9977d8eb5b59fbc78755d5",
namespace: "oak-pay-business-c-sysAccountMove-create",
language: "zh-CN",
module: "oak-pay-business",
position: "src/components/sysAccountMove/create",
data: {
"label": {
"from": "从账户",
"to": "到账户"
}
}
},
{
id: "f89e1a2d0e88d8e2b3f900cfe28a893e",
namespace: "oak-pay-business-c-sysAccountOper-list",
language: "zh-CN",
module: "oak-pay-business",
position: "src/components/sysAccountOper/list",
data: {
"history": "账户历史",
"chooseMonth": "选择月份",
"all": "全部"
}
},
{
@ -585,7 +625,7 @@ const i18ns = [
position: "src/components/withdrawTransfer/list",
data: {
"label": {
"channel": "提现渠道",
"channel": "转账渠道",
"transferActualPrice": "实际转账金额",
"sysAccountAmount": "系统账户余额",
"cn": "创建者",
@ -755,6 +795,11 @@ const i18ns = [
"order": {
"payAmountNotEnough": "支付的额度总和不足",
"nonePay": "没有传入支付信息"
},
"refund": {
"create": {
"hasAnotherRefunding": "您有一笔退款正在进行中"
}
}
}
},
@ -788,7 +833,8 @@ const i18ns = [
"error": {
"nameQrCodeBothNull": "账号名和二维码不能同时为空",
"refundGapDaysNotNegative": "允许退款天数不能为负数或空",
"refundCompensateIllegal": "退款补偿百分比必须在0到100之间"
"refundCompensateIllegal": "退款补偿百分比必须在0到100之间",
"withdrawTransferLossRatioNotNegative": "提现转账费率必须在0到100之间"
}
}
},

View File

@ -9,10 +9,10 @@ const paths = [
recursive: false,
},
{
id: 'user-acc-pay',
id: 'user-dep-acc-pay',
sourceEntity: 'user',
destEntity: 'pay',
value: 'account.user',
value: 'deposit.account.user',
recursive: false,
},
{

View File

@ -2,7 +2,7 @@ import { String, Price } from 'oak-domain/lib/types/DataType';
import { EntityShape } from 'oak-domain/lib/types/Entity';
import { EntityDesc } from 'oak-domain/lib/types';
import { Schema as Account } from './Account';
type Type = 'deposit' | 'withdraw' | 'consume' | 'loan' | 'repay' | 'withdrawBack' | 'earn' | 'encash' | 'cutoffRefundable' | 'tax' | 'taxRefund' | 'refund' | 'refundFailure';
type Type = 'deposit' | 'withdraw' | 'consume' | 'consumeBack' | 'loan' | 'repay' | 'withdrawBack' | 'earn' | 'encash' | 'cutoffRefundable' | 'tax' | 'taxRefund' | 'refund' | 'refundFailure';
export interface Schema extends EntityShape {
account: Account;
type: Type;

View File

@ -23,9 +23,10 @@ exports.entityDesc = {
deposit: '充值',
withdraw: '提现',
consume: '消费',
consumeBack: '消费退还',
loan: '抵押',
repay: '偿还',
withdrawBack: '提现未遂',
withdrawBack: '提现退还',
earn: '赚取',
encash: '兑现',
tax: '渠道费',
@ -44,6 +45,7 @@ exports.entityDesc = {
withdraw: '#F7DC6F',
withdrawBack: '#F7DC6F',
consume: '#A569BD',
consumeBack: '#009933',
loan: '#CD6155',
repay: '#82E0AA',
earn: '#FF3333',

View File

@ -19,7 +19,7 @@ export interface Schema extends AbstractAccount {
channels: WithdrawChannel[];
enabled: Boolean;
}
export type Action = 'pay' | 'refund' | 'deposit' | 'withdraw' | 'tax';
export type Action = 'pay' | 'refund' | 'withdrawTransfer' | 'compensate' | 'moveIn' | 'moveOut' | 'deposit' | 'tax';
export declare const entityDesc: EntityDesc<Schema, Action, '', {
type: Schema['type'];
}>;

View File

@ -37,8 +37,11 @@ exports.entityDesc = {
action: {
pay: '支付',
refund: '退款',
withdrawTransfer: '提现转账',
compensate: '补偿',
moveIn: '转入',
moveOut: '转出',
deposit: '充值',
withdraw: '提现',
tax: '渠道费',
}
},
@ -56,8 +59,11 @@ exports.entityDesc = {
icon: {
pay: '',
refund: '',
withdrawTransfer: '',
compensate: '',
moveIn: '',
moveOut: '',
deposit: '',
withdraw: '',
tax: '',
}
},

Some files were not shown because too many files have changed in this diff Show More