Acumatica技术咨询:将信用冻结管控从Sales Orders转移至Shipments的事件处理程序实现建议
Acumatica技术咨询:将信用冻结管控从Sales Orders转移至Shipments的事件处理程序实现建议
Hi Aleks, 针对你想把信用额度管控逻辑从销售订单转移到发货环节的需求——也就是让信用冻结只阻止发货释放、不影响生产——我整理了一些实操建议和代码示例,希望能帮到你:
核心思路
原有的OnCreditLimitSatisfied和OnCreditLimitViolated事件默认绑定在销售订单(SOOrder)图中,我们需要在发货单(SOShipment)图中实现类似的信用检查逻辑,绑定到发货释放的动作前,以此控制发货权限。
实操步骤与代码示例
推荐使用Graph Extension来扩展SOShipment图,避免直接修改系统原生代码,方便后续版本升级:
using PX.Data; using PX.Objects.AR; using PX.Objects.SO; public class SOShipmentCreditControlExt : PXGraphExtension<SOShipment> { public override void Initialize() { base.Initialize(); // 将信用检查绑定到发货释放动作的前置事件 Base.release.AddHandler<SOShipment>(OnBeforeReleaseShipment); } /// <summary> /// 发货释放前执行信用检查 /// </summary> protected virtual void OnBeforeReleaseShipment(PXCache cache, PXRowSelectedEventArgs e) { SOShipment shipment = e.Row as SOShipment; if (shipment == null || shipment.CustomerID == null) return; // 获取当前发货单对应的客户信息 BAccount customer = PXSelect<BAccount, Where<BAccount.bAccountID, Equal<Required<SOShipment.customerID>>>> .Select(Base, shipment.CustomerID); if (customer == null) return; // 调用系统内置的信用检查工具类,获取客户信用状态 ARCreditCheckResult creditResult = ARCreditCheck.GetCustomerCreditStatus( graph: Base, bAccountID: customer.BAccountID, docDate: shipment.ShipDate, branchID: shipment.BranchID, currencyID: shipment.CuryID ); // 根据信用检查结果触发对应事件并控制发货动作 if (creditResult.Violation != null) { // 触发信用额度违反事件,自定义提示并阻止释放 Base.OnCreditLimitViolated?.Invoke(cache, new PXCreditLimitViolatedEventArgs(shipment, creditResult.Violation)); throw new PXException("客户 {0} 信用额度已超出,无法释放该发货单。", customer.AcctName); } else { // 信用额度符合要求,触发满足事件 Base.OnCreditLimitSatisfied?.Invoke(cache, new PXEventArgs(shipment)); } } /// <summary> /// 自定义信用额度违反事件的处理逻辑 /// </summary> public virtual void _(Events.CreditLimitViolated<SOShipment> e) { // 这里可以添加自定义逻辑,比如记录审计日志、发送通知等 PXTrace.WriteError("信用管控拦截:发货单 {0} 因客户信用额度不足被阻止释放。", Base.Document.Current.ShipmentNbr); e.Cancel = true; // 明确标记取消当前动作 } /// <summary> /// 自定义信用额度满足事件的处理逻辑 /// </summary> public virtual void _(Events.CreditLimitSatisfied<SOShipment> e) { // 这里可以添加自定义逻辑,比如记录放行日志 PXTrace.WriteInformation("信用管控放行:发货单 {0} 客户信用状态正常,允许释放。", Base.Document.Current.ShipmentNbr); } }
关键注意事项
- 逻辑一致性:
ARCreditCheck.GetCustomerCreditStatus方法的参数可以根据你的业务需求调整,比如是否包含未结发票、未发货订单等,确保信用检查逻辑和销售订单环节保持一致(或按需修改)。 - 版本适配:不同Acumatica版本的
ARCreditCheck类方法参数可能有细微差异,建议参考你使用版本的官方API文档调整代码。 - 测试验证:务必测试两种场景:客户信用额度不足时是否能阻止发货释放;客户还款后信用恢复时是否能正常释放发货单。
- 扩展灵活性:如果需要更复杂的信用规则(比如针对特定客户组豁免检查),可以在信用检查逻辑中添加额外的判断条件。
如果还有具体的细节问题,比如参数调整、版本适配或者特殊业务场景的处理,欢迎补充说明,大家一起讨论~
备注:内容来源于stack exchange,提问作者Aleks Iwan
相关产品推荐
相关产品推荐

