客户之前使用用友U8系统,开发了Excel模板导入批量生成销售订单的功能,现更换系统使用金蝶云星空,希望沿用以前的Excel模板,实现批量生成云星空的销售订单。设计开发方案,在销售订单列表里面增加按钮“批量导入”,弹出Excel文件选择及导入功能界面,效果图如下:
在云星空集成开发环境中,打开销售管理,在销售订单上增加列表菜单按钮“批量导入”;C#开发此按钮事件插件,并在销售订单列表插件中注册此插件。
增加动态表单“销售订单批量导入”,点击上面销售订单列表的按钮“批量导入”时,打开此动态表单。C#开发此动态表单插件,实现Excel文件选择和导入生成销售订单的功能,并在此表单插件中注册此插件。
注册好插件后,在销售订单列表,点击按钮“批量导入”,会弹出上面做的批量导入动态表单,选择相应的Excel模板文件(模板文件包含客户、产品、数量、单价等信息),即可进行销售订单的导入:
点击界面上的“导入销售订单”按钮,插件实现根据Excel文件中的客户、产品、数量和单价信息生成销售订单,根据生成单据的情况会进行相应的信息提示,有错误时进行错误信息提示:
点击“返回订单列表”按钮,关闭批量导入界面,同时自动刷新列表单据数据:
生成的销售订单详情:
插件使用C#开发,通过构建销售订单的IBillView并进行相应字段的赋值,从而生成销售订单,代码片段示例:
/// <summary>
/// 根据业务对象类型
/// </summary>
/// <param name="ctx">星空上下文</param>
/// <param name="objectTypeId">单据类型,该参数非必要,根据客户需求增加用作区分不同单据的处理</param>
/// <param name="dtData">数据集,该参数非必要,结合单据类型在后面填充字段值时使用</param>
/// <param name="PkValue">单据ID值,该参数非必要,外面读取单据是否已经存在</param>
/// <param name="strErrorList">收集错误信息,该参数非必要,根据开发设计用作日志记录</param>
/// <param name="FillBillPropertys">做了个填充字段值的方法指针</param>
public void ImportBill(Context ctx, string objectTypeId, DataTable dtData, Object PkValue, ref List<string> strErrorList, ref string PkBillNo, Action<IBillView, string, DataTable, List<string>> FillBillPropertys)
{
try
{
// 构建一个IBillView实例,通过此实例,可以方便的填写业务对象各属性
IBillView billView = CreateBillView(ctx, objectTypeId, PkValue, ref strErrorList);
if (billView == null)
{
strErrorList.Add("构建销售订单实例出现异常,请再次尝试!");
PkBillNo = String.Empty;
return;
}
// 新建一个空白实例
((IBillViewService)billView).LoadData();
// 触发插件的OnLoad事件:
// 组织控制基类插件,在OnLoad事件中,对主业务组织改变是否提示选项进行初始化。
// 如果不触发OnLoad事件,会导致主业务组织赋值不成功
DynamicFormViewPlugInProxy eventProxy = billView.GetService<DynamicFormViewPlugInProxy>();
eventProxy.FireOnLoad();
//eventProxy.FireAfterBindData(EventArgs.Empty);
// 填写业务对象实例各属性
FillBillPropertys(billView, objectTypeId, dtData, strErrorList);
//同步赋值有问题,就直接退出
if (strErrorList.Count > 0)
{
PkBillNo = String.Empty;
return;
}
// 保存业务对象实例
List<ValidationErrorInfo> errorList = new List<ValidationErrorInfo>();
string strBillNo = String.Empty;
SaveBill(ctx, billView, OperateOption.Create(), out errorList, out strBillNo);
foreach (ValidationErrorInfo item in errorList)
{
strErrorList.Add(item.Message);
}
PkBillNo = strBillNo;
}
catch (Exception ex)
{
strErrorList.Add(ex.Message);
PkBillNo = String.Empty;
}
}