小编推荐
客户实际业务中经常会遇到单据下推时希望在处理下游单据时,能查看上游单据附件,同时下游单据附件的修改同步更新至源单据,此种场景如何解决呢?
此次我们以销售订单下推发货通知单为例进行详细介绍,通过转换规则配置附件下推以及通过插件代码完成对源单附件字段的反写,相信通过此番操作以上问题定能迎刃而解,那让我们一起来看下具体如何实现的吧。
一、业务背景
业务现状
XX集团中的销售业务人员在处理销售订单时,经常会遇到如下场景,销售订单在下推时希望所携带的物料附件能带到发货通知单的物料信息中,以便快捷传递物料详细信息。
客户痛点分析
目标单和源单的附件信息目前无法保持一致,客户查看目标单附件时无法获取源单附件内容。
客户诉求与期望
在下游单据审核时,不仅需要查看上游单据的附件,而且下游单据还需要修改关联附件,且更新回源单,保持源单和目标单附件信息一致。
二、解决方案
整体实现思路
单据附件字段下推功能可通过配置转换规则进行实现;设计编写反写插件,在目标单审核后使用目标单附件字段对源单附件字段进行反写。
以上是整体思路,适用于多种业务场景,此次以销售订单下推生成发货通知单为例,进行介绍说明,关键操作步骤如下。
关键步骤
步骤1
扩展单据
路径:开发者门户 → 销售管理 → 销售订单
扩展【销售订单】,在明细分录中新增扩展字段【附件】;扩展【发货通知单】,在明细分录中新增扩展字段【附件】(附件字段需输入表名)。
步骤2
扩展销售订单_发货通知单转换规则,配置附件的字段映射。
路径:开发服务云 → 业务流开发 → 转换规则
步骤3
注册发货通知单分录附件审核反写操作插件到审核按钮上,代码通过目标单分录中记录的【源单分录ID】去查询源单,所以目标单分录需存在该字段,操作插件核心代码如下(插件源码可在附件下载):
/** 源单标识 */
private static final String SRCENTITY = "sm_salorder";
/** 附件字段标识 */
private static final String ATTACHMENT = "anmi_attachment";
DynamicObject[] dataEntities = e.getDataEntities();
// 保存源单分录行和目标单分录附件映射集合
Map<Long, DynamicObjectCollection> srcEntryIdAttachmentMap = new HashMap<>(16);
for (DynamicObject targetBill : dataEntities) {
DynamicObjectCollection billEntry = targetBill.getDynamicObjectCollection("billentry");
for (DynamicObject targetRow : billEntry) {
long srcEntryId = targetRow.getLong("srcbillentryid");
DynamicObjectCollection attachment = targetRow.getDynamicObjectCollection(ATTACHMENT);
srcEntryIdAttachmentMap.put(srcEntryId, attachment);
}
}
String select = "billentry.id,billentry." + ATTACHMENT;
QFilter filter = new QFilter("billentry.id", QCP.in, srcEntryIdAttachmentMap.keySet());
DynamicObject[] srcBills = BusinessDataServiceHelper.load(SRCENTITY, select, new QFilter[]{filter});
for (DynamicObject srcBill : srcBills) {
DynamicObjectCollection billEntry = srcBill.getDynamicObjectCollection("billentry");
for (DynamicObject entryRow : billEntry) {
DynamicObjectCollection srcAttachments = entryRow.getDynamicObjectCollection(ATTACHMENT);
// 先清空源单附件字段值
srcAttachments.clear();
// 添加目标单附件内容
long entryId = entryRow.getLong("id");
DynamicObjectCollection targetAttachments = srcEntryIdAttachmentMap.get(entryId);
for (DynamicObject targetAttachment : targetAttachments) {
srcAttachments.addNew().set("fbasedataid", targetAttachment.get("fbasedataid"));
}
entryRow.set(ATTACHMENT, srcAttachments);
}
}
SaveServiceHelper.save(srcBills);
实现后效果展示(视频)
三、方案的可推广价值
目前已有多家客户提出源单和目标单的附件要保持同步的需求,包括源单下推目标单同步附件字段内容以及目标单修改附件字段审核反写源单附件字段两方面。
本案例的价值在于介绍如何利用转换规则配置附件下推以及如何通过苍穹插件代码完成对源单附件字段的反写,方便快捷帮助客户实现了如上需求。
四、相关资料
附源码包,供下载参考学习。
源码包.zip
附:案例评论有奖活动
我们将每月挑选优质案例评论发放精美奖品,以下形式的评论中奖概率更高哟:
1、分享案例给您带来的启发:这个案例为您当前、进行中或即将开展的项目带来了哪些启发?若您成功将案例中的策略或方法应用到实际项目中,可在评论区分享您的具体应用情况,我们将为您准备额外的奖励。
2、提出案例优化的建议:您认为案例在哪些方面还有改进的空间?您有哪些更好的替代方案或建议?
期待您的案例留言,您的反馈是我们前进的动力~