问题描述:

解决方案:


二开一个表单插件,重新BarItemClick事件,弹出一个动态表单,然后获取动态表单的返回值写回当前界面,代码实例如下:
DynamicFormShowParameter ShowPara = new DynamicFormShowParameter();
            ShowPara.OpenStyle.ShowType = ShowType.Modal;
            ShowPara.FormId = "动态表单的单据标知";
this.View.ShowForm(ShowPara, result =>
            {
                if (result.ReturnData.IsNullOrEmpty()) return; //回调的结果值
}


作者:燕麦片

来源:金蝶云社区

原文链接:https://vip.kingdee.com/knowledge/259027687426252032?productLineId=1&isKnowledge=2&lang=zh-CN

著作权归作者所有。未经允许禁止转载,如需转载请联系作者获得授权。


背景

    需要在A单据中弹出B窗口,同时将某参数传递到B窗口中。


参考示例

    弹出动态表单

        DynamicFormShowParameter para = new DynamicFormShowParameter();         para.FormId = formId; //弹出的单据标识         para.Caption = caption; //标题         para.ParentPageId = this.View.PageId;//父页面         para.OpenStyle.ShowType = ShowType.MainNewTabPage; //弹出方式         para.PageId = Guid.NewGuid().ToString();//页面标识,随机GUID即可                  para.CustomComplexParams.Add(param.Key, param.Value); //添加自定义参数                  this.View.ShowForm(para);


    弹出列表单据


        ListShowParameter para = new ListShowParameter();         para.FormId = formId;         para.ParentPageId = this.View.PageId;         para.OpenStyle.ShowType = ShowType.MainNewTabPage;         para.PageId = Guid.NewGuid().ToString();         para.IsShowFilter = false;         if (!filterShemeId.IsNullOrEmptyOrWhiteSpace())             para.FilterSchemeId = filterShemeId;//增加过滤方案         if (!filter.IsNullOrEmptyOrWhiteSpace())             para.ListFilterParameter.Filter += " and 1=1 ";//增加过滤条件                  this.View.ShowForm(para);


    接收参数示例:

    var customParams_dict = this.View.OpenParameter.GetCustomParameters();                 if (customParams_dict != null && customParams_dict.ContainsKey("参数标识"))           //customParams_dict["参数标识"] //取值


引用组件

    Kingdee.BOS.Core.dll


作者:插秧小能手

来源:金蝶云社区

原文链接:https://vip.kingdee.com/knowledge/535155748502553088?productLineId=1&isKnowledge=2&lang=zh-CN

著作权归作者所有。未经允许禁止转载,如需转载请联系作者获得授权。


中年男人和大型SUV的关系,说白了就是”责任感”遇上了”安全感”,再加点”面子工程”。 前两天和几个哥们儿聚会,5个人开了4台SUV,清一色都是中大型,我开玩笑说:”咱们这是SUV车主联谊会啊?”结果大家都笑了,然后开始认真讨论起这8台”让中年男人无法拒绝”的大家伙。


!

图片

心理分析:为什么偏偏是大型SUV?


说实话,中年男人选车和年轻时候完全是两个逻辑。20多岁图帅气,30多岁看实用,40岁以后?安全、面子、责任感,一个都不能少。


前阵子我哥们换车,老婆怀二胎,原来那台轿车瞬间不够用了。试驾完一圈下来,直接锁定大型SUV:”坐得高看得远,撞了也不吃亏,后排空间大,丈母娘来了也不挤。”这话虽然粗糙,但道理很实在。


第一梯队:德系三剑客的”中年危机解药”


奔驰GLS、宝马X7、奥迪Q7,这三台车几乎承包了所有中年成功男士的”梦想清单”。开着这些车去接娃,家长群里的地位瞬间不一样,连老师都会多看你两眼。


特别是奔驰GLS,那个气场真不是盖的。朋友说:”开这车去4S店保养,技师的态度都比开轿车时候好三分。”虽然听着像玩笑,但现实就是这么魔幻。


!

图片

第二梯队:美系硬汉的”真男人情结”


凯迪拉克凯雷德、林肯领航员,这俩货就是为了满足中年男人心里那点”硬汉情节”而生的。6.2L V8、空气悬挂、一脚油门下去轰鸣声能让隔壁小区都听见,这就是纯爷们儿该开的车。


我一个做工程的朋友,开着凯雷德去工地,工人们都说:”老板这车真霸气!”面子这东西,有时候比配置表更重要。


第三梯队:日系可靠的”省心之选”


雷克萨斯LX、丰田陆地巡洋舰、英菲尼迪QX80,日系大型SUV的逻辑很简单:买得起,养得起,开不坏。 中年人最怕的就是车子三天两头进修理厂,耽误接娃送娃,老婆埋怨,领导白眼。


特别是陆巡,虽然油耗感人,但那个可靠性是真没话说。有朋友开了8年,除了正常保养,啥毛病没出过,这在中年男人心里就是”定心丸”。


!

图片

新势力搅局:理想L9的”奶爸专属”


要说最近两年最火的大型SUV,理想L9绝对算一个。六座布局、冰箱彩电大沙发,简直就是为中年奶爸量身定制的移动客厅。


试驾过的朋友都说:”这车开起来像在家里一样舒服,娃在后排看动画片,老婆可以化妆,我负责开车就行。”虽然没有传统豪车的那种”贵气”,但实用性和科技感确实拉满了。


最可惜的停产车:三菱帕杰罗V97


说到停产可惜,三菱帕杰罗V97绝对是中年男人心中的”白月光”。非承载式车身、超选四驱、3.8L V6,这些配置放在现在,简直就是”绝版收藏品”。


!

图片

我有个朋友至今还开着一台2019年的V97,每次聚会都有人问他卖不卖。他总是摇头:”这车停产了,卖了就再也买不到了。”这种情怀,只有真正懂车的中年男人才能理解。


现实考量:面子与里子的平衡


当然,中年男人选车也不全是情怀和面子,更多时候是现实需求的妥协。 空间要大、安全性要高、维修要方便、保值率要好,这些都是硬指标。


有朋友开玩笑说:”年轻时候想要跑车,中年以后只想要’跑得了车’。”这话虽然自嘲,但确实说出了很多人的心声。


用车场景:从诗和远方到柴米油盐


大型SUV对中年男人来说,更像是生活的”万能工具”。平时接送娃上学,周末全家自驾游,过年回老家拉行李,偶尔还得客串一下”搬家车”。


!

图片

朋友圈里经常看到哥们儿发照片:后备箱塞满了年货,车顶绑着行李箱,一家老小挤在车里笑得特别开心。这种时候,什么品牌、什么配置都不重要了,重要的是这台车能承载起一家人的幸福。


结语:选择背后的人生哲学


所以说,中年男人爱大型SUV,本质上是在为自己的人生阶段选择一个合适的”伙伴”。它不仅仅是代步工具,更是责任感、安全感、成就感的综合体现。


你家里有没有这样一台”大家伙”?或者正在纠结要不要入手?评论区聊聊,说不定下次聚会就能组个”SUV天团”了!


创建接口

1、新建类库,此处类库名为WebApiService,添加引用如图所示
153009c28b43462e97ec74854eee73e8.png
2、代码具体实现如下:

  • 增加调用bom展开传入参数model类

 public class BomExpandParam {     ///      /// 需求日期     ///      public DateTime ValidDate { get; set; }     ///      /// bomID     ///      public List<long> BomIds { get; set; }     ///      /// 需求数量     ///      public decimal Qty { get; set; }     ///      /// BOM展开层级数,默认只展开一层 0表示全部展开     ///      public int ExpandLevel { get; set; }     ///是否考虑替代方案:默认不考虑,是否考虑替代:默认不考虑     public bool IsShowSubMtrl { get; set; }     ///      /// 是否展开替代料:默认不考虑     ///      public bool IsExpandSubMtrl { get; set; }     ///      /// 是否隐藏外购BOM:默认考虑     ///      public bool IsHideOutSourceBOM { get; set; } }

  • 增加一个类GetBomExpandService,继承AbstractWebApiBusinessService

using Kingdee.BOS; using Kingdee.BOS.Core.Metadata; using Kingdee.BOS.Core.SqlBuilder; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.ServiceFacade.KDServiceFx; using Kingdee.BOS.ServiceHelper; using Kingdee.BOS.Util; using Kingdee.BOS.WebApi.ServicesStub; using Kingdee.K3.BD.ServiceHelper; using Kingdee.K3.Core.BD; using Kingdee.K3.Core.BD.ServiceArgs; using Kingdee.K3.Core.MFG.ENG.BomExpand; using Kingdee.K3.Core.MFG.ENG.ParamOption; using Kingdee.K3.Core.MFG.EntityHelper; using Kingdee.K3.MFG.ServiceHelper.ENG; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WebApiService {     public class GetBomExpandService : AbstractWebApiBusinessService     {         protected MemBomExpandOption_ForPSV memBomExpandOption = null;         public GetBomExpandService(KDServiceContext context) : base(context)         {         }         ///          /// 传入的数据         ///          /// <param name="info">包含 需求日期  bomID</param>         /// <returns></returns>         public JObject ExecuteService(string info)         {             JObject result = new JObject();             var param = JsonConvert.DeserializeObject<BomExpandParam>(info);             var memBomExpandOption = UpdateBomQueryOption(param);             List<DynamicObject> lstExpandSource = this.BuildBomExpandSourceData(param);             if (lstExpandSource.IsEmpty())             {                 result.Add("Status", "False");                 result.Add("Message", "当前物料对应的BOM不存在,请确认!");                 return result;             }             var queryDatas = GetBomChildData(lstExpandSource, memBomExpandOption);             result.Add("Status", "Success");             result.Add("Data", queryDatas.IsEmpty() ? "" : JsonConvert.SerializeObject(queryDatas));             result.Add("Message", "查询成功");             return result;         } ///          /// 构建bom查询参数         ///          /// <param name="bomExpandParam"></param>         /// <returns></returns>         private MemBomExpandOption_ForPSV UpdateBomQueryOption(BomExpandParam bomExpandParam)         {             MemBomExpandOption_ForPSV memBomExpandOption = new MemBomExpandOption_ForPSV();             //设置BOM展开到几层             memBomExpandOption.ExpandLevelTo = bomExpandParam.ExpandLevel;             DateTime? dtValidDate = bomExpandParam.ValidDate;             if (dtValidDate != null && dtValidDate >= new DateTime(1900, 01, 01))             {                 memBomExpandOption.ValidDate = (DateTime)dtValidDate;             }             //获取工程数据参数             memBomExpandOption.BomExpandCalType = Kingdee.K3.Core.MFG.EnumConst.Enums.Enu_BomExpandCalType.kdBySystemProfile;             memBomExpandOption.CsdSubstitution = bomExpandParam.IsShowSubMtrl;             memBomExpandOption.IsExpandSubMtrl = bomExpandParam.IsExpandSubMtrl;             memBomExpandOption.IsHideOutSourceBOM = bomExpandParam.IsHideOutSourceBOM;             return memBomExpandOption;         } ///          /// 构建bom展开的源数据         ///          /// <param name="bomIds"></param>         /// <returns></returns>         private List<DynamicObject> BuildBomExpandSourceData(BomExpandParam bomExpandParam)         {             List<DynamicObject> lstExpandSource = new List<DynamicObject>();             QueryBuilderParemeter batchParam = new QueryBuilderParemeter             {                 FormId = "ENG_BOM",                 SelectItems = SelectorItemInfo.CreateItems("FID", "FMaterialId.FMASTERID as MaterialMasterId",                 "FMATERIALID", "FUseOrgId", "FUNITID", "FBaseUnitId", "FParentAuxPropId"),             };             batchParam.ExtJoinTables.Add(new ExtJoinTableDescription             {                 FieldName = "FID",                 TableName = "table(fn_StrSplit(@ids,',',1))",                 TableNameAs = "ts",                 ScourceKey = "FID",             });             List<SqlParam> sqlParam = new List<SqlParam> {                 new SqlParam("@ids",KDDbType.udt_inttable,bomExpandParam.BomIds.Distinct().ToArray()),             };             DynamicObjectCollection bomHeadObjs = QueryServiceHelper.GetDynamicObjectCollection(this.KDContext.Session.AppContext, batchParam, sqlParam);             Dictionary<Int64, DynamicObject> dctBomHeadObjs = bomHeadObjs.ToDictionary(x => Convert.ToInt64(x["FID"])); List<GetUnitConvertRateArgs> converRateArgs = new List<GetUnitConvertRateArgs>();             foreach (DynamicObject bomHeadObj in bomHeadObjs)             {                 long materialId = Convert.ToInt64(bomHeadObj["FMATERIALID"]);                 long masterId = Convert.ToInt64(bomHeadObj["MaterialMasterId"]);                 long unitId = Convert.ToInt64(bomHeadObj["FUNITID"]);                 long baseUnitId = Convert.ToInt64(bomHeadObj["FBaseUnitId"]);                 long supplyOrgId = Convert.ToInt64(bomHeadObj["FUseOrgId"]);                 //此处要对数量进行换算:不能直接传常用单位数量                 converRateArgs.Add(new GetUnitConvertRateArgs()                 {                     PrimaryKey = bomHeadObjs.IndexOf(bomHeadObj),                     MaterialId = materialId,                     MasterId = masterId,                     SourceUnitId = unitId,                     DestUnitId = baseUnitId                 });             }             Dictionary<long, UnitConvert> dctUnitConvert = UnitConvertServiceHelper.GetUnitConvertRateList(this.KDContext.Session.AppContext, converRateArgs); foreach (DynamicObject bomHeadObj in bomHeadObjs)             {                 long bomId = Convert.ToInt64(bomHeadObj["FID"]);                 long materialId = Convert.ToInt64(bomHeadObj["FMATERIALID"]);                 long unitId = Convert.ToInt64(bomHeadObj["FUNITID"]);                 long baseUnitId = Convert.ToInt64(bomHeadObj["FBaseUnitId"]);                 long supplyOrgId = Convert.ToInt64(bomHeadObj["FUseOrgId"]);                 long parentAuxProId = Convert.ToInt64(bomHeadObj["FParentAuxPropId"]);                 BomForwardSourceDynamicRow bomExpandSourceRowView = BomForwardSourceDynamicRow.CreateInstance();                 UnitConvert rate = null;                 decimal dQty = bomExpandParam.Qty;                 if (dctUnitConvert.TryGetValue(bomHeadObjs.IndexOf(bomHeadObj), out rate))                 {                     dQty = rate.ConvertQty(dQty);                 }                 bomExpandSourceRowView.MaterialId_Id = materialId;                 bomExpandSourceRowView.BomId_Id = bomId;                 bomExpandSourceRowView.NeedQty = dQty;                 bomExpandSourceRowView.NeedDate = bomExpandParam.ValidDate;                 bomExpandSourceRowView.UnitId_Id = unitId;                 bomExpandSourceRowView.BaseUnitId_Id = baseUnitId;                 bomExpandSourceRowView.SupplyOrgId_Id = supplyOrgId;                 bomExpandSourceRowView.AuxPropId = parentAuxProId;                 //默认BOM展开过程使用的时间单位为天。                 bomExpandSourceRowView.TimeUnit = ((int)Kingdee.K3.Core.MFG.EnumConst.Enums.Enu_TimeUnit.KdDay).ToString();                 lstExpandSource.Add(bomExpandSourceRowView.DataEntity);             }             return lstExpandSource;         } ///          /// 获取bom子项数据         ///          /// <param name="lstExpandSource"></param>         /// <param name="memBomExpandOption"></param>         /// <returns></returns>         private List<DynamicObject> GetBomChildData(List<DynamicObject> lstExpandSource, MemBomExpandOption_ForPSV memBomExpandOption)         {             memBomExpandOption.IsConvertUnitQty = true;             List<DynamicObject> result = BomQueryServiceHelper.GetBomQueryForwardResult(this.KDContext.Session.AppContext, lstExpandSource, memBomExpandOption);             //根据BOM有无联副产品,更新物料清单正查明细的“存在联副产品”             SetIsExistCoby(result);             return result;         }         ///          /// 根据BOM有无联副产品,更新物料清单正查明细的“存在联副产品”         ///          /// <param name="queryChildData"></param>         private void SetIsExistCoby(List<DynamicObject> queryChildData)         {             if (queryChildData.IsEmpty()) return;             foreach (var query in queryChildData)             {                 var bom = query.GetDynamicValue<DynamicObject>("BomId");                 if (!bom.IsNullOrEmpty())                 {                     var coby = bom.GetDynamicValue<DynamicObjectCollection>("EntryBOMCOBY");                     if (!coby.IsEmpty())                     {                         query.SetDynamicObjectItemValue("IsExistCoby", true);                     }                 }             }         }     } }

  • 至此,api接口已经封装完成。

将此类库生成dll文件,放到应用站点目录下:一般是:./WebSite/bin。

客户端调用此api接口

创建控制台程序,调用此api接口
此工程添加引用如下:Kingdee.BOS.WebApi.Client,首先调用ValidateLogin()验证登录信息,登录成功之后再调用bom展开接口。

调用接口代码实现

using Kingdee.BOS.WebApi.Client; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Text; namespace HttpRequest {     class Program     {         static void Main(string[] args)         {             try             {                 K3CloudApiClient client = new K3CloudApiClient("http://localhost:1700/");                 var loginResult = client.ValidateLogin("5ef84228d60ade", "Administrator", "********", 2052);                 var resultType = JObject.Parse(loginResult)["LoginResultType"].Value<int>();                 if (resultType == 1)                 {                     BomExpandParam bomExpandParam = new BomExpandParam()                     {                         BomIds = new List<long>() { 193904 },                         ValidDate = DateTime.Now,                         Qty = 1                     };                     string serviceName = "WebApiService.GetBomExpandService.ExecuteService,WebApiService";                     var info = client.Execute<JObject>(serviceName, new object[] { JsonConvert.SerializeObject(bomExpandParam) });                     Console.ReadKey();                 }             }             catch (Exception ex)             {                 Console.WriteLine(ex.Message);             }         }     }     public class ValidModelEntity     {         public string Acctid { get; set; }         public string userName { get; set; }         public string password { get; set; }         public int lcid { get; set; }     } }

结果验证

接口返回结果如下图:其中Data数据就是bom展开结果

7ed0e3cf793e4078aaea28510249eb58.png
1d60f0c7fb1643448ecefca1350d071e.pngde5e19a7bc464ae09b35e981cdb314cf.png

HTTP调用

c77b987dbceb4a40891e5586fd7557d8.png


作者:Tracy_Huang

来源:金蝶云社区

原文链接:https://vip.kingdee.com/knowledge/388095148611278336?productLineId=1&isKnowledge=2&lang=zh-CN

著作权归作者所有。未经允许禁止转载,如需转载请联系作者获得授权。


【应用场景】

需要根据指定bom获取物料清单成本查询结果,并将结果在其他场景使用。



【注意事项】

  1. 该实现方案实现已指定bom内码实现,相关参数都设置为默认,演示通过按钮触发,开发者可根据自身需求将代码封装自定义WebAPI接口。

  2. 星空版本不能低于PT-154002 [8.2.0.20240104]版本



【案例演示】

点击按钮,指定bom版本,获取物料清单成本查询结果。


【实现步骤】

需要引用组件

Kingdee.BOS

Kingdee.BOS.Core

Kingdee.BOS.Orm

Kingdee.K3.BD.ServiceHelper


Kingdee.K3.Core

Kingdee.K3.MFG.ServiceHelper

Kingdee.BOS.ServiceHelper


<1>编写表单插件,代码如下。 

using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using Kingdee.BOS; using Kingdee.BOS.Core.DynamicForm; using Kingdee.BOS.Core.DynamicForm.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Core.Metadata; using Kingdee.BOS.Core.Metadata.EntityElement; using Kingdee.BOS.Core.SqlBuilder; using Kingdee.BOS.Orm; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.ServiceHelper; using Kingdee.BOS.Util; using Kingdee.K3.BD.ServiceHelper; using Kingdee.K3.Core.BD; using Kingdee.K3.Core.BD.ServiceArgs; using Kingdee.K3.Core.MFG.ENG.BomCost; using Kingdee.K3.Core.MFG.ENG.BomExpand; using Kingdee.K3.Core.MFG.ENG.ParamOption; using Kingdee.K3.MFG.ServiceHelper; using Kingdee.K3.MFG.ServiceHelper.ENG; namespace ITIBB.App.ServicePlugIn.Business.PlugIn {     /// <summary>     /// 自定义按钮 通过传递bom获取物料清单成本查询结果     /// </summary>     [Description("物料清单成本查询按钮调用")]     public class CustomExtBomQueryCost : AbstractDynamicFormPlugIn     {         public override void ButtonClick(ButtonClickEventArgs e)         {             base.ButtonClick(e);             if (e.Key.EqualsIgnoreCase("FButton_qtr"))             {                 //传递参数,指定bom内码                 List<long> bomIds = new List<long>();                 bomIds.Add(144259);                 bomIds.Add(144290);                 //获取bom展开结果                 List<DynamicObject> bomExpandData = this.ExtFillBomChildData(this.View.Context, bomIds);                 //物料清单成本查询相关参数设置                 BomCostArgs bomCostArgs = this.ExtGetQueryViewOption(this.View.Context);                 //调用物料清单成本查询取价接口                 IOperationResult funcResult = BomQueryCostServiceHelper.GetQueryBomPrice(this.Context, bomCostArgs, bomExpandData);                 if (funcResult.IsSuccess)                 {                     //物料清单成本查询数据包                     List<DynamicObject> resultBomDataLst = (List<DynamicObject>)funcResult.FuncResult;                 }             }         }         /// <summary>         /// 构建价格查询参数         /// </summary>         /// <param name="ctx">上下文</param>         private BomCostArgs ExtGetQueryViewOption(Context ctx)         {             BomCostArgs bomCostArgs = new BomCostArgs();             DynamicObject viewDatas = this.View.Model.DataObject;             //需求数量,默认是1             bomCostArgs.NeetQty = 1;             //成本计算方式,默认是1             bomCostArgs.CostType = "1";             //取价截止日期,默认当前时间             bomCostArgs.ExpirationDate = DateTime.Now;             //排除供应商,默认为空             List<long> excSuppliers = new List<long>();             bomCostArgs.ExcSupplierMul = excSuppliers;             //包含委外加工费,默认false             bomCostArgs.IsSubProcessFee = false;             //外购件BOM子项不参与卷算,默认false             bomCostArgs.IsWgCost = false;             //取折后价,默认false             bomCostArgs.IsDiscountedPrice = false;             //bom使用组织,默认当前登录组织             long bomUseOrgId = this.Context.CurrentOrganizationInfo.ID;             bomCostArgs.BomUseOrgId = bomUseOrgId;             //有采购业务优先取采购价格,默认false             bomCostArgs.PurPriceCheck = false;             //以下参数均来自工程数据参数-物料清单成本查询             //取价范围、 优先取使用组织下,使用组织下没有,则取管理中心级别             long takeDays = MFGServiceHelper.GetSystemProfile<long>(this.Context, bomUseOrgId, "MFG_EngParameter", "DateScope", 0);             if (takeDays == 0)             {                 //管理中心取不到,则默认180天                 takeDays = MFGServiceHelper.GetSystemProfile<long>(this.Context, 0, "MFG_EngParameter", "DateScope", 180);             }             bomCostArgs.TakeDays = takeDays;             //单据来源             string priceSourceBill = MFGServiceHelper.GetSystemProfile<string>(this.Context, bomUseOrgId, "MFG_EngParameter", "SourceBill", "");             if (priceSourceBill.IsNullOrEmptyOrWhiteSpace())             {                 //管理中心取不到,则默认采购订单返回                 priceSourceBill = MFGServiceHelper.GetSystemProfile<string>(this.Context, 0, "MFG_EngParameter", "SourceBill", "ORDER");             }             bomCostArgs.PriceSourceBill = priceSourceBill;             //单价金额用量             string costQtyParam = MFGServiceHelper.GetSystemProfile<string>(this.Context, bomUseOrgId, "MFG_EngParameter", "CostQtyParam");             if (costQtyParam.IsNullOrEmptyOrWhiteSpace())             {                 //管理中心取不到,则默认实际用量返回                 costQtyParam = MFGServiceHelper.GetSystemProfile<string>(this.Context, 0, "MFG_EngParameter", "CostQtyParam", "1");             }             bomCostArgs.CostQtyParam = costQtyParam;             //价目表及参考成本汇率来源             string sourceRate = MFGServiceHelper.GetSystemProfile<string>(this.Context, bomUseOrgId, "MFG_EngParameter", "SourceRate");             if (sourceRate.IsNullOrEmptyOrWhiteSpace())             {                 //管理中心取不到,则默认即期汇率返回                 sourceRate = MFGServiceHelper.GetSystemProfile<string>(this.Context, 0, "MFG_EngParameter", "SourceRate", "SPOT");             }             bomCostArgs.SourceRate = sourceRate;             //取价范围、 优先取使用组织下,使用组织下没有,则取管理中心级别             string excSetAccountTpye = MFGServiceHelper.GetSystemProfile<string>(this.Context, bomUseOrgId, "MFG_EngParameter", "ExcSetAccountTpye'", "0");             bomCostArgs.ExcSetAccountTpye = excSetAccountTpye;             //日期排序             string orderByDateField = MFGServiceHelper.GetSystemProfile<string>(this.Context, bomUseOrgId, "MFG_EngParameter", "OrderByDateField", "2");             bomCostArgs.OrderByField = orderByDateField;             //其他扩展选项             bomCostArgs.Option = OperateOption.Create();             return bomCostArgs;         }         private List<DynamicObject> ExtFillBomChildData(Context ctx, List<long> bomIds)         {             List<DynamicObject> bomExpandData = new List<DynamicObject>();             //设置bom展开参数             MemBomExpandOption_ForPSV memBomExpandOption = this.ExtBomQueryExpandOption();             //设置展开数据源             List<DynamicObject> lstExpandSource = this.ExtBuildBomExpandSourceData(ctx, bomIds);             //调用物料清单成本查询bom展开             bomExpandData = BomQueryServiceHelper.GetBomQueryForwardResult(this.Context, lstExpandSource, memBomExpandOption);             //展开结果加载引用属性             FormMetadata formMetadata = (FormMetadata)Kingdee.BOS.ServiceHelper.MetaDataServiceHelper.Load(ctx, "ENG_BomQueryCost", true);             EntryEntity childEntity = formMetadata.BusinessInfo.GetEntryEntity("FBottomEntity");             DBServiceHelper.LoadReferenceObject(this.View.Context, bomExpandData.ToArray(), childEntity.DynamicObjectType, false);             return bomExpandData;         }         /// <summary>         /// 构建bom展开参数,以下参数的设置尽量保持一致         /// </summary>         /// <returns></returns>         private MemBomExpandOption_ForPSV ExtBomQueryExpandOption()         {             //初始化BOM展开选项             MemBomExpandOption_ForPSV memBomExpandOption = new MemBomExpandOption_ForPSV();             //BOM展开层级数 默认30层             memBomExpandOption.ExpandLevelTo = 30;             //是否要展开虚拟物料             memBomExpandOption.ExpandVirtualMaterial = false;             //不要删除虚拟件,否则会造成BOM树表层级中断,个别子项不显示             memBomExpandOption.DeleteVirtualMaterial = false;             //是否删除跳层行             memBomExpandOption.DeleteSkipRow = false;             //是否展开跳层行             memBomExpandOption.ExpandSkipRow = false;             //只显示采购件需指定为false,因为默认值是true             memBomExpandOption.IsShowOutSource = false;             //本次展开GUID             memBomExpandOption.BomExpandId = SequentialGuid.NewGuid().ToString();             //BOM展开的第一层是否考虑成品率 默认为FALSE             memBomExpandOption.ParentCsdYieldRate = true;             //BOM展开的子项是否考虑成品率 默认为FALSE             memBomExpandOption.ChildCsdYieldRate = true;             //展开结果处理方式:采用内存方式不需要保存进数据库             memBomExpandOption.Mode = Kingdee.K3.Core.MFG.EnumConst.Enums.BomExpand.Enu_BomExpandMode.KdMemoryOnly;             //BOM子项生效失效区间内需求日期 此处用当前电脑时间,可以自由指定,标准产品是需求日期             memBomExpandOption.ValidDate = DateTime.Now;             //获取工程数据参数【kdBySystemProfile:取系统参数 kdByPrecisonCal:采用精确计 kdByTolerantCal:采用容错算法】             memBomExpandOption.BomExpandCalType = Kingdee.K3.Core.MFG.EnumConst.Enums.Enu_BomExpandCalType.kdBySystemProfile;             //BOM展开是否数量单位换算             memBomExpandOption.IsConvertUnitQty = true;             //是否是物料清单成本查询 如果设置为false则结果就是物料清单正查结果             memBomExpandOption.isBomCost = true;             //是否查询当前系统所有bom信息             memBomExpandOption.IsSelectAllBomInfos = true;             //对应标准成本计算方式参数,默认不展开判断是否展开替代料【1:按标准件计算 2:按替代件计算 3:按标准件和替代件较低价】             string costType = "1";             if (costType.EqualsIgnoreCase("1"))             {                 //是否考虑替代方案:默认不考虑,是否考虑替代:默认不考虑                 memBomExpandOption.CsdSubstitution = false;                 //是否展开替代料:默认不考虑                 memBomExpandOption.IsExpandSubMtrl = false;             }             else             {                 //是否考虑替代方案:默认不考虑,是否考虑替代:默认不考虑                 memBomExpandOption.CsdSubstitution = true;                 //是否展开替代料:默认不考虑                 memBomExpandOption.IsExpandSubMtrl = true;             }             //是否展开外购件bom 默认不展开[对应物料清单成本上外购件BOM子项不参与卷算参数]             memBomExpandOption.IsHideOutSourceBOM = false;             return memBomExpandOption;         }         /// <summary>         /// 获得需要展开的BOM展开数据信息         /// </summary>         /// <param name="iFocusRow"></param>         /// <returns></returns>         private List<DynamicObject> ExtBuildBomExpandSourceData(Context ctx, List<long> bomIds)         {             DateTime needDate = DateTime.Now;             List<DynamicObject> lstExpandSource = new List<DynamicObject>();             QueryBuilderParemeter batchParam = new QueryBuilderParemeter             {                 FormId = "ENG_BOM",                 SelectItems = SelectorItemInfo.CreateItems("FID", "FMaterialId.FMASTERID as MaterialMasterId",                 "FMATERIALID", "FUseOrgId", "FUNITID", "FBaseUnitId", "FParentAuxPropId"),             };             batchParam.ExtJoinTables.Add(new ExtJoinTableDescription             {                 FieldName = "FID",                 TableName = "table(fn_StrSplit(@ids,',',1))",                 TableNameAs = "ts",                 ScourceKey = "FID",             });             List<SqlParam> sqlParam = new List<SqlParam> {                 new SqlParam("@ids",KDDbType.udt_inttable,bomIds.Distinct().ToArray()),             };             DynamicObjectCollection bomHeadObjs = QueryServiceHelper.GetDynamicObjectCollection(ctx, batchParam, sqlParam);             Dictionary<Int64, DynamicObject> dctBomHeadObjs = bomHeadObjs.ToDictionary(x => Convert.ToInt64(x["FID"]));             List<GetUnitConvertRateArgs> converRateArgs = new List<GetUnitConvertRateArgs>();             foreach (DynamicObject bomHeadObj in bomHeadObjs)             {                 long materialId = Convert.ToInt64(bomHeadObj["FMATERIALID"]);                 long masterId = Convert.ToInt64(bomHeadObj["MaterialMasterId"]);                 long unitId = Convert.ToInt64(bomHeadObj["FUNITID"]);                 long baseUnitId = Convert.ToInt64(bomHeadObj["FBaseUnitId"]);                 long supplyOrgId = Convert.ToInt64(bomHeadObj["FUseOrgId"]);                 //此处要对数量进行换算:不能直接传常用单位数量                 converRateArgs.Add(new GetUnitConvertRateArgs()                 {                     PrimaryKey = bomHeadObjs.IndexOf(bomHeadObj),                     MasterId = masterId,                     SourceUnitId = unitId,                     DestUnitId = baseUnitId                 });             }             Dictionary<long, UnitConvert> dctUnitConvert = UnitConvertServiceHelper.GetUnitConvertRateList(ctx, converRateArgs);             foreach (DynamicObject bomHeadObj in bomHeadObjs)             {                 long bomId = Convert.ToInt64(bomHeadObj["FID"]);                 long materialId = Convert.ToInt64(bomHeadObj["FMATERIALID"]);                 long unitId = Convert.ToInt64(bomHeadObj["FUNITID"]);                 long baseUnitId = Convert.ToInt64(bomHeadObj["FBaseUnitId"]);                 long supplyOrgId = Convert.ToInt64(bomHeadObj["FUseOrgId"]);                 long parentAuxProId = Convert.ToInt64(bomHeadObj["FParentAuxPropId"]);                 BomForwardSourceDynamicRow bomExpandSourceRowView = BomForwardSourceDynamicRow.CreateInstance();                 UnitConvert rate = null;                 //默认需求数量为1                 decimal dQty = 1;                 if (dctUnitConvert.TryGetValue(bomHeadObjs.IndexOf(bomHeadObj), out rate))                 {                     dQty = rate.ConvertQty(dQty);                 }                 bomExpandSourceRowView.MaterialId_Id = materialId;                 bomExpandSourceRowView.BomId_Id = bomId;                 bomExpandSourceRowView.NeedQty = dQty;                 bomExpandSourceRowView.NeedDate = DateTime.Now;                 bomExpandSourceRowView.UnitId_Id = unitId;                 bomExpandSourceRowView.BaseUnitId_Id = baseUnitId;                 bomExpandSourceRowView.SupplyOrgId_Id = supplyOrgId;                 bomExpandSourceRowView.AuxPropId = parentAuxProId;                 //默认BOM展开过程使用的时间单位为天。                 bomExpandSourceRowView.TimeUnit = ((int)Kingdee.K3.Core.MFG.EnumConst.Enums.Enu_TimeUnit.KdDay).ToString();                 lstExpandSource.Add(bomExpandSourceRowView.DataEntity);             }             return lstExpandSource;         }     } }


<2>拷贝插件组件到应用站点的WebSite\Bin目录下,重启IIS。

<3>BOSIDE任意单据,添加自定义按钮,命名为FButton_qtr注册表单插件,保存元数据,开发完毕。


【功能验证】

<1>登录业务站点,点击自定义按钮



【参考资料】


自定义WebAPI接口调用BOM展开 (kingdee.com)

https://vip.kingdee.com/article/399149371909894144




金蝶云星空BOS二次开发案例演示】

https://vip.kingdee.com/article/94751030918525696



作者:ITIBB

来源:金蝶云社区

原文链接:https://vip.kingdee.com/knowledge/589519393051028480?productLineId=1&isKnowledge=2&lang=zh-CN

著作权归作者所有。未经允许禁止转载,如需转载请联系作者获得授权。