文本描述了在使用ERP系统(如金蝶K3)时遇到的一个问题及其解决方案。问题描述了在采购申请转换为采购订单时,当相同物料在不同交货日期下数量被合并下推后,采购订单交货安排数量出现错误,需要人工修改。客户需求是保持明细信息总数量不变,同时在交货安排中正确显示各个交货日期的具体数量。 解决方案包括两部分:一是在系统的“表单服务策略”中删除和新增特定服务规则;二是通过开发插件(C#或Python脚本)自动调整交货计划的数量,确保其与采购订单明细中的数量一致。两种插件实现方法提供了具体代码示例,展示了如何在单据转换或表单数据绑定时动态调整交货计划的数量。
收到不少类似以下采购申请单物料合并下推采购订单的提单,现分享一个解决方案。
问题:
在采购申请到采购订单的单据转换分组策略那里,单据体设置的按物料编码,子单据体设置的是物料编码和到货日期。然后采购申请上两个相同的物料,数量是10和20,一个交货日期是10月17号,一个是10月19号,下推生成采购订单后,在交货安排那里出现两行,一行是10月17号,数量30,一行是10月19号,数量30。这样不能保存(30!=30+30),需要人工去修改数量。
客户的需求是需要在明细信息出现一行,数量为30,在交货安排出现两行,但是一个数量是10,一个是20。
解决方案:
1,在采购申请到采购订单的单据转换"表单服务策略"里删除以下三个服务规则:
2,同样在"表单服务策略"新增一条服务规则:计算交货计划的数量(基本单位)和剩余数量(基本单位)
3,由于在申请单物料和交货日期相同时合并下推订单,会出现交货计划的数量不对的情况,这里需要用插件处理。现提供两种实现方法。
a,C#单据转换插件,注册到采购申请到采购订单的转换规则。
using System;
using System.Linq;
using Kingdee.BOS.Core;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn;
namespace XXX.K3.SCM.App.Pur.ServicePlugIn
{
public class ReqToOrderService : AbstractConvertPlugIn
{
public override void AfterConvert(Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args.AfterConvertEventArgs e)
{
ExtendedDataEntity[] entrys = e.Result.FindByEntityKey("FPOOrderEntry");
if (entrys == null)
{
return;
}
foreach (ExtendedDataEntity entry in entrys)
{
decimal qty = Convert.ToDecimal(entry["qty"]);
decimal baseQty = Convert.ToDecimal(entry["BaseUnitQty"]);
DynamicObjectCollection deliPlan = entry["POOrderEntryDeliPlan"] as DynamicObjectCollection;
long deliPlanRowNum = deliPlan != null ? deliPlan.Count() : 0;
if (deliPlanRowNum == 1)
{
decimal planQty = Convert.ToDecimal(deliPlan[0]["PlanQty"]);
if (qty != planQty)
{ //交货明细只有一行且数量不对时,直接用明细数量赋值
deliPlan[0]["PlanQty"] = qty;
deliPlan[0]["DeliRemainQty"] = qty;
deliPlan[0]["BasePlanQty"] = qty;
deliPlan[0]["BaseDeliRemainQty"] = qty;
}
}
}
base.AfterConvert(e);
}
}
}
b,python脚本,在订单的表单插件注册。
import clr
clr.AddReference('System')
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.Core')
clr.AddReference('Kingdee.BOS.DataEntity')
from System import *
from Kingdee.BOS import *
from Kingdee.BOS.Core.Metadata.EntityElement import *
from Kingdee.BOS.Orm.DataEntity import *
from Kingdee.BOS.Core.DynamicForm.PlugIn import *
from Kingdee.BOS.Core import *
def SetPlanQty():
entryEntity = this.View.BusinessInfo.GetEntity("FPOOrderEntry");
entryList = this.View.Model.GetEntityDataObject(entryEntity);
i = 0;
while( i < entryList.Count):
deliPlanRowNum =0;
qty = Convert.ToDecimal(entryList["qty"]);
baseQty = Convert.ToDecimal(entryList["BaseUnitQty"]);
OrderEntryPlanList = entryList["POOrderEntryDeliPlan"];
if OrderEntryPlanList != None:
deliPlanRowNum=OrderEntryPlanList.Count;
if (deliPlanRowNum == 1):
planQty = Convert.ToDecimal(OrderEntryPlanList[0]["PlanQty"]);
if (qty != planQty):
#交货明细只有一行且数量不对时,直接用明细数量赋值
OrderEntryPlanList[0]["PlanQty"] = qty;
OrderEntryPlanList[0]["DeliRemainQty"] = qty;
OrderEntryPlanList[0]["BasePlanQty"] = baseQty;
OrderEntryPlanList[0]["BaseDeliRemainQty"] = baseQty;
i+=1;
def AfterBindData(e):
if (this.View.OpenParameter.Status == OperationStatus.ADDNEW and (this.View.OpenParameter.CreateFrom == CreateFrom.Draw or this.View.OpenParameter.CreateFrom == CreateFrom.Push)):
if (Convert.ToString(this.View.Model.GetValue("FSrcBillTypeId", 0))=="PUR_Requisition"):
#下推或选单且源单是申请单
SetPlanQty();