我们遇到了作废检查的问题。此场景是索赔处理人员手动按下作废检查按钮。然后我们运行这个逻辑
function voidCheck() {
try {
gw.api.util.CCLocationUtil.runAndCommit(\-> {
if (Check.isInternalCostPayment or Check.isFrontingPayment) {
Logger.info("Voiding Internal Cost Check" + Check.PublicID)
Check.voidCheck()
Check.updateCheckStatus(Check.CheckNumber, Date.CurrentDate.toCalendar(), TransactionStatus.TC_VOIDED)
Logger.info("Voided Internal Cost Check" + Check.PublicID)
} else {
Logger.info("Voiding Check and Triggering Disbursement" + Check.PublicID)
DisbursementVoidDetails.Instance.invokeVoidService(Check)
Logger.info("Triggerred Disbursement service and got response" + Check.PublicID)
Check.voidCheck()
Logger.info("Check set to Pending void (${Check.Status})")
}
}, CurrentLocation)
} catch (e : IllegalStateException) {
throw new gw.api.util.DisplayableException(DisplayKey.get("Web.Financials.CheckCancel.Error.IllegalFinancialsStatus"), e)
} catch (all : Exception){
Logger.error("Exception encountered during voiding of check: ${Check.PublicID} for claim ${Check.Claim.ClaimNumber} with message ",#voidCheck(),all)
throw new gw.api.util.DisplayableException(DisplayKey.get("Web.Financials.CheckCancel.Error.void"))
}
}
在日志中,我可以看到这样的消息:检查已创建,通过集成确认,然后在用户手动作废检查但出现异常 30 秒后。我无法在较低的环境中重现相同的错误。我可以在哪里放置断点。
我怀疑是 runAndCommit() 函数,因为我无法在本地重现该场景,我无法确认确切的错误。
有什么推荐吗?
我不能确定你的根本原因是什么,但有一件事编码不正确。
此片段违反了仅更新消息传递插件中的检查状态的规则。您可以致电
voidCheck()
,这会将支票状态更新为 Pending Void。但不允许从 PCF 调用updateCheckStatus
。当您从支票打印或下游系统收到支票已作废的肯定确认后,您应该从消息传递插件(请求插件或回复插件)调用 updateCheckStatus
。
if (Check.isInternalCostPayment or Check.isFrontingPayment) {
Logger.info("Voiding Internal Cost Check" + Check.PublicID)
Check.voidCheck()
Check.updateCheckStatus(Check.CheckNumber, Date.CurrentDate.toCalendar(), TransactionStatus.TC_VOIDED)
Logger.info("Voided Internal Cost Check" + Check.PublicID)
}
查看我从此处链接的 GW 文档复制的警告(需要登录)
您只能在以下特定上下文中使用这些方法。在其他上下文中使用这些方法不受支持,并且会产生不可预测的结果。
- 仅来自消息插件。切勿使用规则集或其他 Gosu 或 Java 上下文中的这些方法。
- 仅在提交消息确认后。如果此消息与仅通过调用财务确认 API 发生的状态转换关联,请先调用这些 API,然后再尝试其他状态更改。在同步发送和确认后在 MessageTransport 插件中进行调用,或者在异步确认消息后在 MessageReply 插件中进行调用。