【二次开发样例】生产齐套分析单第三方下推直接调拨单或调拨申请单实现样例

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

【二次开发样例】生产齐套分析单第三方下推直接调拨单或调拨申请单实现样例

## 步骤 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.登入集成开发平台,打开单据转换主界面,按源单为【生产用料清单】,目标单为【直接调拨单】过滤,点击【添加】加一个规则,字段...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息