
## 【应用场景】
客户希望在生管平台执行齐套分析运算完毕后,在标准产品的分析结果基础上追加客户化处理。例如:1)分析完毕后可不经确认更新参与分析订单的用料清单使用比例。2)希望在分析完毕后,按照当前订单的子项齐套情况计算出齐套率。
## 【二开方案详解】
### 适用版本
金蝶云星空企业版20240229补丁版本,补丁版本号:PT-156001 [8.2.0.20240229]
### 插件触发时机介绍
1.【生管平台】打开【生管平台分析】选择【直接运算】发起的生管齐套分析运算。
2.【生管平台分析】按【调度计算】方式创建的定时任务在【执行计划列表】中被轮询执行时。
### 触发方式
- 在结束所有运算逻辑后到将运算的齐套结论反写至生产订单或委外订单前,程序将会发起调用一次【生管齐套分析记录日志】的保存操作。该次保存操作支持注册操作插件。因此可以通过下图对应业务对象的操作插件中注册对应的程序集加入二开保存插件,即可在完成分析时插入二开代码。
- 只有运算成功才会触发此次保存,运算失败的任务将不触发逻辑。

### 可以获取到的数据
可以根据下文的示例代码获取本次运算后的运算结果,包含下述内容:
- 运算日志本身,包含关联的方案,运算的组织范围等参数。
- 运算过程中产生的生管齐套分析子项明细日志记录。
- 运算产生的生管齐套分析的预计入明细记录。
### 概要示例代码
``` csharp
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.SqlBuilder;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.K3.Core.MFG.EntityHelper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SampleV9._0
{
public class PMMatchLogSave : AbstractOperationServicePlugIn
{
public override void EndOperationTransaction(EndOperationTransactionArgs e)
{
DynamicObject matchAnalyseLog = e.DataEntitys[0];//当下分析完毕后的生管平台分析日志
if(matchAnalyseLog.GetDynamicValue<bool>("FCheckBox_qtr"))
{//如果已经标记处理过则不再触发此插件的逻辑,可选
return;
}
matchAnalyseLog.SetDynamicObjectItemValue("FCheckBox_qtr", true);//标记已处理,防止重复触发插件逻辑,可选
#region 参与分析的订单明细集合
DynamicObjectCollection orderEntrys = matchAnalyseLog.GetDynamicValue<DynamicObjectCollection>("Entity");
#endregion 参与分析的订单明细集合
#region 获取生管齐套分析子项明细日志集合
string fid = matchAnalyseLog.GetDynamicValue<string>("Id");
string fbillno = matchAnalyseLog.GetDynamicValue<string>("BillNo");
var matchItemMeta = MetaDataServiceHelper.Load(this.Context, "PRD_PMMatchDetailLog") as FormMetadata;
var qp = new QueryBuilderParemeter()
{
FormId = "PRD_PMMatchDetailLog",
};
qp.FilterClauseWihtKey = string.Format("FID='{0}'", fid);
qp.SelectItems = SelectorItemInfo.CreateItems("FENTRYID");
var matchItems = BusinessDataServiceHelper.Load(this.Context, matchItemMeta.BusinessInfo.GetDynamicObjectType(), qp);
//var result = BusinessDataServiceHelper.Save(this.Context, matchItems);//保存修正后的子项明细,有必要的情况下选择调用此行代码
//其中,使用orderEntrys中的选单类型SelOrderType+订单内码MOID+订单分录内码MoEntryId可以在matchItems集合中查找到对应订单参与分析的用料清单
//子项明细
#endregion 获取生管齐套分析子项明细日志集合
#region 生管齐套分析预计入分配明细
var matchPreDetailMeta = MetaDataServiceHelper.Load(this.Context, "PRD_PMMatchPreInvDetail") as FormMetadata;
var preQp = new QueryBuilderParemeter()
{
FormId = "PRD_PMMatchPreInvDetail",
};
preQp.FilterClauseWihtKey = string.Format("FBillNo='{0}'", fbillno);
preQp.SelectItems = SelectorItemInfo.CreateItems("FDETAILID");
var matchPreDetailItems = BusinessDataServiceHelper.Load(this.Context, matchPreDetailMeta.BusinessInfo.GetDynamicObjectType(), preQp);
//var result = BusinessDataServiceHelper.Save(this.Context, matchItems);//保存修正后的预计入分配明细,有必要的情况下选择调用此行代码
//其中,使用matchItems中的Id属性,可以在matchPreDetailItems根据FPMMatchItemId属性筛选出对应用料清单分析子项中的预计入分配明细
#endregion 生管齐套分析预计入分配明细
}
}
}
```
### 注意事项
1.该方案理论上支持python插件,但不提倡使用(调试困难),建议在有健全的代码版本管理的基础上完成此开发,并做好二开处理的留痕和日志管理。
2.目前未能提供运算过程中参与运算的所有供应数据,待后续版本持续优化后再放出。