一、计划生成方式:
1、根据客户的需求限制具体的计划生成方式来物料明细1对1生成计划明细。涉及按订单,按物料,按到期日,也可以所有的情况下都时1对1,根据实际场景做限制。
2、生成计划的思路,循环物料明细每一行明细增加一行计划,取明细的物料信息赋值计划对应的字段。
3、将2中生成的计划数据包更新到model中或者直接数据库赋值,数据库赋值需要注意生成主键(fentryid)不太建议。
二、涉及计划重算触发点:
1、单据转换下推生成,需要在对应的单据转换的插件策略中加上自己写的插件,插件时继承单据转换基类,然后重写afterConvert事件,实现计划生成逻辑。
2、表单插件中值更新触发,自己编码写表单插件,继承表单插件基类,重写DataChange事件,在跟计划关联的字段值更新时掉用生成计划逻辑。
3、也可以直接忽视12两个步骤,直接在保存操作里修改对应数据包,这个实现方式,值更新或者下推生成的单据初始计划是标准产品的逻辑生成的,只在保存后重新打开单据可以看到二开逻辑覆盖后的计划数据。
三、计划报错校验:
1、去掉“到期日必须从小到大,并且不重复”:
https://vip.kingdee.com/article/408635073186111488?productLineId=1
2、去掉“分组汇总比例不为100%”保存校验:保存操作中注册python脚本反注册:PlanRatioValidator
def OnAddValidators(e):
target = -1
index = -1
for item in e.Validators:
index = index + 1
if str(item).find('PlanRatioValidator') > 0:
target = index
if target > -1:
e.Validators.RemoveAt(target);
四、已有类似的Python二开案例代码:
#携带应收单明细的自定义字段(产品、项目等信息到收款计划)
import clr
clr.AddReference('System')
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.Core')
clr.AddReference('Kingdee.BOS.DataEntity')
from System import *
from System.Collections.Generic import *
from Kingdee.BOS.Core.Bill.PlugIn import *
from Kingdee.BOS.Core.DynamicForm import *
from Kingdee.BOS.Orm.DataEntity import *
from Kingdee.BOS.Core.DynamicForm.PlugIn.Args import *
from Kingdee.BOS.Util import*
from Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel import *
from System import DateTime
def CreatePlanData():
entryDC = this.View.Model.DataObject["AP_PAYABLEENTRY"]
this.View.Model.DeleteEntryData("FEntityPlan")
dt=DateTime.Parse(str(this.Model.GetValue("FDATE")))
ct=entryDC.Count
for i in range(0,ct):
this.Model.CreateNewEntryRow("FEntityPlan")
#到期日
this.View.Model.SetValue("FENDDATE",str(dt.AddDays(i)), i)
#this.View.Model.SetValue("FENDDATE",this.Model.GetValue("FDATE"), i)
#应付比例
this.View.Model.SetValue("FPAYRATE", 100, i)
#应付金额
this.View.Model.SetValue("FPayAmountFor", this.Model.GetValue("FALLAMOUNTFOR_D",i), i)
#应付金额本位币
this.View.Model.SetValue("FPayAmount", this.Model.GetValue("FALLAMOUNTFOR_D",i), i)
#不含税金额
this.View.Model.SetValue("F_ora_Amount", this.Model.GetValue("FNoTaxAmountFor_D",i), i)
#税额
this.View.Model.SetValue("F_ora_Amount1", this.Model.GetValue("FTAXAMOUNTFOR_D",i), i)
#税率
this.View.Model.SetValue("F_ora_Decimal", this.Model.GetValue("FEntryTaxRate",i), i)
#价税合计
this.View.Model.SetValue("F_ora_Amount2", this.Model.GetValue("FALLAMOUNTFOR_D",i), i)
#项目
this.View.Model.SetValue("F_ora_Assistant", this.Model.GetValue("F_PAEZ_xm",i), i)
#产品
this.View.Model.SetValue("F_ora_Assistant1", this.Model.GetValue("F_PAEZ_cp",i), i)
#城市
this.View.Model.SetValue("F_ora_Assistant2", this.Model.GetValue("F_PAEZ_CS",i), i)
#区域
this.View.Model.SetValue("F_ora_Assistant3", this.Model.GetValue("F_PAEZ_QY",i), i)
#发票类型
this.View.Model.SetValue("F_ora_Combo", this.Model.GetValue("F_PAEZ_FPLX",i), i)
#备注
this.View.Model.SetValue("F_ora_Text", this.Model.GetValue("FComment",i), i)
this.View.UpdateView("FEntityPlan")
def DataChanged(e):
if e.Field.Key.Equals("FALLAMOUNTFOR", StringComparison.OrdinalIgnoreCase):
CreatePlanData()
elif e.Field.Key.Equals("F_PAEZ_xm", StringComparison.OrdinalIgnoreCase):
CreatePlanData()
elif e.Field.Key.Equals("F_PAEZ_cp", StringComparison.OrdinalIgnoreCase):
CreatePlanData()
elif e.Field.Key.Equals("F_PAEZ_CS", StringComparison.OrdinalIgnoreCase):
CreatePlanData()
elif e.Field.Key.Equals("F_PAEZ_QY", StringComparison.OrdinalIgnoreCase):
CreatePlanData()
elif e.Field.Key.Equals("F_PAEZ_FPLX", StringComparison.OrdinalIgnoreCase):
CreatePlanData()
elif e.Field.Key.Equals("FComment", StringComparison.OrdinalIgnoreCase):
CreatePlanData()
def AfterCreateNewData(e):
CreatePlanData()
this.View.Model.BeginIniti()
this.View.Model.EndIniti()
如果用此脚本出现多出一行调差的值,就用上面两行代码把CreatePlanData方法中的for循环包起来
以上文档内容只做开发思路引导,不支持直接移植使用,需要有二开能力的研发根据以上思路自己实现具体的需求。
推荐阅读