oak-pay-business/lib/triggers/withdraw.js

220 lines
7.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.updateWithdrawState = void 0;
const tslib_1 = require("tslib");
const uuid_1 = require("oak-domain/lib/utils/uuid");
const assert_1 = tslib_1.__importDefault(require("assert"));
/**
* 当refund/transfer完成或失败时如果关联有提现去更新提现的状态
* @param context
* @param refunds
*/
async function updateWithdrawState(context, id) {
const withdraws = await context.select('withdraw', {
data: {
id: 1,
iState: 1,
price: 1,
refund$withdraw: {
$entity: 'refund',
data: {
id: 1,
price: 1,
iState: 1,
loss: 1,
},
filter: {
iState: {
$in: ['successful', 'refunding']
}
}
},
withdrawTransfer$withdraw: {
$entity: 'withdrawTransfer',
data: {
id: 1,
price: 1,
iState: 1,
loss: 1,
},
filter: {
iState: {
$in: ['successful', 'transferring']
}
}
}
},
filter: {
id,
}
}, { forUpdate: true });
const [withdraw] = withdraws;
const { price, iState, refund$withdraw: refunds, withdrawTransfer$withdraw: transfers } = withdraw;
(0, assert_1.default)(iState === 'withdrawing');
let dealPrice = 0;
let dealLoss = 0;
let allRefundsOver = true;
if (refunds) {
for (const refund2 of refunds) {
if (refund2.iState === 'refunding') {
allRefundsOver = false;
break;
}
else {
dealPrice += refund2.price;
dealLoss += refund2.loss;
}
}
}
if (!allRefundsOver) {
return 0;
}
if (transfers) {
for (const transfer of transfers) {
if (transfer.iState === 'transferring') {
allRefundsOver = false;
break;
}
else {
dealPrice += transfer.price;
dealLoss += transfer.loss;
}
}
}
if (!allRefundsOver) {
return 0;
}
const action = dealPrice === 0 ? 'fail' : (dealPrice === price ? 'succeed' : 'succeedPartially');
await context.operate('withdraw', {
id: await (0, uuid_1.generateNewIdAsync)(),
action,
data: {
dealPrice,
dealLoss,
},
filter: {
id: withdraw.id,
}
}, {});
return 1;
}
exports.updateWithdrawState = updateWithdrawState;
const triggers = [
{
name: '当withdraw创建时如果是走退款渠道则创建出相应的refunds同时更改account中的数值',
entity: 'withdraw',
action: 'create',
when: 'before',
fn: async ({ operation }, context, option) => {
const { data } = operation;
(0, assert_1.default)(!(data instanceof Array));
const { accountId, price, refund$withdraw: refunds, withdrawTransfer$withdraw: transfers } = data;
let refundAmount = 0;
refunds?.forEach(({ data }) => {
const { price } = data;
(0, assert_1.default)(price);
refundAmount += price;
});
let transferAmount = 0;
transfers?.forEach(({ data }) => {
const { price } = data;
(0, assert_1.default)(price);
transferAmount += price;
});
(0, assert_1.default)(refundAmount + transferAmount === price);
data.dealPrice = data.dealLoss = 0;
data.creatorId = context.getCurrentUserId();
data.accountOper$entity = [
{
id: await (0, uuid_1.generateNewIdAsync)(),
action: 'create',
data: {
id: await (0, uuid_1.generateNewIdAsync)(),
accountId,
type: 'withdraw',
totalPlus: -price,
availPlus: -price,
refundablePlus: -refundAmount,
},
}
];
return 1;
},
},
{
name: '当withdraw失败时将total和avail还回到帐户',
entity: 'withdraw',
action: 'fail',
when: 'after',
fn: async ({ operation }, context, option) => {
const { filter, data } = operation;
const withdraws = await context.select('withdraw', {
data: {
id: 1,
accountId: 1,
iState: 1,
price: 1,
dealPrice: 1,
},
filter,
}, {});
for (const withdraw of withdraws) {
const { accountId, price, dealPrice } = withdraw;
(0, assert_1.default)(dealPrice === 0);
await context.operate('accountOper', {
id: await (0, uuid_1.generateNewIdAsync)(),
action: 'create',
data: {
id: await (0, uuid_1.generateNewIdAsync)(),
accountId,
type: 'withdrawBack',
totalPlus: price,
availPlus: price,
entity: 'withdraw',
entityId: withdraw.id,
},
}, {});
}
return withdraws.length;
},
},
{
name: '当withdraw部分成功时将差价部分还回到帐户中',
entity: 'withdraw',
action: 'succeedPartially',
when: 'after',
fn: async ({ operation }, context) => {
const { filter, data } = operation;
const withdraws = await context.select('withdraw', {
data: {
id: 1,
accountId: 1,
iState: 1,
price: 1,
dealPrice: 1,
},
filter,
}, {});
for (const withdraw of withdraws) {
const { accountId, price, dealPrice } = withdraw;
(0, assert_1.default)(price > dealPrice && dealPrice > 0);
await context.operate('accountOper', {
id: await (0, uuid_1.generateNewIdAsync)(),
action: 'create',
data: {
id: await (0, uuid_1.generateNewIdAsync)(),
accountId,
type: 'withdrawBack',
totalPlus: price - dealPrice,
availPlus: price - dealPrice,
entity: 'withdraw',
entityId: withdraw.id,
},
}, {});
}
return withdraws.length;
}
}
];
exports.default = triggers;