554 lines
30 KiB
C#
554 lines
30 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Text;
|
|||
|
|
using Kingdee.K3.Core.MFG.EntityHelper;
|
|||
|
|
using Kingdee.K3.FIN.App.Core;
|
|||
|
|
using System.ComponentModel;
|
|||
|
|
using Kingdee.BOS;
|
|||
|
|
using Kingdee.BOS.Util;
|
|||
|
|
using Kingdee.BOS.Core;
|
|||
|
|
using Kingdee.BOS.Core.Const;
|
|||
|
|
using Kingdee.BOS.Core.DynamicForm;
|
|||
|
|
using Kingdee.BOS.Core.DynamicForm.PlugIn;
|
|||
|
|
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
|
|||
|
|
using Kingdee.BOS.Core.DynamicForm.Operation;
|
|||
|
|
using Kingdee.BOS.Core.List;
|
|||
|
|
using Kingdee.BOS.Core.Metadata;
|
|||
|
|
using Kingdee.BOS.Core.Metadata.ConvertElement;
|
|||
|
|
using Kingdee.BOS.Core.Metadata.ConvertElement.ServiceArgs;
|
|||
|
|
using Kingdee.BOS.Core.Interaction;
|
|||
|
|
using Kingdee.BOS.Core.Validation;
|
|||
|
|
using Kingdee.BOS.Contracts;
|
|||
|
|
using Kingdee.BOS.App;
|
|||
|
|
using Kingdee.BOS.Orm;
|
|||
|
|
using Kingdee.BOS.Orm.DataEntity;
|
|||
|
|
using Kingdee.BOS.App.Data;
|
|||
|
|
using System.Data;
|
|||
|
|
using System.Collections;
|
|||
|
|
using Kingdee.BOS.Core.Metadata.EntityElement;
|
|||
|
|
|
|||
|
|
namespace aoyuPlugIn
|
|||
|
|
{
|
|||
|
|
//其他出库单审核时自动生成其他出库单,在审核操作的服务插件中
|
|||
|
|
[Description("自动生成其他入库单")]//自动下推生产审核的调入调出单STK_MISCELLANEOUS
|
|||
|
|
public class MJ_xtqtrk : AbstractOperationServicePlugIn
|
|||
|
|
{
|
|||
|
|
private string entityKey = "FEntity";//其他出库单单据标识
|
|||
|
|
int rowIndex;
|
|||
|
|
string scddfid;
|
|||
|
|
int scddRow;
|
|||
|
|
//public override void OnPreparePropertys(PreparePropertysEventArgs e)
|
|||
|
|
//{
|
|||
|
|
// base.OnPreparePropertys(e);
|
|||
|
|
// e.FieldKeys.Add("F_QBOY_JKDH");//缴库单号
|
|||
|
|
// e.FieldKeys.Add("F_QBOY_YDEntryID");//生产订单单据体ID
|
|||
|
|
// e.FieldKeys.Add("F_QBOY_YDHH");//生产订单行号
|
|||
|
|
// e.FieldKeys.Add("F_QBOY_SKYTLed");//已退量
|
|||
|
|
// e.FieldKeys.Add("F_QBOY_SKL");//水口量
|
|||
|
|
// e.FieldKeys.Add("F_QBOY_SKYTL");//应退量
|
|||
|
|
|
|||
|
|
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 审核操作完成,单据状态已经更改,但是还没有提交事务时,触发此事件:
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="e"></param>
|
|||
|
|
/// <remarks>
|
|||
|
|
/// 因为此事件触发时,还在事务保护中,因此适合进行数据同步;
|
|||
|
|
/// 审核后自动下推,如果下推失败,需要放弃审核,因此,放在此事件中处理(事务中)
|
|||
|
|
/// </remarks>
|
|||
|
|
public override void EndOperationTransaction(EndOperationTransactionArgs e)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
Entity entityObj = this.BusinessInfo.GetEntity(entityKey);
|
|||
|
|
foreach (DynamicObject d in e.DataEntitys)
|
|||
|
|
{
|
|||
|
|
if (d["BillEntry"] == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
DynamicObjectCollection FentryRow = d["BillEntry"] as DynamicObjectCollection;
|
|||
|
|
//scddfid = FentryRow[0][7].ToString();//生产订单单据体ID
|
|||
|
|
//scddRow = Convert.ToInt32(FentryRow[0][6]);//生产订单行号
|
|||
|
|
|
|||
|
|
//if (Convert.ToDouble(FentryRow[0][5]) + Convert.ToDouble(FentryRow[0][4]) < Convert.ToDouble(FentryRow[0][3]))
|
|||
|
|
//{
|
|||
|
|
// return;
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
//String sSql2 = String.Format(@" select FID FROM T_PRD_MO where FBILLNO='{0}' ", FentryRow[0][2]);
|
|||
|
|
//DynamicObjectCollection dr = DBUtils.ExecuteDynamicObject(this.Context, sSql2);
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
this.DoPush("STK_MisDelivery", "STK_MISCELLANEOUS", (from p in e.DataEntitys select Convert.ToInt64(p[0])).ToList(), e);
|
|||
|
|
//using (IDataReader dr = DBUtils.ExecuteReader(this.Context, sSql2))
|
|||
|
|
//{
|
|||
|
|
|
|||
|
|
// while (dr.Read())
|
|||
|
|
// {
|
|||
|
|
// var scddfid = Convert.ToInt64(dr["F_PCDN_INMD"]);
|
|||
|
|
// //this.DoPush("k246ba461a1494a348dc7c9996f609b60", "PRD_INSTOCK",
|
|||
|
|
// // (from p in e.DataEntitys select Convert.ToInt64(p[0])).ToList(), e);
|
|||
|
|
// }
|
|||
|
|
// dr.Close();
|
|||
|
|
|
|||
|
|
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//this.DoPush("k246ba461a1494a348dc7c9996f609b60", "PRD_INSTOCK",
|
|||
|
|
// (from p in e.DataEntitys select Convert.ToInt64(p[0])).ToList(), e);
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 自动下推并保存
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="sourceFormId">源单FormId</param>
|
|||
|
|
/// <param name="targetFormId">目标单FormId</param>
|
|||
|
|
/// <param name="sourceBillIds">源单内码</param>
|
|||
|
|
private void DoPush(string sourceFormId, string targetFormId, List<long> sourceBillIds, EndOperationTransactionArgs e)
|
|||
|
|
{
|
|||
|
|
// 获取源单与目标单的转换规则
|
|||
|
|
IConvertService convertService = ServiceHelper.GetService<IConvertService>();
|
|||
|
|
var rules = convertService.GetConvertRules(this.Context, sourceFormId, targetFormId);
|
|||
|
|
if (rules == null || rules.Count == 0)
|
|||
|
|
{
|
|||
|
|
throw new KDBusinessException("", string.Format("未找到{0}到{1}之间,启用的转换规则,无法自动下推!", sourceFormId, targetFormId));
|
|||
|
|
}
|
|||
|
|
// 取勾选了默认选项的规则
|
|||
|
|
// var rule = rules.FirstOrDefault(t => t.IsDefault);
|
|||
|
|
// 如果无默认规则,则取第一个
|
|||
|
|
// if (rule == null)
|
|||
|
|
//{
|
|||
|
|
// rule = rules[0];
|
|||
|
|
// }
|
|||
|
|
//门店至运营中心,或运营中心至门店
|
|||
|
|
|
|||
|
|
//if (true && rules.Count > 0)
|
|||
|
|
if (true && rules.Count > 1)
|
|||
|
|
{
|
|||
|
|
//var rule = rules[0];
|
|||
|
|
var rule = rules[1];
|
|||
|
|
// 开始构建下推参数:
|
|||
|
|
// 待下推的源单数据行
|
|||
|
|
List<ListSelectedRow> srcSelectedRows = new List<ListSelectedRow>();
|
|||
|
|
|
|||
|
|
|
|||
|
|
foreach (var billId in sourceBillIds)
|
|||
|
|
{// 把待下推的源单内码,逐个创建ListSelectedRow对象,添加到集合中
|
|||
|
|
srcSelectedRows.Add(new ListSelectedRow(billId.ToString(), string.Empty, 0, sourceFormId));
|
|||
|
|
|
|||
|
|
|
|||
|
|
// 特别说明:上述代码,是整单下推;
|
|||
|
|
// 如果需要指定待下推的单据体行,请参照下句代码,在ListSelectedRow中,指定EntryEntityKey以及EntryId
|
|||
|
|
//srcSelectedRows.Add(new ListSelectedRow(billId.ToString(), entityId, 0, sourceFormId) { EntryEntityKey = "FEntity" });
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
// 指定目标单单据类型:情况比较复杂,没有合适的案例做参照,示例代码暂略,直接留空,会下推到默认的单据类型
|
|||
|
|
string targetBillTypeId = string.Empty;
|
|||
|
|
// 指定目标单据主业务组织:情况更加复杂,需要涉及到业务委托关系,缺少合适案例,示例代码暂略
|
|||
|
|
// 建议在转换规则中,配置好主业务组织字段的映射关系:运行时,由系统根据映射关系,自动从上游单据取主业务组织,避免由插件指定
|
|||
|
|
long targetOrgId = 0;
|
|||
|
|
// 自定义参数字典:把一些自定义参数,传递到转换插件中;转换插件再根据这些参数,进行特定处理
|
|||
|
|
Dictionary<string, object> custParams = new Dictionary<string, object>();
|
|||
|
|
// 组装下推参数对象
|
|||
|
|
PushArgs pushArgs = new PushArgs(rule, srcSelectedRows.ToArray())
|
|||
|
|
{
|
|||
|
|
TargetBillTypeId = targetBillTypeId,
|
|||
|
|
TargetOrgId = targetOrgId,
|
|||
|
|
CustomParams = custParams
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
OperateOption option = OperateOption.Create();
|
|||
|
|
option.SetVariableValue(BOSConst.CST_ConvertValidatePermission, true);
|
|||
|
|
// 调用下推服务,生成下游单据数据包
|
|||
|
|
ConvertOperationResult convResult = convertService.Push(this.Context, pushArgs, OperateOption.Create());
|
|||
|
|
|
|||
|
|
// 开始处理下推结果:
|
|||
|
|
// 获取下推生成的下游单据数据包
|
|||
|
|
DynamicObject[] destObjs = (from p in convResult.TargetDataEntities select p.DataEntity).ToArray();
|
|||
|
|
if (destObjs.Length == 0)
|
|||
|
|
{
|
|||
|
|
// 未下推成功目标单,抛出错误,中断审核
|
|||
|
|
throw new KDBusinessException("", string.Format("由{0}自动下推{1},没有成功生成数据包,自动下推失败!", sourceFormId, targetFormId));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 对下游单据数据包,进行适当的修订,以避免关键字段为空,自动保存失败
|
|||
|
|
// 示例代码略
|
|||
|
|
// 读取目标单据元数据
|
|||
|
|
IMetaDataService metaService = ServiceHelper.GetService<IMetaDataService>();
|
|||
|
|
FormMetadata destFormMetadata = metaService.Load(this.Context, targetFormId) as FormMetadata;
|
|||
|
|
// 构建保存操作参数:设置操作选项值,忽略交互提示
|
|||
|
|
OperateOption saveOption = OperateOption.Create();
|
|||
|
|
// 忽略全部需要交互性质的提示,直接保存;
|
|||
|
|
saveOption.SetIgnoreWarning(true); // 忽略交互提示
|
|||
|
|
saveOption.SetInteractionFlag(this.Option.GetInteractionFlag()); // 如果有交互,传入用户选择的交互结果
|
|||
|
|
// using Kingdee.BOS.Core.Interaction;
|
|||
|
|
saveOption.SetIgnoreInteractionFlag(this.Option.GetIgnoreInteractionFlag());
|
|||
|
|
|
|||
|
|
// 上一步操作成功的目标单
|
|||
|
|
List<object> lastSuccessIdLst = new List<object>();
|
|||
|
|
// 本操作成功的目标单
|
|||
|
|
List<object> successIdLst = new List<object>();
|
|||
|
|
// 操作失败的目标单
|
|||
|
|
List<DynamicObject> failedobjs = new List<DynamicObject>();
|
|||
|
|
// 操作结果
|
|||
|
|
IOperationResult result = new OperationResult();
|
|||
|
|
// 错误信息
|
|||
|
|
List<ValidationErrorInfo> errorLst = new List<ValidationErrorInfo>();
|
|||
|
|
|
|||
|
|
|
|||
|
|
////////////////////////////// 暂存 //////////////////////////////
|
|||
|
|
IDraftService service = Kingdee.BOS.Contracts.ServiceFactory.GetService<IDraftService>(this.Context);
|
|||
|
|
IOperationResult innerResult = service.Draft(this.Context, destFormMetadata.BusinessInfo, destObjs);
|
|||
|
|
// 暂存成功的目标单
|
|||
|
|
successIdLst = innerResult.OperateResult.Select(o => o.PKValue).Distinct().ToList();
|
|||
|
|
// 暂存不通过的目标单
|
|||
|
|
failedobjs = destObjs.Where(o => !successIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))).ToList();
|
|||
|
|
if (failedobjs != null && !failedobjs.IsEmpty())
|
|||
|
|
{
|
|||
|
|
errorLst.Add(new ValidationErrorInfo("", "Id", 0, 0, "DraftError", string.Format("{0}暂存失败:{1}",
|
|||
|
|
string.Join(",", failedobjs.Select(o => o.GetDynamicObjectItemValue<string>("BillNo"))), string.Join("\n", innerResult.ValidationErrors.Select(o => o.Message))), "", ErrorLevel.Error));
|
|||
|
|
}
|
|||
|
|
// 暂存不通过,则操作失败
|
|||
|
|
if (successIdLst.IsEmpty())
|
|||
|
|
{
|
|||
|
|
result.IsSuccess = false;
|
|||
|
|
}
|
|||
|
|
e.DataEntitys = e.DataEntitys.Where(o => successIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))).ToArray();
|
|||
|
|
////////////////////////////// 保存 //////////////////////////////
|
|||
|
|
if (!successIdLst.IsEmpty())
|
|||
|
|
{
|
|||
|
|
lastSuccessIdLst = successIdLst;
|
|||
|
|
innerResult = AppServiceContext.SaveService.Save(this.Context, destFormMetadata.BusinessInfo, destObjs.Where(o => successIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))).ToArray(), option);
|
|||
|
|
// 保存成功的目标单
|
|||
|
|
successIdLst = innerResult.OperateResult.Select(o => o.PKValue).Distinct().ToList();
|
|||
|
|
// 校验不通过的目标单
|
|||
|
|
failedobjs = destObjs.Where(o => lastSuccessIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))
|
|||
|
|
&& !successIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))).ToList();
|
|||
|
|
if (failedobjs != null && !failedobjs.IsEmpty())
|
|||
|
|
{
|
|||
|
|
errorLst.Add(new ValidationErrorInfo("", "Id", 0, 0, "SaveError", string.Format("{0}保存失败,已暂存:{1}",
|
|||
|
|
string.Join(",", failedobjs.Select(o => o.GetDynamicObjectItemValue<string>("BillNo"))), string.Join("\n", innerResult.ValidationErrors.Select(o => o.Message))), "", ErrorLevel.Error));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
////////////////////////////// 提交 //////////////////////////////
|
|||
|
|
if (!successIdLst.IsEmpty())
|
|||
|
|
{
|
|||
|
|
lastSuccessIdLst = successIdLst;
|
|||
|
|
innerResult = AppServiceContext.SubmitService.Submit(this.Context, destFormMetadata.BusinessInfo, successIdLst.ToArray(), "Submit", option);
|
|||
|
|
// 提交成功的目标单
|
|||
|
|
successIdLst = innerResult.OperateResult.Select(o => o.PKValue).Distinct().ToList();
|
|||
|
|
// 校验不通过的目标单
|
|||
|
|
failedobjs = destObjs.Where(o => lastSuccessIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))
|
|||
|
|
&& !successIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))).ToList();
|
|||
|
|
if (failedobjs != null && !failedobjs.IsEmpty())
|
|||
|
|
{
|
|||
|
|
errorLst.Add(new ValidationErrorInfo("", "Id", 0, 0, "SubmitError", string.Format("{0}提交失败,已保存:{1}",
|
|||
|
|
string.Join(",", failedobjs.Select(o => o.GetDynamicObjectItemValue<string>("BillNo"))), string.Join("\n", innerResult.ValidationErrors.Select(o => o.Message))), "", ErrorLevel.Error));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
////////////////////////////// 审核 //////////////////////////////
|
|||
|
|
if (!successIdLst.IsEmpty())
|
|||
|
|
{
|
|||
|
|
lastSuccessIdLst = successIdLst;
|
|||
|
|
List<KeyValuePair<object, object>> pkIds = new List<KeyValuePair<object, object>>();
|
|||
|
|
foreach (var o in successIdLst)
|
|||
|
|
{
|
|||
|
|
pkIds.Add(new KeyValuePair<object, object>(o, ""));
|
|||
|
|
}
|
|||
|
|
//审核
|
|||
|
|
List<object> paraAudit = new List<object>();
|
|||
|
|
//1审核通过
|
|||
|
|
paraAudit.Add("1");
|
|||
|
|
//审核意见
|
|||
|
|
paraAudit.Add("");
|
|||
|
|
innerResult = AppServiceContext.SetStatusService.SetBillStatus(this.Context, destFormMetadata.BusinessInfo, pkIds, paraAudit, "Audit", option);
|
|||
|
|
// 审核成功的目标单
|
|||
|
|
successIdLst = innerResult.OperateResult.Select(o => o.PKValue).Distinct().ToList();
|
|||
|
|
// 审核不通过的目标单
|
|||
|
|
failedobjs = destObjs.Where(o => lastSuccessIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))
|
|||
|
|
&& !successIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))).ToList();
|
|||
|
|
if (failedobjs != null && !failedobjs.IsEmpty())
|
|||
|
|
{
|
|||
|
|
errorLst.Add(new ValidationErrorInfo("", "Id", 0, 0, "AuditError", string.Format("{0}审核失败,已提交:{1}",
|
|||
|
|
string.Join(",", failedobjs.Select(o => o.GetDynamicObjectItemValue<string>("BillNo"))), string.Join("\n", innerResult.ValidationErrors.Select(o => o.Message))), "", ErrorLevel.Error));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
////////////////////////////// 构造错误信息 //////////////////////////////
|
|||
|
|
if (!errorLst.IsNullOrEmpty())
|
|||
|
|
{
|
|||
|
|
result.ValidationErrors.AddRange(errorLst);
|
|||
|
|
}
|
|||
|
|
// 将操作结果合并到空操作结果中
|
|||
|
|
this.OperationResult.IsSuccess = result.IsSuccess;
|
|||
|
|
if (!this.OperationResult.IsSuccess)
|
|||
|
|
{
|
|||
|
|
this.OperationResult.ValidationErrors.Add(new ValidationErrorInfo("", "Id", 0, 0, "Error", string.Format("自动转换失败"), "", ErrorLevel.Error));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 调用保存服务,自动保存
|
|||
|
|
// ISaveService saveService = ServiceHelper.GetService<ISaveService>();
|
|||
|
|
// var saveResult = saveService.Save(this.Context, targetBillMeta.BusinessInfo, targetBillObjs, saveOption, "Save");
|
|||
|
|
// 判断自动保存结果:只有操作成功,才会继续
|
|||
|
|
// if (!this.CheckOpResult(saveResult, saveOption))
|
|||
|
|
// {
|
|||
|
|
// throw new KDBusinessException("", string.Format("由{0}自动下推{1},自动下推失败!", sourceFormId, targetFormId));
|
|||
|
|
// }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//if (true && rules.Count > 1)
|
|||
|
|
if (true && rules.Count > 0)
|
|||
|
|
{
|
|||
|
|
//var rule = rules[1];
|
|||
|
|
var rule = rules[0];
|
|||
|
|
// 开始构建下推参数:
|
|||
|
|
// 待下推的源单数据行
|
|||
|
|
// 开始构建下推参数:
|
|||
|
|
// 待下推的源单数据行
|
|||
|
|
List<ListSelectedRow> srcSelectedRows = new List<ListSelectedRow>();
|
|||
|
|
foreach (var billId in sourceBillIds)
|
|||
|
|
{// 把待下推的源单内码,逐个创建ListSelectedRow对象,添加到集合中
|
|||
|
|
srcSelectedRows.Add(new ListSelectedRow(billId.ToString(), string.Empty, 0, sourceFormId));
|
|||
|
|
|
|||
|
|
// 特别说明:上述代码,是整单下推;
|
|||
|
|
// 如果需要指定待下推的单据体行,请参照下句代码,在ListSelectedRow中,指定EntryEntityKey以及EntryId
|
|||
|
|
//srcSelectedRows.Add(new ListSelectedRow(billId.ToString(), scddfid, 0, sourceFormId) { EntryEntityKey = "FTreeEntity" });
|
|||
|
|
//srcSelectedRows.Add(new ListSelectedRow(billId.ToString(), entityId, 0, sourceFormId) { EntryEntityKey = "FEntity" });
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
// 指定目标单单据类型:情况比较复杂,没有合适的案例做参照,示例代码暂略,直接留空,会下推到默认的单据类型
|
|||
|
|
string targetBillTypeId = string.Empty;
|
|||
|
|
// 指定目标单据主业务组织:情况更加复杂,需要涉及到业务委托关系,缺少合适案例,示例代码暂略
|
|||
|
|
// 建议在转换规则中,配置好主业务组织字段的映射关系:运行时,由系统根据映射关系,自动从上游单据取主业务组织,避免由插件指定
|
|||
|
|
long targetOrgId = 0;
|
|||
|
|
// 自定义参数字典:把一些自定义参数,传递到转换插件中;转换插件再根据这些参数,进行特定处理
|
|||
|
|
Dictionary<string, object> custParams = new Dictionary<string, object>();
|
|||
|
|
// 组装下推参数对象
|
|||
|
|
PushArgs pushArgs = new PushArgs(rule, srcSelectedRows.ToArray())
|
|||
|
|
{
|
|||
|
|
TargetBillTypeId = targetBillTypeId,
|
|||
|
|
TargetOrgId = targetOrgId,
|
|||
|
|
CustomParams = custParams
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
OperateOption option = OperateOption.Create();
|
|||
|
|
option.SetVariableValue(BOSConst.CST_ConvertValidatePermission, true);
|
|||
|
|
// 调用下推服务,生成下游单据数据包
|
|||
|
|
ConvertOperationResult convResult = convertService.Push(this.Context, pushArgs, OperateOption.Create());
|
|||
|
|
|
|||
|
|
// 开始处理下推结果:
|
|||
|
|
// 获取下推生成的下游单据数据包
|
|||
|
|
DynamicObject[] destObjs = (from p in convResult.TargetDataEntities select p.DataEntity).ToArray();
|
|||
|
|
if (destObjs.Length == 0)
|
|||
|
|
{
|
|||
|
|
// 未下推成功目标单,抛出错误,中断审核
|
|||
|
|
throw new KDBusinessException("", string.Format("由{0}自动下推{1},没有成功生成数据包,自动下推失败!", sourceFormId, targetFormId));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 对下游单据数据包,进行适当的修订,以避免关键字段为空,自动保存失败
|
|||
|
|
// 示例代码略
|
|||
|
|
// 读取目标单据元数据
|
|||
|
|
IMetaDataService metaService = ServiceHelper.GetService<IMetaDataService>();
|
|||
|
|
FormMetadata destFormMetadata = metaService.Load(this.Context, targetFormId) as FormMetadata;
|
|||
|
|
// 构建保存操作参数:设置操作选项值,忽略交互提示
|
|||
|
|
OperateOption saveOption = OperateOption.Create();
|
|||
|
|
// 忽略全部需要交互性质的提示,直接保存;
|
|||
|
|
saveOption.SetIgnoreWarning(true); // 忽略交互提示
|
|||
|
|
saveOption.SetInteractionFlag(this.Option.GetInteractionFlag()); // 如果有交互,传入用户选择的交互结果
|
|||
|
|
// using Kingdee.BOS.Core.Interaction;
|
|||
|
|
saveOption.SetIgnoreInteractionFlag(this.Option.GetIgnoreInteractionFlag());
|
|||
|
|
|
|||
|
|
// 上一步操作成功的目标单
|
|||
|
|
List<object> lastSuccessIdLst = new List<object>();
|
|||
|
|
// 本操作成功的目标单
|
|||
|
|
List<object> successIdLst = new List<object>();
|
|||
|
|
// 操作失败的目标单
|
|||
|
|
List<DynamicObject> failedobjs = new List<DynamicObject>();
|
|||
|
|
// 操作结果
|
|||
|
|
IOperationResult result = new OperationResult();
|
|||
|
|
// 错误信息
|
|||
|
|
List<ValidationErrorInfo> errorLst = new List<ValidationErrorInfo>();
|
|||
|
|
|
|||
|
|
|
|||
|
|
////////////////////////////// 暂存 //////////////////////////////
|
|||
|
|
IDraftService service = Kingdee.BOS.Contracts.ServiceFactory.GetService<IDraftService>(this.Context);
|
|||
|
|
IOperationResult innerResult = service.Draft(this.Context, destFormMetadata.BusinessInfo, destObjs);
|
|||
|
|
// 暂存成功的目标单
|
|||
|
|
successIdLst = innerResult.OperateResult.Select(o => o.PKValue).Distinct().ToList();
|
|||
|
|
// 暂存不通过的目标单
|
|||
|
|
failedobjs = destObjs.Where(o => !successIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))).ToList();
|
|||
|
|
if (failedobjs != null && !failedobjs.IsEmpty())
|
|||
|
|
{
|
|||
|
|
errorLst.Add(new ValidationErrorInfo("", "Id", 0, 0, "DraftError", string.Format("{0}暂存失败:{1}",
|
|||
|
|
string.Join(",", failedobjs.Select(o => o.GetDynamicObjectItemValue<string>("BillNo"))), string.Join("\n", innerResult.ValidationErrors.Select(o => o.Message))), "", ErrorLevel.Error));
|
|||
|
|
}
|
|||
|
|
// 暂存不通过,则操作失败
|
|||
|
|
if (successIdLst.IsEmpty())
|
|||
|
|
{
|
|||
|
|
result.IsSuccess = false;
|
|||
|
|
}
|
|||
|
|
e.DataEntitys = e.DataEntitys.Where(o => successIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))).ToArray();
|
|||
|
|
////////////////////////////// 保存 //////////////////////////////
|
|||
|
|
if (!successIdLst.IsEmpty())
|
|||
|
|
{
|
|||
|
|
lastSuccessIdLst = successIdLst;
|
|||
|
|
innerResult = AppServiceContext.SaveService.Save(this.Context, destFormMetadata.BusinessInfo, destObjs.Where(o => successIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))).ToArray(), option);
|
|||
|
|
// 保存成功的目标单
|
|||
|
|
successIdLst = innerResult.OperateResult.Select(o => o.PKValue).Distinct().ToList();
|
|||
|
|
// 校验不通过的目标单
|
|||
|
|
failedobjs = destObjs.Where(o => lastSuccessIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))
|
|||
|
|
&& !successIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))).ToList();
|
|||
|
|
if (failedobjs != null && !failedobjs.IsEmpty())
|
|||
|
|
{
|
|||
|
|
errorLst.Add(new ValidationErrorInfo("", "Id", 0, 0, "SaveError", string.Format("{0}保存失败,已暂存:{1}",
|
|||
|
|
string.Join(",", failedobjs.Select(o => o.GetDynamicObjectItemValue<string>("BillNo"))), string.Join("\n", innerResult.ValidationErrors.Select(o => o.Message))), "", ErrorLevel.Error));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
////////////////////////////// 提交 //////////////////////////////
|
|||
|
|
if (!successIdLst.IsEmpty())
|
|||
|
|
{
|
|||
|
|
lastSuccessIdLst = successIdLst;
|
|||
|
|
innerResult = AppServiceContext.SubmitService.Submit(this.Context, destFormMetadata.BusinessInfo, successIdLst.ToArray(), "Submit", option);
|
|||
|
|
// 提交成功的目标单
|
|||
|
|
successIdLst = innerResult.OperateResult.Select(o => o.PKValue).Distinct().ToList();
|
|||
|
|
// 校验不通过的目标单
|
|||
|
|
failedobjs = destObjs.Where(o => lastSuccessIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))
|
|||
|
|
&& !successIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))).ToList();
|
|||
|
|
if (failedobjs != null && !failedobjs.IsEmpty())
|
|||
|
|
{
|
|||
|
|
errorLst.Add(new ValidationErrorInfo("", "Id", 0, 0, "SubmitError", string.Format("{0}提交失败,已保存:{1}",
|
|||
|
|
string.Join(",", failedobjs.Select(o => o.GetDynamicObjectItemValue<string>("BillNo"))), string.Join("\n", innerResult.ValidationErrors.Select(o => o.Message))), "", ErrorLevel.Error));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
////////////////////////////// 审核 //////////////////////////////
|
|||
|
|
if (!successIdLst.IsEmpty())
|
|||
|
|
{
|
|||
|
|
lastSuccessIdLst = successIdLst;
|
|||
|
|
List<KeyValuePair<object, object>> pkIds = new List<KeyValuePair<object, object>>();
|
|||
|
|
foreach (var o in successIdLst)
|
|||
|
|
{
|
|||
|
|
pkIds.Add(new KeyValuePair<object, object>(o, ""));
|
|||
|
|
}
|
|||
|
|
//审核
|
|||
|
|
List<object> paraAudit = new List<object>();
|
|||
|
|
//1审核通过
|
|||
|
|
paraAudit.Add("1");
|
|||
|
|
//审核意见
|
|||
|
|
paraAudit.Add("");
|
|||
|
|
innerResult = AppServiceContext.SetStatusService.SetBillStatus(this.Context, destFormMetadata.BusinessInfo, pkIds, paraAudit, "Audit", option);
|
|||
|
|
// 审核成功的目标单
|
|||
|
|
successIdLst = innerResult.OperateResult.Select(o => o.PKValue).Distinct().ToList();
|
|||
|
|
// 审核不通过的目标单
|
|||
|
|
failedobjs = destObjs.Where(o => lastSuccessIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))
|
|||
|
|
&& !successIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))).ToList();
|
|||
|
|
if (failedobjs != null && !failedobjs.IsEmpty())
|
|||
|
|
{
|
|||
|
|
errorLst.Add(new ValidationErrorInfo("", "Id", 0, 0, "AuditError", string.Format("{0}审核失败,已提交:{1}",
|
|||
|
|
string.Join(",", failedobjs.Select(o => o.GetDynamicObjectItemValue<string>("BillNo"))), string.Join("\n", innerResult.ValidationErrors.Select(o => o.Message))), "", ErrorLevel.Error));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
////////////////////////////// 构造错误信息 //////////////////////////////
|
|||
|
|
if (!errorLst.IsNullOrEmpty())
|
|||
|
|
{
|
|||
|
|
result.ValidationErrors.AddRange(errorLst);
|
|||
|
|
}
|
|||
|
|
// 将操作结果合并到空操作结果中
|
|||
|
|
this.OperationResult.IsSuccess = result.IsSuccess;
|
|||
|
|
if (!this.OperationResult.IsSuccess)
|
|||
|
|
{
|
|||
|
|
this.OperationResult.ValidationErrors.Add(new ValidationErrorInfo("", "Id", 0, 0, "Error", string.Format("自动转换失败"), "", ErrorLevel.Error));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 判断操作结果是否成功,如果不成功,则直接抛错中断进程
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="opResult">操作结果</param>
|
|||
|
|
/// <param name="opOption">操作参数</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
private bool CheckOpResult(IOperationResult opResult, OperateOption opOption)
|
|||
|
|
{
|
|||
|
|
bool isSuccess = false;
|
|||
|
|
if (opResult.IsSuccess == true)
|
|||
|
|
{
|
|||
|
|
// 操作成功
|
|||
|
|
isSuccess = true;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (opResult.InteractionContext != null
|
|||
|
|
&& opResult.InteractionContext.Option.GetInteractionFlag().Count > 0)
|
|||
|
|
{// 有交互性提示
|
|||
|
|
// 传出交互提示完整信息对象
|
|||
|
|
this.OperationResult.InteractionContext = opResult.InteractionContext;
|
|||
|
|
// 传出本次交互的标识,
|
|||
|
|
// 用户在确认继续后,会重新进入操作;
|
|||
|
|
// 将以此标识取本交互是否已经确认过,避免重复交互
|
|||
|
|
this.OperationResult.Sponsor = opResult.Sponsor;
|
|||
|
|
// 抛出交互错误,把交互信息传递给前端
|
|||
|
|
new KDInteractionException(opOption, opResult.Sponsor);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// 操作失败,拼接失败原因,然后抛出中断
|
|||
|
|
opResult.MergeValidateErrors();
|
|||
|
|
if (opResult.OperateResult == null)
|
|||
|
|
{// 未知原因导致提交失败
|
|||
|
|
throw new KDBusinessException("", "未知原因导致自动提交、审核失败!");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
StringBuilder sb = new StringBuilder();
|
|||
|
|
sb.AppendLine("自动操作失败:");
|
|||
|
|
foreach (var operateResult in opResult.OperateResult)
|
|||
|
|
{
|
|||
|
|
sb.AppendLine(operateResult.Message);
|
|||
|
|
}
|
|||
|
|
throw new KDBusinessException("", sb.ToString());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return isSuccess;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|