本文介绍了在采购申请到采购订单转换过程中,因物料编码和交货日期设置不当导致的数量合并问题,并提供了两种解决方案。问题是在合并相同物料但交货日期不同的采购申请时,生成的采购订单交货安排数量错误。解决方案包括在单据转换的表单服务策略中删除并新增服务规则,以及使用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脚本,没有开发资源的可直接用这个,在订单的表单插件“注册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);
index = 0;
while( index < entryList.Count):
deliPlanRowNum =0;
qty = Convert.ToDecimal(entryList[index]["qty"]);
baseQty = Convert.ToDecimal(entryList[index]["BaseUnitQty"]);
orderEntryPlanList = entryList[index]["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;
index+=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();
推荐阅读