
## 步骤
1.登入集成开发平台,打开单据转换主界面,按源单为【生产用料清单】,目标单为【直接调拨单】过滤,点击【添加】加一个规则,字段映射配置参考规则PRD_PPB2TRANSFERForMAA的设置。如果希望下推的目标单【调拨申请单】,则点击【新建】建立【生产用料清单】至【调拨申请单】的单据转换规则。

2.生产齐套分析单加入表单插件,通过出发菜单栏点击事件,调用TransferDirectBuilder.PushTransferDirect方法后台下推生成直接调拨单。注:变量【convertRuleId】是下推指定的转换规则,请完成步骤1的配置,将新加的转换规则的唯一标识替换变量的值。
3.在步骤1新加的转换规则的【插件策略】加入二开插件,处理下推后的调拨数量携带。如果希望下推【调拨申请单】,请按【调拨申请单】的单据模型修改对应的数量字段进行赋值。
### 样例代码——如何调用单据转换生成直接调拨单
```csharp
using Kingdee.BOS;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Orm;
using Kingdee.BOS.Orm.DataEntity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kingdee.K3.Core.MFG.EntityHelper;
using Kingdee.BOS.Core.SqlBuilder;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Util;
using Kingdee.K3.MFG.App;
using Kingdee.BOS.Core.Metadata.ConvertElement;
using Kingdee.BOS.Contracts;
using Kingdee.K3.Core.MFG;
using Kingdee.BOS.Core.DynamicForm.Operation;
using Kingdee.BOS.Core.Interaction;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.Core.Metadata.ConvertElement.ServiceArgs;
using Kingdee.BOS.Core.Const;
using Kingdee.K3.Core.MFG.EnumConst;
namespace Kingdee.K3.MFG.PRD.App.Core.Preparation.Match.PushTranferDirect
{
public class TransferDirectBuilder
{
const string convertRuleId = "PRD_PPB2TRANSFERForMAA";//指定的单据转换规则
public static void PushTransferDirect(Context ctx, DynamicObject matchBill, IOperationResult result, OperateOption extendOption)
{
try
{
var maDetails = GetMADetails(ctx, matchBill);
var ruleElement = GetConvertRule(ctx);
var billTypePolicyElement = ruleElement.Policies.Where(x => x is BillTypeMapPolicyElement).FirstOrDefault() as BillTypeMapPolicyElement;
var bte = billTypePolicyElement.BillTypeMaps.FirstOrDefault(x => x.SourceBillTypeId == "(All)");
List<ListSelectedRow> selectedRows = new List<ListSelectedRow>();
foreach (var maDetail in maDetails)
{
ListSelectedRow lsr = new ListSelectedRow(maDetail.GetDynamicValue<string>("FPPBomId"),
maDetail.GetDynamicValue<string>("FPPBomEntryId"), 0, MFGFormIdConst.SubSys_PRD.PPBOMBill);
lsr.EntryEntityKey = CONST_PRD_PPBOM.CONST_FEntity.ENTITY_FEntity;
selectedRows.Add(lsr);
}
if (selectedRows.IsEmpty())
{
throw new KDExceptionValidate("PRD_MatchAnalyseBill", Kingdee.BOS.Resource.ResManager.LoadKDString("下推直接调拨单失败", "015075000039189", Kingdee.BOS.Resource.SubSystemType.MFG), Kingdee.BOS.Resource.ResManager.LoadKDString("没有需要下推直接调拨单的用料清单行!", "015075000039190", Kingdee.BOS.Resource.SubSystemType.MFG));
}
PushArgs args = new PushArgs(ruleElement, selectedRows.ToArray());
args.TargetBillTypeId = bte.TargetBillTypeId;
OperateOption option = OperateOption.Create();
option.SetVariableValue(BOSConst.CST_ConvertValidatePermission, true);
option.SetVariableValue("MatchAnalyseData", maDetails);
option.SetVariableValue("PMBillNo", matchBill.GetDynamicValue<string>("BillNo"));
var pushResult = AppServiceContext.ConvertService.Push(ctx, args, option);
if (extendOption.GetVariableValue<string>("PushBillType", "0").EqualsIgnoreCase("1"))
{
result.FuncResult = pushResult.TargetDataEntities.Select(x => x.DataEntity).ToList();
return;
}
var saveResult = SaveTargetBills(ctx, pushResult);
if (!saveResult.IsSuccess)
{
saveResult.OperateResult.ToList().ForEach(result.OperateResult.Add);
saveResult.ValidationErrors.Select(errorInfo =>
{
var operateResult = new OperateResult()
{
Message = errorInfo.Message,
Name = errorInfo.Title,
MessageType = MessageType.FatalError,
SuccessStatus = false
};
return operateResult;
}).ToList().ForEach(result.OperateResult.Add);
result.IsSuccess = false;
result.OperateResult.Add(new OperateResult()
{
Message = Kingdee.BOS.Resource.ResManager.LoadKDString("下推单据保存失败,已暂存", "015075000039185", Kingdee.BOS.Resource.SubSystemType.MFG),
Name = Kingdee.BOS.Resource.ResManager.LoadKDString("直接调拨单", "015075000039191", Kingdee.BOS.Resource.SubSystemType.MFG),
MessageType = MessageType.FatalError,
SuccessStatus = false,
});
}
}
catch (KDExceptionValidate ev)
{
result.IsSuccess = false;
result.OperateResult.Add(new OperateResult()
{
Message = ev.ValidateString,
Name = Kingdee.BOS.Resource.ResManager.LoadKDString("直接调拨单", "015075000039191", Kingdee.BOS.Resource.SubSystemType.MFG),
MessageType = MessageType.FatalError,
SuccessStatus = false,
});
result.OperateResult.Add(new OperateResult()
{
Message = ev.Message,
Name = Kingdee.BOS.Resource.ResManager.LoadKDString("直接调拨单", "015075000039191", Kingdee.BOS.Resource.SubSystemType.MFG),
MessageType = MessageType.FatalError,
SuccessStatus = false,
});
}
}
static DynamicObjectCollection GetMADetails(Context ctx, DynamicObject matchBill)
{
//勾选分析并有
List<long> moids = (matchBill["Entity"] as DynamicObjectCollection).Where(x => x.GetDynamicValue<bool>("Selected") && x.GetDynamicValue<long>("MoId") > 0 && x.GetDynamicValue<string>("RowType") == "0").Select(x => x.GetDynamicValue<long>("MoId")).Distinct().ToList();
if (moids.IsEmpty())
{
throw new KDExceptionValidate("PRD_MatchAnalyseBill", Kingdee.BOS.Resource.ResManager.LoadKDString("下推直接调拨单失败", "015075000039189", Kingdee.BOS.Resource.SubSystemType.MFG), Kingdee.BOS.Resource.ResManager.LoadKDString("没有需要下推直接调拨单的用料清单行!", "015075000039190", Kingdee.BOS.Resource.SubSystemType.MFG));
}
long maid = matchBill.GetDynamicValue<long>("Id");
QueryBuilderParemeter qp = new QueryBuilderParemeter
{
FormId = "PRD_MATCHDETAIL",
SelectItems = SelectorItemInfo.CreateItems(
"FPPBomEntryId",
"FPPBomId",
"FBaseW