【二次开发样例】生产齐套分析单第三方下推直接调拨单或调拨申请单实现样例
## 步骤
1.登入集成开发平台,打开单据转换主界面,按源单为【生产用料清单】,目标单为【直接调拨单】过滤,点击【添加】加一个规则,字段映射配置参考规则PRD_PPB2TRANSFERForMAA的设置。如果希望下推的目标单【调拨申请单】,则点击【新建】建立【生产用料清单】至【调拨申请单】的单据转换规则。
![1.webp](/download/01003a2f08d4383543d8ac32078ac5db87e9.webp)
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",
"FBaseWillTransQty",
"FWillTransQty"
),
FilterClauseWihtKey = "FID=@maid and FBaseWillTransQty > 0",
};
qp.ExtJoinTables.Add(new ExtJoinTableDescription
{
TableName = StringUtils.GetSqlWithCardinality(moids.Count, "@moids", 1, true),
TableNameAs = "ts",
FieldName = "FID",
ScourceKey = "FMoIdSub"
});
List<SqlParam> p = new List<SqlParam>{
new SqlParam("@moids",KDDbType.udt_inttable,moids.ToArray()),
new SqlParam("@maid",KDDbType.Int64,maid)
};
var ret = AppServiceContext.QueryService.GetDynamicObjectCollection(ctx, qp, p);
if (ret == null)
throw new Exception(string.Format(Kingdee.BOS.Resource.ResManager.LoadKDString("找不到齐套分析单{0}的运算结果", "015075000039187", Kingdee.BOS.Resource.SubSystemType.MFG), matchBill.GetDynamicValue<string>("BillNo")));
return ret;
}
static ConvertRuleElement GetConvertRule(Context ctx)
{
IConvertService convertService = AppServiceContext.ConvertService;
List<ConvertRuleElement> rules = convertService.GetConvertRules(ctx, MFGFormIdConst.SubSys_PRD.PPBOMBill, "STK_TransferDirect");
ConvertRuleElement rule = rules.Where(e => e.Id.Equals(convertRuleId)).FirstOrDefault();
if (rule == null)
throw new Exception(string.Format(Kingdee.BOS.Resource.ResManager.LoadKDString("找不到名为{0}的转换规则", "015075000039188", Kingdee.BOS.Resource.SubSystemType.MFG), convertRuleId));
return rule;
}
static IOperationResult SaveTargetBills(Context ctx, ConvertOperationResult pushResult)
{
FormMetadata transBillMeta = AppServiceContext.MetadataService.Load(ctx, "STK_TransferDirect") as FormMetadata;
var option = OperateOption.Create();
//先暂存一次
var draftResult = AppServiceContext.GetService<IDraftService>().Draft(ctx, transBillMeta.BusinessInfo, pushResult.TargetDataEntities.Select(x => x.DataEntity).ToArray(), option, "Draft");
//暂存成功,则尝试保存一次
if (draftResult.IsSuccess)
{
option.AddInteractionFlag(K3.Core.SCM.SCMConst.MinusCheckSensor);
draftResult = AppServiceContext.SaveService.Save(ctx, transBillMeta.BusinessInfo, draftResult.SuccessDataEnity.ToArray(), option, "Save");
}
return draftResult;
}
}
}
```
### 单据转换插件
```csharp
using Kingdee.BOS;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Util;
using Kingdee.K3.Core.MFG.EntityHelper;
using Kingdee.K3.MFG.App;
using Kingdee.K3.MFG.App.ConvertPlugIn;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace Kingdee.K3.MFG.PRD.App.BillConvertServicePlugIn
{
[Description("齐套分析单下推直接调拨单")]
public class MA2TransferConvert : BaseBillConvertServicePlugIn
{
public override void OnQueryBuilderParemeter(BOS.Core.Metadata.ConvertElement.PlugIn.Args.QueryBuilderParemeterEventArgs e)
{
base.OnQueryBuilderParemeter(e);
e.SelectItems.Add(new BOS.Core.Metadata.SelectorItemInfo("FBaseTranslateQty"));
e.SelectItems.Add(new BOS.Core.Metadata.SelectorItemInfo("FTranslateQty"));
}
public override void OnGetSourceData(BOS.Core.Metadata.ConvertElement.PlugIn.Args.GetSourceDataEventArgs e)
{
base.OnGetSourceData(e);
UpdatePrepareMtrlQty(e.SourceData);
}
private void UpdatePrepareMtrlQty(DynamicObjectCollection sourceData)
{
var ppmPPBomDict = this.Option.GetVariableValue<DynamicObjectCollection>("MatchAnalyseData")
.GroupBy(x => Convert.ToInt64(x["FPPBomEntryId"])).ToDictionary(x => x.Key);
foreach (var ppbomEntry in sourceData)
{
long ppbomEntryId = Convert.ToInt64(ppbomEntry["FEntity_FEntryId"]);
IGrouping<long, DynamicObject> ppmPPBomEntry;
if (ppmPPBomDict.TryGetValue(ppbomEntryId, out ppmPPBomEntry))
{
ppbomEntry["FTranslateQty"] = ppmPPBomEntry.FirstOrDefault()["FWillTransQty"];
ppbomEntry["FBaseTranslateQty"] = ppmPPBomEntry.FirstOrDefault()["FBaseWillTransQty"];
}
}
}
}
}
```
相关知识参考资料:
https://vip.kingdee.com/article/111398356370671360
https://vip.kingdee.com/article/111145394893301504
【二次开发样例】生产齐套分析单第三方下推直接调拨单或调拨申请单实现样例
## 步骤1.登入集成开发平台,打开单据转换主界面,按源单为【生产用料清单】,目标单为【直接调拨单】过滤,点击【添加】加一个规则,字段...
点击下载文档
本文2024-09-23 03:18:31发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-158028.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章