U9BE插件事务提交后处理

业务场景:将U9的基础档案数据同步到第三方系统,同步方式是U9中新建档案保存时将实体ID调用第三方系统消息接口通知到第三方系统,第三方系统接收到消息后,调用U9的接口根据ID查询实体数据。

 

问题:在实体的Inserted事件中发送消息给第三方系统,但是事务可能还没有提交到数据,第三方调用接口来查询的时候很可能查不到任何数据,在此种情况下,就需要在BE插件中判断当事务提交成功后再发送消息给第三方可以获取数据的标识。获取实体提交成功的demo:(也可参考附件示例,这种方案的缺点是如果报错无法反馈到UI)

Demo:

//定义个全局变量缓存实体,

UFSoft.UBF.Transactions.UBFTransactionContext.Current.Committed +=

                    new System.Transactions.TransactionCompletedEventHandler(BusinessTransactionSucess);//引用微软的System.Transactions.dll

private void BusinessTransactionSucess(object obj, System.Transactions.TransactionEventArgs e)

        {

//这个方法里面,当前事务已经完成了,且事务执行是成功的,数据库操作已经全部结束了, 取出全局变量的实体,写真正的业务逻辑,如调用接口等

      }

 

 

在方法BusinessTransactionSucess中发送消息,实体可定义成全部变量。

 //事务终止

 

                UFSoft.UBF.Transactions.UBFTransactionContext.Current.Aborted +=

                   new System.Transactions.TransactionCompletedEventHandler(BusinessTransactionAborted);

UFIDA.U9.MO.MO.MO mo = null;
private void Do_Notify(object[] args)
{
    #region 从事件参数中取得当前业务实体                                                     

    if (args == null || args.Length == 0 || !(args[0] is UFSoft.UBF.Business.EntityEvent))
        return;
    BusinessEntity.EntityKey key = ((UFSoft.UBF.Business.EntityEvent)args[0]).EntityKey;
    if (key == null)
        return;
    UFIDA.U9.MO.MO.MO holder = key.GetEntity() as UFIDA.U9.MO.MO.MO;
    if (holder == null)
        return;

    mo = holder;
    UFSoft.UBF.Transactions.UBFTransactionContext.Current.Committed += new System.Transactions.TransactionCompletedEventHandler(BusinessTransactionSucess);
    UFSoft.UBF.Transactions.UBFTransactionContext.Current.Aborted += new System.Transactions.TransactionCompletedEventHandler(BusinessTransactionAborted);
    #endregion                                                           

}

private void BusinessTransactionAborted(object obj, System.Transactions.TransactionEventArgs e)
{

}

private void BusinessTransactionSucess(object sender, TransactionEventArgs e)
{
    if (mo.OriginalData.DocState == MOStateEnum.Released && mo.DocState == MOStateEnum.Released && mo.Department.DescFlexField.PrivateDescSeg1.ToLower() == "true")
    {
        DispatchOrderDocType docType = DispatchOrderDocType.Finder.Find("BusinessType=" + mo.BusinessType.Value + " and Org.ID=" + mo.Org.ID + "");
        if (docType == null)
        {
            throw new Exception("根据MO业务类型找不到对应派工单业务类型的单据类型,请确认");
        }
        bool isHaveDispatchOrderDoc = DispatchOrderDoc.Finder.IsExists("MO.ID=" + mo.ID);
        if (!isHaveDispatchOrderDoc)
        {
            CreateDispatchOrderDocSrvProxy createDispatchOrderDocSrvProxy = new CreateDispatchOrderDocSrvProxy();
            List<PGDTOData> list = new List<PGDTOData>();
            PGDTOData pgdtodata = new PGDTOData();
            pgdtodata.MO = new CommonArchiveDataDTOData();
            pgdtodata.MO.ID = mo.ID;
            pgdtodata.BusinessDate = DateTime.Now;
            pgdtodata.DocType = new CommonArchiveDataDTOData(docType.ID, docType.Code, docType.Name);
            pgdtodata.Item = new ItemInfoData();
            pgdtodata.Item.ItemID = mo.ItemMaster.ID;
            pgdtodata.PlanStartDate = mo.StartDate;
            pgdtodata.PlanEndDate = mo.CompleteDate;
            pgdtodata.PGLineDTOList = new List<PGLineDTOData>();
            if (mo.MOOperations != null && mo.MOOperations.Count > 0)
            {
                int num = 1;
                foreach (MOOperation mooperation in mo.MOOperations)
                {
                    if (!mooperation.IsSubcontract)
                    {
                        PGLineDTOData pglineDTOData = new PGLineDTOData();
                        pglineDTOData.RowNo = num * 10;
                        pglineDTOData.MO = new CommonArchiveDataDTOData();
                        pglineDTOData.MO.ID = mo.ID;
                        pglineDTOData.MOOperator = new CommonArchiveDataDTOData();
                        pglineDTOData.MOOperator.ID = mooperation.ID;
                        if (mooperation != null)
                        {
                            pglineDTOData.WorkCenter = new CommonArchiveDataDTOData();
                            pglineDTOData.WorkCenter.ID = mooperation.WorkCenter.ID;
                        }
                        pgdtodata.PGLineDTOList.Add(pglineDTOData);
                        num++;
                    }
                }
            }
            if (pgdtodata.PGLineDTOList != null && pgdtodata.PGLineDTOList.Count > 0)
            {
                list.Add(pgdtodata);
                createDispatchOrderDocSrvProxy.PGDTOList = list;
                //using (UFSoft.UBF.Transactions.UBFTransactionScope scope = new UFSoft.UBF.Transactions.UBFTransactionScope(UFSoft.UBF.Transactions.TransactionOption.RequiresNew))
                //{
                List<PGBizKeyDTOData> datas = createDispatchOrderDocSrvProxy.Do();
                if (datas != null && datas.Count == 1)
                {
                    ApproveDispathOrder4ExternalProxy approveProxy = new ApproveDispathOrder4ExternalProxy();
                    approveProxy.DispatchOrderDTO = new PGConditionDTOData();
                    approveProxy.DispatchOrderDTO.DocNo = datas[0].DocNo;
                    approveProxy.Do();
                }
                //    scope.Commit();
                //}
            }
        }
    }

}

 

posted @ 2025-11-06 15:49  江境纣州  阅读(78)  评论(0)    收藏  举报