自动获取即时库存配置方案(二)原创
金蝶云社区-邱育华
邱育华
8人赞赏了该文章 2130次浏览 未经作者许可,禁止转载编辑于2022年05月18日 13:58:48

之前文章提到使用实体服务规则配合"行更新"的方式处理【单据转换自动获取即时库存信息?行选择来帮您】,【自动获取即时库存配置方案(一)】,实际效果是每切换单据体的选中行,都会触发获取即时库存的操作,明细行较多且切换行操作频繁,对性能有较大的损耗。


研究了一下,有个更好一点的实现方案避免出现性能问题: 单据头扩展按钮(注意是单据头配置,单据体插件无法触发到),配置"获取即时库存"操作, 注册表单插件重写事件使得单据下推,审核反审核触发操作,从而实现自动获取即时库存


image.png


image.png


image.png


image.png


选单返回,没有设计特定事件

但系统会调用UpdateView,刷新界面数据。在此过程中,会触发OnLoad、BeforeBindData、AfterBindData等事件。

因此,通过this.View.OpenParameter.CreateFrom == CreateFrom.Draw 判断是否选单操作

据此与从数据库加载打开单据区分开


Python:

import clr
clr.AddReference("System")
clr.AddReference("System.Core")
clr.AddReference("Kingdee.BOS")
clr.AddReference("Kingdee.BOS.Core")

from System import *
from System import StringComparison
from Kingdee.BOS import *
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.DynamicForm import *
from Kingdee.BOS.Core.DynamicForm.PlugIn.Args import *
from Kingdee.BOS.Core.Metadata.FormElement import *

def AfterBindData(e):
    if this.View.OpenParameter.CreateFrom == CreateFrom.Draw: # 选单返回触发
        this.View.GetMainMenu().ItemClick("tbButton_1")
        this.View.SendDynamicFormAction(this.View)
        #this.View.UpdateView()

def AfterDoOperation(e):
    if e.Operation.Operation.Equals("Audit", StringComparison.OrdinalIgnoreCase) or e.Operation.Operation.Equals("UnAudit", StringComparison.OrdinalIgnoreCase):
        this.View.GetMainMenu().ItemClick("tbButton_1")
        this.View.SendDynamicFormAction(this.View)
        this.View.UpdateView()

def AfterCreateModelData(e):  # 适用于单据下推自动获取场景
    if this.View.OpenParameter.Status == OperationStatus.ADDNEW and this.View.OpenParameter.CreateFrom == CreateFrom.Push:
        this.View.GetMainMenu().ItemClick("tbButton_1")
        this.View.SendDynamicFormAction(this.View)


C#

using System;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.FormElement;

namespace Kingdee.K3.SCM.Stock.Business.PlugIn.MisBill
{
    public class MisDeliveryEditEx : AbstractBillPlugIn
    {
       public override void AfterBindData(EventArgs e)
        {
            if (this.View.OpenParameter.CreateFrom == CreateFrom.Draw)
            {
                this.View.GetMainMenu().ItemClick("tbButton_1");
                this.View.SendDynamicFormAction(this.View);
            }
        }
       
        public override void AfterCreateModelData(EventArgs e)
        {
            if (this.View.OpenParameter.Status == OperationStatus.ADDNEW && this.View.OpenParameter.CreateFrom == CreateFrom.Push)
            {
                this.View.GetMainMenu().ItemClick("tbButton_1");
                this.View.SendDynamicFormAction(this.View);
            }
        }

        public override void AfterDoOperation(AfterDoOperationEventArgs e)
        {
            base.AfterDoOperation(e);

            if (e.Operation.OperationId == FormOperation.Operation_Audit || e.Operation.OperationId == FormOperation.Operation_UnAudit)
            {
                this.View.GetMainMenu().ItemClick("tbButton_1");
                this.View.SendDynamicFormAction(this.View);
                this.View.UpdateView();
            }
        }
}



总结

1、两种方案做对比,如果需要录单实时获取即时库存,采用第一种方式,需要关注是否会出现性能问题;如果只在特殊操作节点获取即时库存,那采用方案二更合理,插件实现难度也不大。

赞 8