销售单据跳转至获取电子面单携带物料信息试例原创
金蝶云社区-文安根
文安根
5人赞赏了该文章 796次浏览 未经作者许可,禁止转载编辑于2022年09月16日 14:06:54

    在星空企业版 PT-146906 [8.0.0.202203] 补丁中,支持从单据列表上批量勾选相关记录跳转到获取电子面单界面,从单据的物流跟踪页签直接跳转到获取电子面单界面的功能在PT-146906 [8.0.0.202203] 之前几个版本就已经支持了,这些跳转功能默认都会携带当前单据或选择的单据列表相关信息到获取电子面单界面并填充好,这样无需通过'获取电子面单'菜单并选择相关单据以填充值,跳转前的操作如下图1-1和图1-2所示:

image.png

图1-1


image.png

图1-2


列表批量选择记录跳转后的界面如下图1-3所示:

image.png

图1-3


默认情况下跳转到'获取电子面单'界面后的备注,物品名称字段都是空的(主要是因为星空通版不知道电子面单上的备注客户要输入什么信息,物品名称也可能只是一个汇总的抽象的东西),但是物料清单字段(本字段仅用于快递管家用)是有值的,很多客户提单反馈希望跳转后能够带出物料相关信息,比如单据上的物料携带到'获取电子面单'上的备注或物料名称字段上,当然也希望通过在获取电子面单选择单据后也能携带出物料信息,这样方便在打印快递100电子面单时能够显示物料信息。此问题可通过BOSIDE配置处理,通过扩展'获取电子面单'动态表单,添加Python插件,如下图2-1所示:

image.png
图2-1


脚本如下所示(不要复制以下脚本,此脚本会HTML转义某些空格导致有问题,请使用附件中的代码):

import clr
clr.AddReference('System')
clr.AddReference('Newtonsoft.Json')
clr.AddReference('Kingdee.BOS.Core')

from Newtonsoft.Json.Linq import *
from Kingdee.BOS.Core import *
from System import *

def DataChanged(e):
    if e.Field.Key.Equals("FItems", StringComparison.OrdinalIgnoreCase):
        stringifyItems = Convert.ToString(this.View.Model.GetValue("FItems", e.Row))
        if(len(stringifyItems) > 0):
            items = JArray.Parse(stringifyItems);
            materialNames = ""
            for item in items:
                itemName = str(item["itemName"])
                if not materialNames.__contains__(itemName):
                    materialNames = materialNames + " " + itemName
            this.View.Model.SetValue("FComment", materialNames.strip(), e.Row)

def AfterBindData(e):
    entryCount = this.View.Model.GetEntryRowCount("FKuaidiEntity");     
    rowIndex = 0;
    while (rowIndex < entryCount):
        stringifyItems = Convert.ToString(this.View.Model.GetValue("FItems", rowIndex));
        try:
            if(len(stringifyItems) > 0):
                items = JArray.Parse(stringifyItems);
                materialNames = ""
                for item in items:
                    itemName = str(item["itemName"])
                    if not materialNames.__contains__(itemName):
                        materialNames = materialNames + " " + itemName;
                    this.View.Model.SetValue("FComment", materialNames.strip(), rowIndex); 
                    this.View.UpdateView("FComment", rowIndex);     
        except:
            print("python error");
        finally:
            rowIndex = rowIndex + 1;


上面代码中的DataChanged方法应用于获取电子面单选择单据后携带物料名称到备注字段,此方法是在物料清单(FItems字段为物料清单字段,里面包含有物料名称,单位,数量信息)值更新事件后通过解析物料清单中的JSON字符串,拼接JSON中的itemName属性并赋值给备注字段,因此这个地方是需要给物料清单字段配置即时触发更新事件。如下图2-2

image.png

图2-2


AfterBindData方法用于从单据或列表跳转到'获取电子面单'界面使用,为何不能混在一个DataChanged方法中呢?主要是因为通版的插件是在AfterBindData方法中调用了SkipAndPopulateDefaultValues 方法,此SkipAndPopulateDefaultValues方法虽然会给物料清单赋值,但不会触发物料清单的值更新事件,AfterBindData方法中设置了备注字段后,需要调用UpdateView方法刷新界面。

如果想将物料信息赋值给物品名称字段,则只需要将上面代码中的FComment替换成FCargo即可,当然客户也可以通过修改相关代码,将物料信息,数量信息,单位信息合并汇总给'获取电子面单'的物品名称字段。以上的代码有个地方就是DataChanged方法没有用异常捕获代码块而在AfterBindData中使用到了,这个地方目前我也解释不了(有知道的大佬可分享下),经过测试如果不加try语句会报len方法有错误的异常(神奇的是这个异常又不会影响到后面的FComment值更新和界面刷新功能),二开客户可以尝试去掉try语句测试。

下图2-3为携带物料信息到备注字段示意图:

image.png

图2-3


python.zip(0.65KB)

赞 5