單據自動轉換並審覈的方法示例

需求要點:在單據A的界面點擊「自動轉換」,則自動產生審覈態的單據B;若單據B不知足審覈條件,則維持「提交」態;若單據B不知足保存校驗,則維持「暫存」態;若轉換失敗,給出界面提示。

實現思路:
1.經過轉換規則來定義單據A到單據B的轉換關係,便於擴展,也便於使用已有的插件和服務;
2.定義一個空操做「自動轉換」,擴展AbstractOperationServicePlugIn,重寫EndOperationTransaction方法,方便處理事務;
3.依次調用單據轉換服務、暫存服務、保存服務、提交服務和審覈服務,以保證當前服務失敗時能維持前一服務的狀態;
4.根據上述服務調用的結果構造「自動轉換」的操做結果;
5.若需求變動,只能生成審覈態的單據B,不然不予生成,就要調用刪除服務將全部審覈不經過的單據刪除,再構造操做結果;也能夠直接拋出異常throw new KDBusinessException("", string.Join("\n", innerResult.ValidationErrors.Select(o => o.Message)))。

代碼示例:css

    public override void EndOperationTransaction(BOS.Core.DynamicForm.PlugIn.Args.EndOperationTransactionArgs e)
    {
    base.EndOperationTransaction(e);
    ////////////////////////////// 轉換 //////////////////////////////
    ConvertRuleElement ruleElement = AppServiceContext.ConvertService.GetConvertRules(this.Context, "srcFormId", "destFormId").Where(o => o.IsDefault == true).FirstOrDefault();
    ListSelectedRowCollection rows = new ListSelectedRowCollection();
    int i = 0;
    foreach (var srcData in e.DataEntitys)
    {
    ListSelectedRow row = new ListSelectedRow(srcData.GetDynamicObjectItemValue<string>("Id"), string.Empty, i++,"srcFormId");
    rows.Add(row);
    }
    OperateOption option = OperateOption.Create();
    option.SetVariableValue(BOSConst.CST_ConvertValidatePermission, true);
    PushArgs pushArgs = new PushArgs(ruleElement, rows.ToArray());
    // 轉換生成目標單
    ConvertOperationResult convResult = AppServiceContext.ConvertService.Push(this.Context, pushArgs, option);
    DynamicObject[] destObjs = convResult.TargetDataEntities.Select(r => r.DataEntity).ToArray();
    // 目標單元數據
    FormMetadata destFormMetadata = AppMetadataContext.LoadWithNoVerCheck(this.Context, "destFormId") as FormMetadata;
    // 操做選項
    option = OperateOption.Create();
    option.SetIgnoreWarning(false);
    // 上一步操做成功的目標單
    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));
    }
    this.OperationResult.MergeResult(result);
    }

引用:

引用經常使用dll.jpg

相關文章
相關標籤/搜索