From 2f9e65b38a571e078b1314a81d057fa3010d8e67 Mon Sep 17 00:00:00 2001 From: "Xc@centOs" Date: Fri, 12 Jul 2024 20:13:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=92=8C=E9=80=80=E6=AC=BE?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E5=90=84=E7=A7=8D=E5=B0=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- es/checkers/pay.js | 1 + es/checkers/refund.js | 4 ++-- es/components/refund/list/index.js | 3 ++- es/components/refund/list/web.pc.d.ts | 1 + es/components/refund/list/web.pc.js | 4 ++-- es/configuration/attrUpdateMatrix.js | 3 +++ es/triggers/pay.js | 7 ++++--- es/triggers/refund.js | 1 + es/utils/pay.js | 2 +- es/utils/payClazz/WechatPay/WechatPay.js | 4 ++-- es/watchers/refund.js | 3 ++- lib/checkers/pay.js | 1 + lib/checkers/refund.js | 4 ++-- lib/configuration/attrUpdateMatrix.js | 3 +++ lib/triggers/pay.js | 5 +++-- lib/triggers/refund.js | 1 + lib/utils/pay.js | 2 +- lib/utils/payClazz/WechatPay/WechatPay.js | 4 ++-- lib/watchers/refund.js | 3 ++- src/checkers/pay.ts | 1 + src/checkers/refund.ts | 4 ++-- src/components/refund/list/index.ts | 3 ++- src/components/refund/list/web.pc.tsx | 5 +++-- src/configuration/attrUpdateMatrix.ts | 3 +++ src/triggers/pay.ts | 3 ++- src/triggers/refund.ts | 1 + src/utils/pay.ts | 2 +- src/utils/payClazz/WechatPay/WechatPay.ts | 4 ++-- src/watchers/refund.ts | 3 ++- 29 files changed, 55 insertions(+), 30 deletions(-) diff --git a/es/checkers/pay.js b/es/checkers/pay.js index 44738017..459ecba2 100644 --- a/es/checkers/pay.js +++ b/es/checkers/pay.js @@ -12,6 +12,7 @@ const checkers = [ data.paid = 0; data.applicationId = context.getApplicationId(); data.creatorId = context.getCurrentUserId(); + data.refundable = false; if (!data.meta) { data.meta = {}; } diff --git a/es/checkers/refund.js b/es/checkers/refund.js index d58aad90..98567183 100644 --- a/es/checkers/refund.js +++ b/es/checkers/refund.js @@ -24,7 +24,7 @@ const checkers = [ checker(operation, context) { const { data, filter } = operation; const { externalId } = data; - // 必须有ExternalId,除非是account类型的支付 + // 当offline退款成功时,必须有ExternalId if (!externalId) { return pipeline(() => context.select('refund', { data: { @@ -39,7 +39,7 @@ const checkers = [ } }, { dontCollect: true }), (refunds) => { const [refund] = refunds; - if (refund.pay.entity !== 'account') { + if (refund.pay.entity === 'offlineAcount') { throw new OakAttrNotNullException('refund', ['externalId']); } }); diff --git a/es/components/refund/list/index.js b/es/components/refund/list/index.js index 15539193..1dd82f2b 100644 --- a/es/components/refund/list/index.js +++ b/es/components/refund/list/index.js @@ -55,7 +55,7 @@ export default OakComponent({ } } ], - formData({ data }) { + formData({ data, features }) { return { refunds: data?.map((ele) => { const { creator, withdrawId, pay, ...rest } = ele; @@ -70,6 +70,7 @@ export default OakComponent({ creatorMobile: creator?.mobile$user?.[0]?.mobile || '-', }; }), + amIRoot: features.token.isRoot(), }; } }); diff --git a/es/components/refund/list/web.pc.d.ts b/es/components/refund/list/web.pc.d.ts index deda7755..cd6ca4aa 100644 --- a/es/components/refund/list/web.pc.d.ts +++ b/es/components/refund/list/web.pc.d.ts @@ -8,4 +8,5 @@ export default function Render(props: WebComponentProps): React.JSX.Element | null; diff --git a/es/components/refund/list/web.pc.js b/es/components/refund/list/web.pc.js index 7a6fc8d3..987bd9f7 100644 --- a/es/components/refund/list/web.pc.js +++ b/es/components/refund/list/web.pc.js @@ -6,7 +6,7 @@ import { FilterPanel } from '../../../components/AbstractComponents'; import { ToYuan, ThousandCont } from 'oak-domain/lib/utils/money'; import assert from 'assert'; export default function Render(props) { - const { refunds, oakFullpath, oakExecutable } = props.data; + const { refunds, oakFullpath, oakExecutable, amIRoot } = props.data; const { t, updateItem, execute, clean, setMessage } = props.methods; const [upsertId, setUpsertId] = useState(''); const [updateAction, setUpdateAction] = useState(''); @@ -100,7 +100,7 @@ export default function Render(props) { ]} onAction={(row, action) => { const { entity } = row.pay; assert(entity !== 'account'); - if (entity !== 'offlineAccount') { + if (entity !== 'offlineAccount' || !amIRoot) { setMessage({ type: 'error', title: t('cantOperateOnline'), diff --git a/es/configuration/attrUpdateMatrix.js b/es/configuration/attrUpdateMatrix.js index e5608f29..e06e7af2 100644 --- a/es/configuration/attrUpdateMatrix.js +++ b/es/configuration/attrUpdateMatrix.js @@ -84,6 +84,9 @@ const attrUpdateMatrix = { }, reason: { actions: ['fail'], + }, + successAt: { + actions: ['succeed'], } }, withdraw: { diff --git a/es/triggers/pay.js b/es/triggers/pay.js index 0742a67f..72a68a54 100644 --- a/es/triggers/pay.js +++ b/es/triggers/pay.js @@ -1,7 +1,7 @@ import { generateNewIdAsync } from 'oak-domain/lib/utils/uuid'; import assert from 'assert'; import { getPayClazz } from '../utils/payClazz'; -import { fullPayProjection, refreshPayState } from '../utils/pay'; +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) { @@ -622,6 +622,7 @@ const triggers = [ } } }, + /* 影响的地方有点多,先不做了 { entity: 'pay', name: '当选择pay并发现pay的状态是paying时,尝试刷新其状态', @@ -629,10 +630,10 @@ const triggers = [ when: 'after', fn: async ({ result }, context) => { if (result.length === 1 && result[0].iState === 'paying') { - await refreshPayState(result[0], context); + await refreshPayState(result[0] as EntityDict['pay']['OpSchema'], context); } return 0; } - }, + } as SelectTriggerAfter, */ ]; export default triggers; diff --git a/es/triggers/refund.js b/es/triggers/refund.js index 3951edec..a2119a29 100644 --- a/es/triggers/refund.js +++ b/es/triggers/refund.js @@ -115,6 +115,7 @@ async function succeedRefunding(context, refundId) { action, data: { refunded: refunded2, + refundable: refunded2 < paid, }, filter: { id: pay.id, diff --git a/es/utils/pay.js b/es/utils/pay.js index 850844ef..900fb5b5 100644 --- a/es/utils/pay.js +++ b/es/utils/pay.js @@ -155,7 +155,7 @@ export async function refreshPayState(pay, context) { filter: { id: pay.id, } - }, {}); + }, { blockTrigger: true }); pay2 = pays[0]; } const { entity, entityId, timeoutAt, price } = pay2; diff --git a/es/utils/payClazz/WechatPay/WechatPay.js b/es/utils/payClazz/WechatPay/WechatPay.js index 489974f9..53b4647f 100644 --- a/es/utils/payClazz/WechatPay/WechatPay.js +++ b/es/utils/payClazz/WechatPay/WechatPay.js @@ -308,7 +308,7 @@ export default class WechatPay extends WechatPayDebug { meta: omit(result, ['mchid',]), }; if (iState === 'paid') { - extra.successAt = success_time; + extra.successAt = dayJs(success_time).valueOf(); } return { payId, @@ -361,7 +361,7 @@ export default class WechatPay extends WechatPayDebug { meta: omit(result, ['mchid',]), }; if (iState === 'successful') { - extra.successAt = success_time; + extra.successAt = dayJs(success_time).valueOf(); } return { refundId, diff --git a/es/watchers/refund.js b/es/watchers/refund.js index acb0261a..879fd9db 100644 --- a/es/watchers/refund.js +++ b/es/watchers/refund.js @@ -29,7 +29,8 @@ const watchers = [ entity: 1, entityId: 1, applicationId: 1, - } + }, + externalId: 1, }, fn: async (context, data) => { const results = []; diff --git a/lib/checkers/pay.js b/lib/checkers/pay.js index c9fa5a43..31a2264c 100644 --- a/lib/checkers/pay.js +++ b/lib/checkers/pay.js @@ -15,6 +15,7 @@ const checkers = [ data.paid = 0; data.applicationId = context.getApplicationId(); data.creatorId = context.getCurrentUserId(); + data.refundable = false; if (!data.meta) { data.meta = {}; } diff --git a/lib/checkers/refund.js b/lib/checkers/refund.js index c6044b69..e571c74c 100644 --- a/lib/checkers/refund.js +++ b/lib/checkers/refund.js @@ -26,7 +26,7 @@ const checkers = [ checker(operation, context) { const { data, filter } = operation; const { externalId } = data; - // 必须有ExternalId,除非是account类型的支付 + // 当offline退款成功时,必须有ExternalId if (!externalId) { return (0, executor_1.pipeline)(() => context.select('refund', { data: { @@ -41,7 +41,7 @@ const checkers = [ } }, { dontCollect: true }), (refunds) => { const [refund] = refunds; - if (refund.pay.entity !== 'account') { + if (refund.pay.entity === 'offlineAcount') { throw new types_1.OakAttrNotNullException('refund', ['externalId']); } }); diff --git a/lib/configuration/attrUpdateMatrix.js b/lib/configuration/attrUpdateMatrix.js index 19beea17..dbce8917 100644 --- a/lib/configuration/attrUpdateMatrix.js +++ b/lib/configuration/attrUpdateMatrix.js @@ -86,6 +86,9 @@ const attrUpdateMatrix = { }, reason: { actions: ['fail'], + }, + successAt: { + actions: ['succeed'], } }, withdraw: { diff --git a/lib/triggers/pay.js b/lib/triggers/pay.js index d400a3fd..47048c50 100644 --- a/lib/triggers/pay.js +++ b/lib/triggers/pay.js @@ -625,6 +625,7 @@ const triggers = [ } } }, + /* 影响的地方有点多,先不做了 { entity: 'pay', name: '当选择pay并发现pay的状态是paying时,尝试刷新其状态', @@ -632,10 +633,10 @@ const triggers = [ when: 'after', fn: async ({ result }, context) => { if (result.length === 1 && result[0].iState === 'paying') { - await (0, pay_1.refreshPayState)(result[0], context); + await refreshPayState(result[0] as EntityDict['pay']['OpSchema'], context); } return 0; } - }, + } as SelectTriggerAfter, */ ]; exports.default = triggers; diff --git a/lib/triggers/refund.js b/lib/triggers/refund.js index 2ad03b53..75a6e817 100644 --- a/lib/triggers/refund.js +++ b/lib/triggers/refund.js @@ -118,6 +118,7 @@ async function succeedRefunding(context, refundId) { action, data: { refunded: refunded2, + refundable: refunded2 < paid, }, filter: { id: pay.id, diff --git a/lib/utils/pay.js b/lib/utils/pay.js index 33b17291..95aa716e 100644 --- a/lib/utils/pay.js +++ b/lib/utils/pay.js @@ -161,7 +161,7 @@ async function refreshPayState(pay, context) { filter: { id: pay.id, } - }, {}); + }, { blockTrigger: true }); pay2 = pays[0]; } const { entity, entityId, timeoutAt, price } = pay2; diff --git a/lib/utils/payClazz/WechatPay/WechatPay.js b/lib/utils/payClazz/WechatPay/WechatPay.js index 3b2d11a6..916d9f01 100644 --- a/lib/utils/payClazz/WechatPay/WechatPay.js +++ b/lib/utils/payClazz/WechatPay/WechatPay.js @@ -311,7 +311,7 @@ class WechatPay extends WechatPay_debug_1.default { meta: (0, lodash_1.omit)(result, ['mchid',]), }; if (iState === 'paid') { - extra.successAt = success_time; + extra.successAt = (0, dayjs_1.default)(success_time).valueOf(); } return { payId, @@ -364,7 +364,7 @@ class WechatPay extends WechatPay_debug_1.default { meta: (0, lodash_1.omit)(result, ['mchid',]), }; if (iState === 'successful') { - extra.successAt = success_time; + extra.successAt = (0, dayjs_1.default)(success_time).valueOf(); } return { refundId, diff --git a/lib/watchers/refund.js b/lib/watchers/refund.js index 4f3cb370..20b8e766 100644 --- a/lib/watchers/refund.js +++ b/lib/watchers/refund.js @@ -32,7 +32,8 @@ const watchers = [ entity: 1, entityId: 1, applicationId: 1, - } + }, + externalId: 1, }, fn: async (context, data) => { const results = []; diff --git a/src/checkers/pay.ts b/src/checkers/pay.ts index 180cbab8..923e0da8 100644 --- a/src/checkers/pay.ts +++ b/src/checkers/pay.ts @@ -19,6 +19,7 @@ const checkers: Checker[] = [ data.paid = 0; data.applicationId = context.getApplicationId()!; data.creatorId = context.getCurrentUserId()!; + data.refundable = false; if (!data.meta) { data.meta = {}; } diff --git a/src/checkers/refund.ts b/src/checkers/refund.ts index 029ba3b0..410b615b 100644 --- a/src/checkers/refund.ts +++ b/src/checkers/refund.ts @@ -31,7 +31,7 @@ const checkers: Checker[] = [ const { data, filter } = operation as EntityDict['refund']['Update']; const { externalId } = data; - // 必须有ExternalId,除非是account类型的支付 + // 当offline退款成功时,必须有ExternalId if (!externalId) { return pipeline( () => context.select('refund', { @@ -48,7 +48,7 @@ const checkers: Checker[] = [ }, { dontCollect: true }), (refunds: EntityDict['refund']['Schema'][]) => { const [ refund ] = refunds; - if (refund!.pay!.entity !== 'account') { + if (refund!.pay!.entity === 'offlineAcount') { throw new OakAttrNotNullException('refund', ['externalId']); } } diff --git a/src/components/refund/list/index.ts b/src/components/refund/list/index.ts index b8b79834..890f4404 100644 --- a/src/components/refund/list/index.ts +++ b/src/components/refund/list/index.ts @@ -57,7 +57,7 @@ export default OakComponent({ } } ], - formData({ data }) { + formData({ data, features }) { return { refunds: data?.map( (ele) => { @@ -76,6 +76,7 @@ export default OakComponent({ }; } ), + amIRoot: features.token.isRoot(), }; } }) \ No newline at end of file diff --git a/src/components/refund/list/web.pc.tsx b/src/components/refund/list/web.pc.tsx index 159f6e04..83f988a7 100644 --- a/src/components/refund/list/web.pc.tsx +++ b/src/components/refund/list/web.pc.tsx @@ -17,8 +17,9 @@ export default function Render(props: WebComponentProps) { - const { refunds, oakFullpath, oakExecutable } = props.data; + const { refunds, oakFullpath, oakExecutable, amIRoot } = props.data; const { t, updateItem, execute, clean, setMessage } = props.methods; const [upsertId, setUpsertId] = useState(''); @@ -126,7 +127,7 @@ export default function Render(props: WebComponentProps { const { entity } = row.pay; assert(entity !== 'account'); - if (entity !== 'offlineAccount') { + if (entity !== 'offlineAccount' || !amIRoot) { setMessage({ type: 'error', title: t('cantOperateOnline'), diff --git a/src/configuration/attrUpdateMatrix.ts b/src/configuration/attrUpdateMatrix.ts index a684c3e8..61879361 100644 --- a/src/configuration/attrUpdateMatrix.ts +++ b/src/configuration/attrUpdateMatrix.ts @@ -89,6 +89,9 @@ const attrUpdateMatrix: AttrUpdateMatrix = { }, reason: { actions: ['fail'], + }, + successAt: { + actions: ['succeed'], } }, withdraw: { diff --git a/src/triggers/pay.ts b/src/triggers/pay.ts index 2c78dd68..03fb47ca 100644 --- a/src/triggers/pay.ts +++ b/src/triggers/pay.ts @@ -676,6 +676,7 @@ const triggers: Trigger[] = [ } } } as UpdateTriggerInTxn, + /* 影响的地方有点多,先不做了 { entity: 'pay', name: '当选择pay并发现pay的状态是paying时,尝试刷新其状态', @@ -687,7 +688,7 @@ const triggers: Trigger[] = [ } return 0; } - } as SelectTriggerAfter, + } as SelectTriggerAfter, */ ]; export default triggers; \ No newline at end of file diff --git a/src/triggers/refund.ts b/src/triggers/refund.ts index 05179450..1136c46d 100644 --- a/src/triggers/refund.ts +++ b/src/triggers/refund.ts @@ -131,6 +131,7 @@ async function succeedRefunding(context: BRC, refundId: string) { action, data: { refunded: refunded2, + refundable: refunded2 < paid!, }, filter: { id: pay!.id!, diff --git a/src/utils/pay.ts b/src/utils/pay.ts index 8a2d356e..10750453 100644 --- a/src/utils/pay.ts +++ b/src/utils/pay.ts @@ -180,7 +180,7 @@ export async function refreshPayState( filter: { id: pay.id, } - }, {}); + }, { blockTrigger: true }); pay2 = pays[0] as typeof pay; } const { entity, entityId, timeoutAt, price } = pay2; diff --git a/src/utils/payClazz/WechatPay/WechatPay.ts b/src/utils/payClazz/WechatPay/WechatPay.ts index f674b2e1..48263349 100644 --- a/src/utils/payClazz/WechatPay/WechatPay.ts +++ b/src/utils/payClazz/WechatPay/WechatPay.ts @@ -363,7 +363,7 @@ export default class WechatPay extends WechatPayDebug implements PayClazz { }; if (iState === 'paid') { - extra.successAt = success_time; + extra.successAt = dayJs(success_time).valueOf(); } return { @@ -439,7 +439,7 @@ export default class WechatPay extends WechatPayDebug implements PayClazz { }; if (iState === 'successful') { - extra.successAt = success_time; + extra.successAt = dayJs(success_time).valueOf(); } return { diff --git a/src/watchers/refund.ts b/src/watchers/refund.ts index de7706d6..5024f95e 100644 --- a/src/watchers/refund.ts +++ b/src/watchers/refund.ts @@ -36,7 +36,8 @@ const watchers: Watcher[] = [ entity: 1, entityId: 1, applicationId: 1, - } + }, + externalId: 1, }, fn: async (context, data) => { const results = [] as OperationResult[];