目前星空开发新人特别多,有经验丰富的开发人员也不少,即使有经验的开发人员有时候也难免遇到曾经从未接触过的开发场景,甚至还不知道如何下手的问题,在这里分享一些实际经验给大家,希望能帮助到更多的开发人员提高自己的能力,其实开发最重要的一条就是开发思维,如果自己开发思维能力上去了,以不变应万变,这样很多问题就会隐忍而解。
分享如下:
尽量利用平台本身实现的保存、提交和审核,
模拟单据本身的方法,不要自己随便写一个SQL 语句做更新,自己随便写一个方法去执行保存,特别是业务逻辑比较强的方法,你自己写的SQL执行好像是没问题,说不定有些地方反写就没到位,有些关联地方就没处理到,这样会造成你可能都会意想不到的问题。那模拟平台保存方法需要注意的是:
(1)需要构建视图,下面写了一个通用方法,如果是主键为空时则为新建,否则为编辑,不用再考虑编辑状态的特殊处理方法
public IDynamicFormView CreateBillView(Context ctx, string objname, FormMetadata meta, string pkid = null)
{
BusinessInfo info = meta.BusinessInfo;
Form form = info.GetForm();
BillOpenParameter param = new BillOpenParameter(objname, null);
param.SetCustomParameter("formID", form.Id);
//根据主键是否为空 置为新增或修改状态
param.SetCustomParameter("status", !IsPrimaryValueEmpty(pkid) ? "Edit" : "AddNew");
param.SetCustomParameter("PlugIns", form.CreateFormPlugIns()); //插件实例模型
//修改主业务组织无须用户确认
param.SetCustomParameter("ShowConformDialogWhenChangeOrg", false);
param.Context = this.Context;
param.FormMetaData = meta;
param.LayoutId = param.FormMetaData.GetLayoutInfo().Id;
param.PkValue = !IsPrimaryValueEmpty(pkid) ? pkid : null;//单据主键内码FID
param.Status = !IsPrimaryValueEmpty(pkid) ? OperationStatus.EDIT : OperationStatus.ADDNEW;
IResourceServiceProvider provider = form.GetFormServiceProvider();
//普通的动态表单模式DynamicFormView
//IDynamicFormView billview = provider.GetService(typeof(IDynamicFormView)) as IDynamicFormView;
//这里模拟为引入模式的WebView,否则遇到交互的时候会有问题,移动端目前无法直接交互
Type type = Type.GetType("Kingdee.BOS.Web.Import.ImportBillView,Kingdee.BOS.Web");
IDynamicFormView billview = (IDynamicFormView)Activator.CreateInstance(type);
(billview as IBillViewService).Initialize(param, provider);//初始化
(billview as IBillViewService).LoadData();//加载单据数据
//如果是普通DynamicFormView时,LoadData的时候会加网控,要清除。//引入模式View不需要
// (billview as IBillView).CommitNetworkCtrl();
return billview;
}
private bool IsPrimaryValueEmpty(object pk)
{
return pk == null || pk.ToString() == "0" || string.IsNullOrWhiteSpace(pk.ToString());
}
(2)跟属性赋值(标准产品也是这么做的)
IDynamicFormView OUTSTOCKview = CreateBillView(this.Context, "SAL_OUTSTOCK", meta, fid);
OUTSTOCKview.Model.SetValue("FRealQty", outStockQty, 0);//含税单价字段赋值,row为具体行号
setvalue方法就是对已经构建的视图进行赋值处理,
(3)如果涉及到需要联动调用其值更新事件等需要执行一下以下方法,这个非常重要,
OUTSTOCKview.InvokeFieldUpdateService("FRealQty", 0);//联动触发含税单价值更新事件,row为具体行号
(4)执行其保存、提交和审核方法,如下:
OUTSTOCKview.InvokeFormOperation(Kingdee.BOS.Core.DynamicForm.FormOperationEnum.Save);
OUTSTOCKview.InvokeFormOperation(Kingdee.BOS.Core.DynamicForm.FormOperationEnum.Submit); //自动提交
OUTSTOCKview.InvokeFormOperation(Kingdee.BOS.Core.DynamicForm.FormOperationEnum.Audit); //自动提交和审核
每个单据或者基础资料,加载时都可以拿到数据包,可以对数据包进行灵活处理,比如这么一个场景,订单明细行需要增加一个MES单号,MES单号是订单号和行号一起构成的,因为订单号默认是保存完成后产生的,所以可以用下面方法数据包轻松实现:
public override void AfterSave(BOS.Core.Bill.PlugIn.Args.AfterSaveEventArgs e)
{
base.AfterSave(e);
EntryEntity entryEntity = this.View.BusinessInfo.GetEntryEntity("FSaleOrderEntry");
DynamicObjectCollection entryRows = this.View.Model.GetEntityDataObject(entryEntity);
DynamicObject obj = this.Model.DataObject;
DynamicObject[] objs = new DynamicObject[] { obj };
string OrderNo = this.View.Model.GetValue("FBillNo").ToString();
//按订单号+单据体行号形成任务单号
for (int i = 0; i < entryRows.Count; i++)
{
entryRows[i]["F_PEIZ_MESSCRWDH"] = OrderNo + "-" + (i + 1);
}
//保存单据体
ISaveService saveService = Kingdee.BOS.App.ServiceHelper.GetService<ISaveService>();
saveService.Save(this.Context, objs);
this.View.UpdateView("FSaleOrderEntry");
}
这样写不仅非常方便,并且保存性能还比较高效,因为标准产品的保存方法是实现增量保存的,也就是没有修改的地方不会去做处理的,这样如果一个单据改1个地方和改10个地方执行效率是不一样的
推荐阅读