U9 MatserOrg 档案删除范例说明 版 本 号 :V1.0 作者:李振 版本记录 【此部分要记录该文档形成过程中的历次版本变更过程及变更的内容】 版本 修改与参与人 修改时间 修改原因 修改概述 审批人1.0 李振 2006/06/23 原始文档建立 一.问题域说明 按照下发复制标准规定,可以下发复制的档案必须具备两个标准的属性“组织(Org)”和“来源组织(MasterOrg)”。下面表格说明一条档案记录 ABCD 从 A 组织被下发(或复制)到 B 组织。 ID Code Name Org MasterOrg 100001 ABCD 料品 1 A NULL 100002 ABCD 料品 1 B A 1、 一个组织原始建立的的档案记录中,MasterOrg 是等于 NULL 的; 2、如果是从其它组织下发(或复制)过来的,则 Org 等于下发的目的组织,MasterOrg等于来源组织。 3、如果当前登录组织是 B,则从其它组织 A 下发(复制)过来的记录(100002)是不允许删除的。 4、如果当前登录组织是 A,则删除档案记录(100001)的同时,会同步删除记录(100002)。 二.基本原理 可下发/复制的档案,在删除的时候进行数据的合法性检查和同步删除。通过 [Deleting]、[Deleted]事件订阅进行处理。 1、 登录组织 B,删除档案 100002,就会发出[Deleting]事件,[SendCopyEventBroker.cs]代码中就会进行合法性检查,合法性检查不通过(MasterOrg 不等于 NULL),就显示错误信息“下发复制记录不允许删除”; 2、 登录组织 A,删除档案 100001,就会发出[Deleting]事件,[SendCopyEventBroker.cs]代码中就会进行合法性检查,检查通过(MasterOrg 等于 NULL),就会预删除档案100001,然后发出[Deleted]事件,[SendCopyEventBroker.cs]代码中就会进行下发(复制)记录 100002 的同步删除。如果记录 100002 也删除成功,则事务完成;如果记录 100002 删除失败,则事务回滚,记录 100001 和 100002 都不被删除,同时显示错误信息。 三.关键代码及说明 1、事件侦听 SendCopyEventBroker.cs(88~128 行) ///
/// OnDeleting事件,进行删除时的合法性检查 /// [UFSoft.UBF.Eventing.Configuration.Failfast] public class OnDeletingSubscriber : UFSoft.UBF.Eventing.IEventSubscriber { public void Notify(params object[] args) { BusinessEntity e = args[0] as BusinessEntity; if (e != null) { if (!e.MDEntity.IsMain) return; //主子实体一体处理,入口是主实体;如果不是主实体,返回。 string fullname = e.GetType().FullName; if (Cache.IsContain(fullname)) ControlObj.DeleteValidate(e); //删除时的合法性检查 } } } ///
/// OnDeleted事件 /// [UFSoft.UBF.Eventing.Configuration.Failfast] public class OnDeletedSubscriber : UFSoft.UBF.Eventing.IEventSubscriber { public void Notify(params object[] args) { BusinessEntity e = args[0] as BusinessEntity; if (e != null) { if (!e.MDEntity.IsMain) return; //主子实体一体处理,入口是主实体;如果不是主实体,返回。 string fullname = e.GetType().FullName; if (Cache.IsContain(fullname)) ControlObj.SyncDelete(e); //同步删除下发复制的记录 } } } 2、删除检查 ControlObjExtend.cs(1156~1205 行) ///
/// 删除控制 /// ///
当前实例 public static void DeleteValidate(BusinessEntity entity) { //检索下发复制来源记录 SendPath sendPathSrc = SendPath.GetEntitySendPathSrc(entity.MDEntity.FullName, entity.ID, Convert.ToInt64(entity.Values["Org"])); //如果有来源记录 if (sendPathSrc != null) { //几个关系组件不做删除控制 if (entity.MDEntity.FullName == "UFIDA.U9.CBO.SCM.Customer.CustomerRelation" || entity.MDEntity.FullName == "UFIDA.U9.CB...