【云星空】金蝶云星空应收应付计划按物料明细一比一生成计划原创
金蝶云社区-吃面
吃面
19人赞赏了该文章 998次浏览 未经作者许可,禁止转载编辑于2024年04月16日 15:40:53

一、计划生成方式:

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循环包起来

以上文档内容只做开发思路引导,不支持直接移植使用,需要有二开能力的研发根据以上思路自己实现具体的需求。

赞 19