当单据达到一定条件时(例如审核完毕),希望能够依据单据转换规则自动生成下游单据,这种场景我们称为自动下推。
自动下推有三种实现方式:工作流的自动单据转换服务、操作上的自动下推服务、插件实现自动下推。注意:自动下推是后台自动生成,不会触发值更新事件、实体服务规则。经常有将预设单据手工下推的改为自动下推后,发现无法保存,原因就是手工下推会打开单据界面,有些必录项的赋值是通过值更新、实体服务实现的。
解决办法:通过单据转换规则的字段映射关系、表单服务策略、插件策略等多种配置方法实现相应必录字段的赋值,从而确保自动下推生成的单据可以通过保存校验。自动单据转换服务
步骤1,在工作流调用审核操作的节点之后,添加“自动单据转换”。同时,视需要可以在之后添加“自动单据提交”,表示自动生成下游单据后,将生成的单据提交。
步骤2,打开自动单据转换动作,选择需要自动生成的下游单据。注意必须是单据转换中分组策略设为“一对一生成”的规则才能使用。
所以,工作流中使用自动单据转换的特点是:可以依据某个特点工作流程版本审批才触发自动单据转换;可以配置自动下推生成的单据自动提交。
自动下推服务如果我们希望单据不论何种审核完成,都能够自动下推生成单据,那么可以在审核操作上配置“自动下推”服务。
步骤1,登录BOS IDE,打开单据属性“操作列表”,选择列表中的审核操作编辑;
步骤2,在审核操作的“其他控制”页签,配置服务端服务,新增服务“自动下推”。
插件实现自动下推直接上示意代码,该代码中,this = 列表插件。示意代码没有测试过,仅用于说明过程.
// 获取源单与目标单直接的转换规则,如果规则未启用,则返回为空,注意容错
// 假设:上游单据FormId为sourceFormId,下游单据FormId为targetFormId
var rules = ConvertServiceHelper.GetConvertRules(this.View.Context, sourceFormId, targetFormId);
var rule = rules.FirstOrDefault(t => t.IsDefault);
// 获取在列表上当前选择需下推的行
ListSelectedRow[] selectedRows = ((IListView)this.View).SelectedRowsInfo.ToArray();
// 如下代码为单据上获取当前当前选择行
// string primaryKeyValue = ((IBillView)this.View).Model.GetPKValue().ToString();
// ListSelectedRow row = new ListSelectedRow(primaryKeyValue, string.Empty, 0, this.View.BillBusinessInfo.GetForm().Id);
// ListSelectedRow[] selectedRows = new ListSelectedRow[] { row };
// 调用下推服务,生成下游单据数据包
ConvertOperationResult operationResult = null;
Dictionary<string, object> custParams = new Dictionary<string, object>();
try{
PushArgs pushArgs = new PushArgs(rule, selectedRows)
{
TargetBillTypeId = "" , // 请设定目标单据单据类型。如无单据类型,可以空字符
TargetOrgId = 0, // 请设定目标单据主业务组织。如无主业务组织,可以为0
CustomParams = custParams , // 可以传递额外附加的参数给单据转换插件,如无此需求,可忽略
};
//执行下推操作,并获取下推结果
operationResult = ConvertServiceHelper.Push(this.View.Context, pushArgs, OperateOption.Create());
}catch (KDExceptionValidate ex){
this.View.ShowErrMessage(ex.Message, ex.ValidateString);
return false;
}catch (KDException ex){
this.View.ShowErrMessage(ex.Message);
return false;
}catch{
throw;
}
// 获取生成的目标单据数据包
DynamicObject[] objs = (from p in operationResult.TargetDataEntities
select p.DataEntity).ToArray();
// 读取目标单据元数据
var targetBillMeta = MetaDataServiceHelper.Load(this.View.Context, targetFormId) as FormMetadata;
// 提交数据库保存,并获取保存结果
var saveResult = BusinessDataServiceHelper.Save(this.View.Context,targetBillMeta.BusinessInfo, objs);
// 根据保存结果,显示对应的提示
// TODO: 略,请自行查看saveResult对象的结构,利用this.View.ShowMessage之类函数,显示结果..