
#### 需求描述
1.某些类型的销售订单不走销售出库,因此下推生产订单入库后的预留关系不会被自动释放。
2.生产订单可以供应给其他需求单。
因此,在该类型的销售订单下推生产订单时,释放其与生产订单的预留关系,并保留生产订单下级的预留关系。
#### 实现思路
生产订单保存时,判定当前的生产订单作为供应的预留关系是否存在销售订单作为需求的预留关系,如果存在则获取生产订单的单据ID与分录ID批量释放预留,仅释放生产订单作为供应的预留关系。
1.二开锚点:生产订单保存操作插件
2.二开重写事件:AbstractOperationServicePlugIn
#### 参考插件
```csharp
using Kingdee.BOS;
using Kingdee.BOS.Core.BusinessFlow.ReserveLogic;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using Kingdee.K3.Core.MFG;
using Kingdee.K3.Core.MFG.EnumConst;
using Kingdee.K3.Core.MFG.PLN.Reserved;
using Kingdee.K3.Core.MFG.PLN.Reserved.ReserveArgs;
using Kingdee.K3.MFG.App;
using Kingdee.K3.MFG.Common.BusinessEntity.PLN;
using Kingdee.K3.MFG.Contracts.PLN.Reserve;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace SampleAppPlugIn
{
[Description("生产订单释放预留")]
public class MOSaveReleaseReserveLink : AbstractOperationServicePlugIn
{
public override void AfterExecuteOperationTransaction(AfterExecuteOperationTransaction e)
{
List<OriBillInfo> lstFinishCloseRows = new List<OriBillInfo>();
var releaseDatas = GetReleseDatas(this.Context, e.DataEntitys.Select(x => Convert.ToInt64(x["Id"])).ToList());
if (!releaseDatas.IsEmpty())
{
//删除预留关系中该分录作为供应的分录,不删除相关需求的预留关系(并删除预留关系的转换日志,否则在重复保存时无法重新生成预留关系)
ReserveArgs<ReleaseRowInfo> releaseArgs = new ReserveArgs<ReleaseRowInfo>();
releaseArgs.SelectRows = (from p in releaseDatas
select new ReleaseRowInfo
(
"PRD_MO",
Convert.ToString(p["FSUPPLYINTERID"]),
Convert.ToString(p["FSUPPLYENTRYID"]),
"FTreeEnt