具体实施方式
图1示出了动态订单工作流模板实例器和解耦合器系统(“系统”)的分解操作。该系统利用下面进一步描述的硬件和软件部件来实现。该系统接收服务订单结构102。该服务订单结构102可以编码在可扩展标记语言(XML)文档中或者其他的编码或者文件中,并且可以遵守特定的服务订单模式。服务订单模式的一个例子示出在图11中。
服务订单结构102可以在该系统中作为服务订单交易事件到达,该事件具有分层级的结构,在该结构中主产品可以具有嵌套的子产品序列。图1中示出的服务订单结构102包括具有嵌套的子产品1至‘m’(标记为104和106)的主产品1至n(标记为102和104)。该子产品1 104具有两个嵌套的子产品2和3,标记为108和110。该子产品3 110具有另外的嵌套的子产品4,标记为112。该嵌套可以持续任意的深度。尽管复合的服务订单结构102可以具有分层级的结构,然而在服务订单结构102中分层级的结构不是强制性的。
服务订单结构102可以表示例如作为主产品的SIM卡激活,其具有的嵌套的伴随产品包括互联网接入、文本消息服务,以及短消息服务(SMS)。然而,服务订单结构102可以表示任何其他产品或者服务,或者产品或服务的组合。此外,服务订单结构102(以及下面描述的目标系统处理)不限于电信产品和服务。相反,服务订单结构102可以表示其他产业的产品和服务的订单。作为一个例子,主产品可以是计算机系统的订单,规定子产品包括视频卡、存储器、处理器以及硬盘驱动器,硬盘驱动器的附属产品包括作为预配置软件的Windows XP(TM)操作系统以及Word(TM)、Excel(EM),以及World of Warcraft(TM)游戏。作为另一个例子,服务订单结构102可以表示购买新汽车,包括作为主产品的汽车自身,以及子产品包括DVD播放器(具有远程控制附属产品)、导航系统以及加热真皮座椅。
该系统从服务订单结构102生成无级产品列表114。为此,该系统将服务订单结构102分解成各个产品动作条目114、116、118、120、122、124和126,其构成了无级产品列表114。
在一个实现中,该系统利用XPath语言,通过向服务订单结构102发出对在服务订单结构102中指定的产品和动作的每个实例进行定位的查询,来解析服务订单结构102。该系统由此在复合的服务订单结构102中定位每个单项产品。接着,该系统将单项产品作为单项产品动作条目114-126添加在无级产品列表114中。无级产品列表114可以编码在XML文档中或者其他文件中,遵守具体的产品列表模式。用于无级产品列表114的产品列表模式的一个例子在下面示出在产品列表模式表格中。
该系统从无级产品列表114中选择单项产品动作条目。产品动作条目可以包括例如产品标识符(例如,移动服务)以及动作标识符(例如,激活、挂起、修改或者删除)。该系统从产品动作条目生成各个扩展产品向量,其分别编码每个系统上的每个任务,以便实现在产品动作条目中指定的产品和动作。该系统搜索向量化文件128,作为准备扩展产品向量中的一个步骤。
向量化文件128可以包括一系列一个或多个产品结构和在每个产品结构内的一个或多个动作类型结构。在图1示出的例子中,向量化文件128包括产品结构1至‘j’(标记为130和132)。在产品结构1 130中,存在动作类型结构1至‘p’,标记为134和136。每个动作类型结构可以指定一个或多个目标系统,每个目标系统可以进一步指定在特定目标系统上执行的一个或多个任务。图1示出了目标系统1至‘k’,标记为138和140。在目标系统1(138)内,图1示出了任务1和2至‘r’,标记为142、144和146。因此,对于产品1(130)和动作1(134),供应任务包括在目标系统1(138)上的任务1(142)、任务2(144)至任务n(146),以及可能的其他目标系统上的其他任务。向量化文件128可以包括另外的信息,包括目标系统、任务和动作优先级,并且可以遵守下面在向量化文件模式表格中示出的向量化模式以及其他模式。
该系统在向量化文件128中定位与所选的产品动作条目匹配的任务序列列表142。该匹配可以通过在向量化文件128中定位匹配的产品和动作标签(或者使用产品动作条目中的任何其他指示)来找到。任务序列列表142可以指定多个目标系统,在其上多个离散的任务应该被执行以实现在所选的产品动作条目中指定的产品和动作。在图1示出的例子中,任务序列列表142指定了用于在目标系统1至“k”上实现产品1、动作1的任务。
对于每个目标系统上的每个任务,该系统创建单独的扩展产品向量。扩展产品向量的例子示出在图1中,并且标记为144、146、148和150。扩展产品向量144、146和148例如表示各个扩展产品向量,其作为向量化文件指定任务1、任务2到任务r(142-146),以便执行目标系统1上的产品1、动作1的结果而出现。扩展产品向量可以遵守在下面的扩展产品向量模式表格中示出的扩展产品向量模式或者其他模式。
该系统将扩展产品向量写成订单执行数据库152中的各个行。如下面更加详细地描述的,轮询子系统可以监视订单执行数据库152以及向特定目标系统分派用于执行在扩展产品向量中表示的任务的指令。具体地,轮询系统可以包括各个轮询器,其各自专用于每个目标系统。然而,轮询子系统可以以其他方式来实现,诸如使用比目标系统更少的轮询器并且将目标系统的分派负载分散到特定的轮询器。
上面提到的模式的例子如下:
服务订单模式表格 |
<?xml version=″1.0″encoding=″UTF-8″?><xs:schema xmlns:xs=″http://www.w3.org/2001/XMLSchema″targetNamespace=″NAMESPACE″elementFormDefault=″qualified″attributeFormDefault=″unqualified″><xs:element name=″Envelope″><xs:complexType><xs:sequence><xs:element name=″Header″><xs:complexType><xs:sequence><xs:element name=″BElnstanceId″type=″xs:string″/><xs:element name=″BEName″type=″xs:string″default=″ServiceOrderProvisioning″/><xs:element name=″CustomerCode″type=″xs:string″/><xs:element name=″ExecState″type=″xs:string″default=″Initial″/><xs:element name=″ReceivedDate″type=″xs:string″/><xs:element name=″OrganizationCode″type=″xs:string″/></xs:sequence></xs:complexType></xs:element><xs:element name=″ServiceOrderProvisioning″><xs:complexType><xs:sequence><xs:element name=″ServiceOrder″><xs:complexType><xs:sequence><xs:element name=″CustomerCode″type=″xs:string″min Occurs=″0″/> |
<xs:element name=″BillingAccountCode″type=″xs:string″/><xs:element name=″OrderDate″type=″xs:string″minOccurs=″0″/><xs:element name=″OrderId″type=″xs:string″/><xs:element name=″OrderPriority″type=″xs:string″/><xs:element name=″OrganizationCode″type=″xs:string″/><xs:element name=″SOStatus″type=″xs:string″/><xs:element name=″ActionType″type=″xs:string″/><xs:element name=″SalesForcelD″type=″xs:string″minOccurs=″0″/><xs:element name=″CustomerFirstName″type=″xs:string″minOccurs=″0″/><xs:element name=″CustomerLastName″type=″xs:string″minOccurs=″0″/><xs:element name=″OrderReason″type=″xs:token″minOccurs=″0″/><xs:element name=″FiscalCode″type=″xs:string″minOccurs=″0″/><xs:element name=″BirthDate″type=″xs:string″minOccurs=″0″/><xs:element name=″CustomerType″type=″xs:token″minOccurs=″0″/><xs:element name=″OldOrderld″type=″xs:string″minOccurs=″0″/><xs:element name=″OrderSubTy pe″type=″xs:string″minOccurs=″0″/></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element></xs:schema> |
产品列表模式表格 |
<?xml version=″1.0″encoding=″UTF-8″?><xs:schema xmlns:xs=http:″http://www.w3.org/2001/XMLSchema″targetNamespaoe=″NAMESPACE″<xs:complexType name=″Producf″><xs:sequence><xs:element name=″ActionCode″type=″xs:string″minOccurs=″0″/><xs:element name=″ProductlnstanceId″type=″xs:string″/><xs:element name=″BillingAcountCode″type=″xs:string″/><xs:element name=″StartDate″type=″xs:string″minOccurs=″0″/><xs:element name=″EndDate″type=″xs:string″minOccurs=″0″/> |
<xs:element name=″DueDate″type=″xs:string″minOccurs=″0″/><xs:element name=″ModifyDate″type=″xs:string″minOccurs=″0″/><xs:element name=″CustomerCode″type=″xs:string″minOccurs=″0″/><xs:element name=″LineNumber″type=″xs:string″/><xs:element name=″CRMOrderId″type=″xs:string″/><xs:element name=″ParentOrderltemId″type=″xs:string″minOccurs=″0″/><xs:element name=″RootOrderltemId″type=″xs:string″minOccurs=″0″/><xs:element name=″ServiceAccountDesc″type=″xs:string″/><xs:element name=″ServiceAccountId″type=″xs:string″/><xs:element name=″Serviceld″type=″xs:string″minOccurs=″0″/><xs:element name=″SOrderType″type=″xs:string″/><xs:element name=″ParentProductId″type=″xs:string″minOccurs=″0″/><xs:element name=″ProductCatalogId″type=″xs:string″/><xs:element name=″OrganizationCode″type=″xs:string″minOccurs=″0″/><xs:element name=″TopProductId″type=″xs:string″minOccurs=″0″/><xs:element name=″SalesForceID″type=″xs:string″minOccurs=″0″/><xs:element name=″ServiceType″type=″xs:string″/><xs:elenent name=″ActivationFlg″type=″xs:string″/><xs:element name=″BillingFlg″type=″xs:string″/><xs:element name=″IntegrationId″type=″xs:string″/><xs:element name=″Status″type=″xs:string″minOccurs=″0″/><xs:element name=″TariffName″type=″xs:string″minOccurs=″0″/><xs:element name=″TarifflD″type=″xs:string″minOccurs=″0″/><xs:element name=″PPAlias″type=″xs:string″minOccurs=″0″/><xs:element name=″BankAccountAlias″type=″xs:string″minOccurs=″0″/><xs:element name=″UserContact″minOccurs=″0″><xs:complexType><xs:sequence><xs:element name=″ContactId″type=″xs:string″/><xs:element name=″ContactEmailAddress″type=″xs:string″/><xs:element name=″ContactFirstName″type=″xs:string″/><xs:element name=″ContactLastName″type=″xs:string″/><xs:element name=″ContactGender″type=″xs:string″/><xs:element name=″ContactWorkPhone″type=″xs:string″/></xs:sequence></xs:complexType></xs:element><xs:element name=″ListOfAttribute″minOccurs=″0″><xs:complexType><xs:sequence><xs:element name=″Attribute″minOccurs=″0″maxOccurs=″unbounded″><xs:complexType><xs:sequence><xs:element name=″ActionCode″type=″xs:string″/><xs:element name=″Parentid″type=″xs:string″minOccurs=″0″/><xs:element name=″Name″type=″xs:string″/><xs:element name=″Value″type=″xs:string″/> |
</xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element><xs:element name=″ListOfProduct″minOccurs=″0″><xs:complexType><xs:sequence><xs:element ref=″Product″minOccurs=″0″maxOccurs=″unbounded″/></xs:sequence></xs:complexType></xs:element><xs:elementname=″ServiceAccount″><xs:complexType><xs:sequence><xs:element name=″ListOfAddress″minOccurs=″0″><xs:complexType><xs:sequence><xs:element name=″Address″minOccurs=″0″><xs:complexType><xs:sequence><xs:element name=″Id″type=″xs:string″/><xs:element name=″PrimaryAddressId″type=″xs:string″/><xs:element name=″AddressNum″type=″xs:string″/><xs:element name=″StreetType″type=″xs:string″/><xs:element name=″City″type=″xs:string″/><xs:element name=″Country″type=″xs:string″/><xs:element name=″State″type=″xs:string″/><xs:element name=″ZIP″type=″xs:string″/><xs:element name=″Address″type=″xs:string″/></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element><xs:element name=″ListOfContact″minOccurs=″0″><xs:complexType><xs:sequence><xs:element name=″Contact″minOccurs=″0″><xs:complexType><xs:sequence><xs:element name=″Id″type=″xs:string″/><xs:element name=″PrimaryContactId″type=″xs:string″/> |
<xs:element name=″ContactPhone″type=″xs:string″/><xs:element name=″ContactEmail″type=″xs:stri ng″/><xs:element name=″ContFirstName″type=″xs:string″/><xs:element name=″ContLastName″type=″xs:string″/><xs:element name=″ContactWorkPhone″type=″xs:string″/><xs:element name=″ContactTitle″type=″xs:string″/></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType> |
向量化文件模式表格 |
<?xml version=″1.0″encoding=″UTF-8″?><xs:schema xmlns:xs=″http://www.w3.org/2001/XMLSchema″xmlns=″REFERENCE″targetNamespace=″REFERENCE″elementFormDefault=″qualified″attributeFormDefault=″unqualified″><xs:element name=″ProductCatalog″type=″ProductCatalog″/><xs:element name=″Product″type=″product″/><xs:element name=″Action″type=″Action″/><xs:element name=″TargetSystem″type=″TargetSystem″/><xs:element name=″Name″type=″xs:string″/><xs:complexType name=″Product″><xs:sequence><xs:element ref=″Name″/><xs:element ref=″ExternalIDType″/><xs:element ref=″Action″minOccurs=″0″maxOccurs=″unbounded″/></xs:sequence></xs:complexType><xs:complexType name=″ProductCatalog″><xs:sequence><xs:element ref=″Product″minOccurs=″0″maxOccurs=″unbounded″/> |
</xs:sequence></xs:complexType><xs:complexType name=″Task″><xs:sequence><xs:element ref=″Name″/><xs:element name=″TaskPriority″type=″xs:string″/></xs:sequence></xs:complexType><xs:complexType name=″TargetSystem″><xs:sequence><xs:element ref=″Name″/><xs:element name=″ActionPriority″type=″xs:string″/><xs:element ref=″TargetSystemPriority″minOccurs=″0″/><xs:element ref=″Task″maxOccurs=″unbounded″/></xs:sequence></xs:complexType><xs:element name=″Task″type=″Task″/><xs:element name=″ExternalIDType″><xs:complexType><xs:sequence><xs:element name=″Type″type=″xs:string″minOccurs=″0″maxOccurs=″unbounded″/></xs:sequence></xs:complexType></xs:element><xs:attribute name=″actionType″type=″xs:string″/><xs:complexType name=″Action″><xs:sequence><xs:element ref=″TargetSystem″maxOccurs=″unbounded″/></xs:sequence><xs:attribute ref=″actionType″/></xs:complexType><xs:element name=″TargetSystem Priority″type=″xs:string″/></xs:schema> |
扩展产品向量模式表格 |
<?xml version=″1.0″encoding=″UTF-8″?><xs:schema xmlns:xs=″http://www.w3.org/2001/XMLSchema″xmlns=″REFERENCE″tarqetNamespace=″REFERENCE″elementFormDefault=″qualified″attributeFormDefault=″unqualified″><xs:element name=″Records″><xs:complexType><xs:sequence><xs:element ref=″Record″minOccurs=″0″maxOccurs=″unbounded″/></xs:sequence></xs:complexType></xs:element><xs:element name=″Record″><xs:complexType><xs:sequence><xs:element name=″TaskID″type=″xs:string″/><xs:element name=″OrderID″type=″xs:string″/><xs:element name=″ProductID″type=″xs:string″/><xs:element name=″ParentProductID″type=″xs:string″/><xs:element name=″MainProductID″type=″xs:string″/><xs:element name=″CustomerCode″type=″xs:string″/><xs:element name=″ActionCode″type=″xs:string″/><xs:element name=″Action Priority″type=″xs:string″/><xs:element name=″Receivedate″type=″xs:string″/><xs:element name=″LastUpdateDate″type=″xs:string″/><xs:element name=″Status″type=″xs:string″/><xs:element name=″TargetSystem″type=″xs:string″/><xs:element name=″TargetSystem Priority″type=″xs:string″/><xs:element name=″SequenceID″type=″xs:string″/><xs:element name=″CurrentTask″type=″xs:string″/><xs:element name=″TaskPriority″type=″xs:string″/></xs:sequence></xs:complexType></xs:element></xs:schema> |
图2示出了动态订单工作流模板实例器和解耦合器系统200的示例性实现。系统200包括订单处理器(OP)入口点逻辑202、OP分解器逻辑204、以及OP选择器逻辑206。在操作中,服务订单(SO)提交器(例如,SO提交器208和210)将服务订单结构102传送给OP入口点逻辑202。SO提交器208和210可以表示自动化过程、处理系统、或者服务订单结构102的手动提交器。在一个实现中,SO提交器208和210使用web服务接口212将服务订单结构102传送到OP入口点逻辑202。OP入口点逻辑202可以包括用于接收web服务请求、发出确认、在可选的事件数据库214中存储服务订单结构、以及将服务订单结构传送到OP分解器逻辑204的逻辑。在其他实现中,SO提交器通过其他通信接口发送服务订单结构,所述接口诸如是远程过程调用、共享存储器、共享文件、通信套接字、或者其他接口。
OP分解器逻辑204将接收的任何服务订单结构的分层级的结构扁平化成无级产品列表114。一种用于扁平化分层级的结构的技术包括:执行XPath查询以定位针对某些产品的某些动作的各个请求,和为每个已定位请求创建单项产品动作条目。然而,可以替代地使用其他文件解析、搜索或者数据定位和提取技术来在服务订单结构中找到所请求的动作。
OP分解器204将无级产品列表114传给OP选择器逻辑206。如上面详细解释的,对于无级产品列表114中的每个产品动作条目,OP选择器逻辑206在向量化文件128中确定匹配的任务序列列表142。
该系统在向量化文件128中定位匹配所选择的产品动作条目的任务序列列表142。对于每个目标系统上的每个任务,OP选择器逻辑206创建单独的扩展产品向量并且将各个扩展产品向量写成订单执行数据库512中产品表格中的唯一的行。
图3示出了订单执行数据库152的示例性实现。订单执行数据库152包括产品表格302、订单数据表格304、任务跟踪表格306、以及错误数据表格308。订单执行数据库152还包括订单表格310、产品数据表格312、以及任务依赖性表格314。表格302-314中的每个在下面的表格中详细地描述。
产品表格302保存与每个产品有关的信息,并且可以针对每个产品的每个目标系统上的每个任务包含一行。每个任务一行有利于完成其中两个产品必须以不同优先级在两个目标系统上处理的场景。每个任务一行还有利于其他处理场景,诸如当产品1必须在目标系统1和目标系统2上处理,但是产品2必须仅在产品1在目标系统2上处理之后才在目标系统2上处理的场景。
任务跟踪表格306将任务的任何期望的外部标识符与特定的任务标识符连接。外部标识符的例子包括移动用户综合服务数字网络(MSISDN)标识符、国际移动用户身份(IMSI)标识符、以及目标系统或者其他实体使用的便于参考的其他标识符。
产品数据表格312保存链接到ProductID的、具有与从服务订单结构提取的与特定产品或者动作匹配的产品信息的XML消息。
订单数据表格304将保存具有订单信息的XML消息。
错误数据表格308保存在处理期间出现的错误代码和对错误的描述。
任务依赖性表格314定义了任务之间的依赖关系。如将从下面的轮询器搜索查询中看出的,任务依赖关系有助于保证上级任务在下级任务之前完成,由此防止了尝试执行乱序的任务和可能导致的错误。
订单表格310保存用于订单的状态信息,包括订单处理的状态,以及发送给支持处理系统的响应状态。ResponseStatus:该字段存储针对上行链路系统(诸如CRM系统)的反馈响应的状态。该状态可以是:例如‘1’指示反馈响应已经发送,而‘0’指示反馈响应还未发送。反馈响应可以被调度为在状态改变时传输给上行链路系统。Status:该字段描述订单的当前状态。订单状态的例子包括已完成、打开、未决、部分完成、以及失败。例如,如果所有产品都成功供应,则Status可以是已完成。如果少于第一预设阈值数量(例如,2)的产品已经供应失败,则Status可以是部分完成。如果多于第二预设阈值数量的产品已经供应失败,或者父产品已经供应失败,则Status可以是失败。
无级产品列表114中的产品动作条目的一个例子在下面示出在示例性的产品条目表格中。在该例子中,在一个特定的产品上指定一个添加(Add)动作,并且给出了相关的信息,诸如用户信息、帐户信息、资费表(tariff)ID、状态、父订单项目和根订单项目、以及其他信息。
示例性产品条目表格 |
One product entry in a non-hierarchical product list:-<ns0:Product xmlns:ns0=″NAMESPACE″><ns0:ActionCode>Add</ns0:ActionCode><ns0:ProductlnstanceId>2-AKV56</ns0:ProductlnstanceId><ns0:BillingAccountCode/><ns0:StartDate/><ns0:EndDate/><ns0:DueDate/><ns0:ModifyDate/>ns0:CustomerCode>1000001xx600</ns0:CustomerCode><ns0:LineNumber>3</ns0:LineNumber><ns0:CRMOrderId>2-AKV4L</ns0:CRMOrderId><ns0:ParentOrderltemId>2-AKV4O</ns0:ParentOrderltemld><ns0:RootOrderttemld>2-AKV4O</ns0:RootOrderltemId><ns0:ServiceAccountDesc/><ns0:ServiceAccountId/><ns0:ServiceId/><ns0:SOrderType>100</ns0:SOrderType><ns0:ParentProductId>9007</ns0:ParentProductId><ns0:ProductCatalogId>9007</ns0:ProductCatalogId><ns0:OrganizationCode/><ns0:TopProductId/><ns0:SalesForceID/><ns0:SeMceType/><ns0:ActivationFlg/><ns0:BillingFlg>N</ns0:BillingFlg><ns0:IntegrationId>2-AKV56</ns0:Integration Id><ns0:Status/><ns0:TariffName>Easy Time</ns0:TariffName><ns0:TariffID>1</ns0:TariffID> |
<ns0:PPAlias/><ns0:BankAccountAlias/>-<ns0:UserContact><ns0:ContactId/><ns0:ContactEmailAddress>name@serrer.com</ns0:ContactEmailAddress><ns0:ContactFirstName>FIRST</ns0:ContactFirstName><ns0:ContactLastName>LAST</ns0:ContactLastName><ns0:ContactGender/><ns0:ContactWorkPhone/></ns0:UserContact><ns0:ListOfAttribute/>-<ns0:ServiceAccount><ns0:ListOfAddress/><ns0:ListOfContact/></ns0:ServiceAccount></ns0:Product> |
向量化文件128中的条目的一个例子在下面示出在示例性向量化文件条目表格中。在该例子中,向量化文件针对产品9007定义了Add(添加)、update(更新)、Suspend(挂起)以及Delete(删除)动作。该表格还示出了Add动作的特定结构。在该表格中,示出了Add动作的任务序列列表,包括两个<TargetSystem>标签,每个标签包括动作优先级、目标系统优先级、以及<Task>。换言之,Add动作的任务序列列表包括两个不同目标系统上的任务。任何系统上的任何动作可以包括在任务序列列表中捕获的多个系统上的多个任务。
示例性向量化文件条目表格 |
Vectorization File Entry:<n1:Product><n1:Name>9007</n1:Name><n1:ExternalIDType/><n1:Action n1:actionType=″Add″><n1:Action n1:actionType=″Update″><n1:Action n1actionType=″Suspend″><n1:Action n1:actionType=″Delete″></n1:Product> |
Add Action:<n1:Action n1:actionType=″Add″><n1:TargetSystem><n1:Name>MHO</n1:Name><n1:ActionPriority>2</n1:ActionPriority><n1:TargetSystemPriority>1</n1:TargetSystemPriority><n1:Task><n1:Name>Activation</n1:Name><n1:SuperiorTask/></n1:Task></n1:TargetSystem><n1:TargetSystem><n1:Name>Siebel</n1:Name><n1:ActionPriority>2</n1:ActionPriority><n1:TargetSystemPriority>2</n1:TargetSystemPriority><n1:Task><n1:Name>Activation</n1:Name><n1:SuperiorTask/></n1:Task></n1:TargetSystem></n1:Action> |
扩展产品向量的一个例子在下面示出在示例性扩展产品向量表格中。当每个扩展产品向量被逐行写进服务执行数据库152中的产品表格中时,向量的分量对应于产品表格字段。在该例子中,该扩展产品向量定义了激活任务,其需要在MHO目标系统上的Add动作,其具有任务优先级1、目标系统优先级1以及动作优先级1。
示例性扩展产品向量表格 |
<ns0:Record><ns0:TaskID>264205666202884</ns0:TaskID><ns0:OrderlD>2-AKV4L</ns0:OrderID><ns0:ProductID>2-AKV4O</ns0:ProductID> |
<ns0:ParentProductID/><ns0:MainProductID>2-AKV4O</ns0:MainProductID><ns0:CustomerCode>100000195600</ns0:CustomerCode><ns0:ActionCode>Add</ns0:ActionCode><ns0:ActionPriority>1</ns0:ActionPriority><ns0:ReceiveDate>2008-04-29T12:05:20.801+02:00</ns0:ReceiveDate><ns0:LastUpdateDate>2008-04-29T12:05:20.801+02:00</ns0:LastUpdateDate><ns0:Status>New</ns0:Status><ns0:TargetSystem>MHO</ns0:TargetSystem><ns0:TargetSystemPriority>1</ns0:TargetSystemPriority><ns0:SequenceID>1213</ns0:SequenceID><ns0:CurrentTask>Activation</ns0:CurrentTask><ns0:TaskPriority>1</ns0:TaskPriority><ns0:CatalogId>9000</ns0:CatalogId><ns0:BillingAccount>100000195601</ns0:BillingAccount></ns0:Record> |
订单执行数据库152提供对各个目标系统有用的特定数据库视图的基础。目标系统上的轮询器可以使用该视图来确定在每个任务之下候选的用于在目标系统上执行的细节。例如,每个目标系统上的轮询器可以构建示出应该在目标系统上处理的产品的视图。目标系统轮询器可以访问该视图,并且在每次获取通过期间获得已配置数量的产品以供处理。该视图中的行可以通过任务和动作的优先级以及日期来排序。一个有益的结果是先处理先到达的产品。然而,其他优先级顺序可以被强制执行。
图4示出了定示例性视图表格400,其定义了目标系统视图。该视图中的条目是从订单执行数据库152中的表格中获取的,并且在上面进行了描述。
图5示出了动态订单工作流模板实例器和解耦合器系统200可以以硬件、软件或者二者来实现的,用于分解复合的分层级的服务订单结构的逻辑的流程图500。首先,OP入口点逻辑202接收服务订单结构,并且可以本地将该服务订单结构转换成遵守任何期望的模式(例如,针对图11中示出的公共数据模型),以便进一步处理。接着,该系统将进入的服务订单结构写入(502)日志。
例如,下面的数据可以被记录进日志数据库:Timestamp(时间戳);System:该服务订单所涉及的系统(当没有涉及任何其他系统并且该服务订单来自内部进程时,其可以是可选的);BusinessEvent(业务事件):与日志条目有关的业务,例如‘创建用户’(如果没有触发服务订单的业务事件,其可以是可选的);ProcessName(进程名称):生成日志条目的进程的名称;TaskName(任务名称):进程的当前操作(输入、输出、对支持系统的调用、并常);Message(消息):与日志条目有关的错误或信息;ID:不是用户代码或者订单ID的、用于跟踪序列的特定ID;CustomerCode(用户代码):当前处理的用户代码;OrderId:当前处理的订单的订单ID;Severity(严重度)以及XMLContent:作为字符串内容存储在日志条目中的服务订单的XML。
OP分解器逻辑204将服务订单结构102中的分层级的结构扁平化,以生成(504)无级产品列表114。系统200将到无级产品列表114的转换写入(506)日志。被记录的数据可以包括上面针对(502)讨论的数据的任意组合。OP分解器逻辑204还在订单数据表格304中存储(508)原始的服务订单结构数据,由此维护原始的服务订单结构的记录。
OP选择器逻辑206读取(510)向量化文件128以准备创建扩展产品向量。为此,OP选择器逻辑206读取(510a)向量化文件128,例如从作为XML字符串的外部文件中读取。OP选择器逻辑206接着基于预定义的向量化文件模式将XML字符串解析(510b)成XML模式树。OP选择器逻辑206还可以设置(510c)共享变量(或者其他参数),以反映所解析的XML字符串的内容。共享变量可以提供进程间的通信机制。一个进程将配置数据加载进变量,使得配置被缓存在存储器中。OP选择器206可以使用共享变量来访问配置数据。当配置文件更新时,该文件可以被重新加载进共享全局变量。共享全局变量可以保存从向量化文件128中读取的XML结构。
OP选择器逻辑206确定(512)可应用于实现无级产品列表114中的任何产品和动作的目标系统、动作和优先级。OP选择器逻辑206接着针对服务订单结构102和无级产品列表114中的每个产品和动作(例如,添加、挂起、修改、无动作)创建(514)目标系统列表和目标系统上的具体任务。在一个实现中,OP选择器逻辑产生由<TargetSystemList>标记限定的列表。在该列表中的是各个<TargetSystem>条目(包括目标系统名称、动作优先级和目标系统优先级),并且在每个目标系统内的是待执行的任务的列表(包括任务名称、上级任务(如果存在的话)、以及任务优先级)。为此,OP选择器逻辑206可以提取向量化文件128中与无级产品列表114中的条目中规定的特定产品和动作匹配的部分,并且将所提取的部分添加到目标系统列表中。
OP选择器逻辑206还创建(516)扩展产品向量。扩展产品向量各自指定每个目标系统上的每个任务,用于实现特定产品和动作。每个扩展产品向量可以包括在产品表格312和示例性扩展产品向量表格中示出的字段,包括例如TaskID、OrderID、ProductID、动作代码、动作优先级、目标系统名称、目标系统优先级、任务优先级、以及当前任务ID。
OP选择器逻辑206还将外部ID(MSISDN号)以及外部ID类型(例如MSISDN)与该OP选择器逻辑206所分配的关联的TaskID一起累积(518)进结构。ExternalId可以是与系统200针对产品表格302中的列生成的数据不同的产品或任务的任何标识符。系统200使用外部ID进行跟踪。作为结果,系统200可以通过外部ID搜索特定产品或者任务或者订单。ExternalIdType标识了外部ID是什么。例如,当外部ID是电话号码时,ExternalIdType可以是“MSISDN”。向量化文件128保存外部ID和外部ID类型。系统200读取向量化文件128,并且从服务订单结构102提取对应的数据。OP选择器逻辑206在存储器中创建临时结构以保存针对当前任务的TaskID、外部ID、外部ID类型映射。因为OP选择器逻辑206映射每个任务的外部ID,所以OP选择器逻辑206存储(520)来自之前迭代的映射,并且随着进程持续而累积新映射。下面的累积的映射表格示出了OP选择器逻辑206生成的两个TaskID、ExternalID、ExternalIDType映射的例子。
累积的映射表格 |
<ns0:TrackingInfo xmlns:ns0=″NAMESPACE.xsd″><:ns0:RecordTS><ns0:TaskID>274084625786788</ns0:TaskID><ns0:ExternalID>3771200404</ns0:ExternalID><ns0:ExternalIDType>MSISDN</ns0:ExternalIDType></ns0:RecordTS><ns0:RecordTS><ns0:TaskID>274084625786788</ns0:TaskID><ns0:ExternalID>552110000001068</ns0:ExternalID><ns0:ExternalIDType>IMSI</ns0:ExternalIDType></ns0:RecordTS></ns0:TrackingInfo> |
OP选择器逻辑206还可以将累积的<TrackingInfo>记录转换成由单个<TrackingInfo>标签限定的合并列表,在该列表中多个<RecordTS>标签存储累积的映射(522)。下面,一个例子示出在合并的映射表格中。
合并的映射表格 |
<ns0:TrackingInfo xmlns:ns0=″NAMESPACE.xsd″><ns0:RecordTS><ns0:TaskID>264193781978507</ns0:TaskID><ns0:ExternalID>3771200404</ns0:ExternalID><ns0:ExternalIDType>MSISDN</ns0:ExternalIDType></ns0:RecordTS> |
<ns0:RecordTS><ns0:TaskID>264193781978507</ns0:TaskID><ns0:ExternalID>552110000001068</ns0:ExternalID><ns0:ExternalIDType>IMSI</ns0:ExternalIDType></ns0:RecordTS> …</ns0:TrackingInfo> |
OP选择器逻辑206还可以针对每个产品重复累积(524)数据,以作为行存储在订单执行数据库152中。一旦已经针对每个产品累积了数据,则OP选择器逻辑206将数据作为行写入订单执行数据库152中。OP选择器逻辑206可以将产品数据写进(526)产品数据表格312,并且将订单数据写进(528)订单数据表格304。
另外,OP选择器逻辑206将每个扩展产品向量作为行写入(530)产品表格302中。OP选择器逻辑206还将跟踪向量作为单独的行写入(532)任务跟踪表格306中,并且将依赖性向量作为单独的行写入(532)任务依赖性表格314中。跟踪向量和依赖性向量的例子示出在下面的跟踪和依赖性表格中。
跟踪和依赖性表格 |
用于跟踪表格306的跟踪向量的示例:<ns0:RecordTS><ns0:TaskID>264193781978507</ns0:TaskID><ns0:ExternalID>3771200404</ns0:ExternalID><ns0:Ex:ternalIDType>MSISDN</ns0:ExternalIDType><ns0:RecordTS>Example of dependency vector for dependencies table 314:<TaskDependency><TaskId>264205666202884</TaskId><SuperiorTask>264193781978507</SuperiorTask></TaskDependency> |
在成功处理服务订单结构102之后,系统102可以通过web服务或者去往OP提交器的其他接口向OP提交器返回成功消息。当异常发生时,系统200可以捕获(534)异常,将它们公布(536)给异常日志,并且向OP提交器发回错误消息。
返回图2,系统200还包括轮询器,其检查订单执行数据库152以查找针对特定产品的并且等待在特定目标系统上执行的新任务。在图2示出的例子中,第一数据库轮询器214观察订单执行数据库152中要提交给第一供应系统216进行执行的任务。类似地,第二数据库轮询器218观察订单执行数据库152中要提交给第二供应系统220进行执行的任务。可以存在任何数量的数据库轮询器以及目标系统。此外,单个轮询器可以为单个或者多个目标系统服务,或者多个轮询器可以为单个或者多个目标系统服务。
目标系统、轮询器和其他实体可以向数据库更新器222提供关于任务执行的反馈。继而,数据库更新器222将状态信息写回订单执行数据库152。该系统200可以使用状态信息进行监视和审阅目的,以便审阅、验证和解决在其执行的任何阶段的任务执行。
系统200还可以包括订单组合器逻辑224,其与任何特定的数据库轮询器协作地进行操作。可选的订单组合器逻辑224可以接受从订单执行数据库152获取的多个扩展产品向量,并且从多个扩展产品向量重构分层级的产品或任务列表。一个好处是:能够更高效地处理作为分层级任务集合提交的任务组的目标系统可以从订单组合逻辑224获得这种分层级的任务组,而不是分别处理每个任务。然而,即使没有订单组合器逻辑224,目标系统也可以逐个执行任务。
图6示出了针对轮询器逻辑,例如数据库轮询器214和218的流程图600,其监控服务订单数据库,并且将任务执行请求提交给目标系统。数据库轮询器开始执行,并且系统200可以针对轮询器初始化一个或者多个定时器。定时器可以为轮询器指定任何期望间隔处的执行时间,以便轮询服务订单数据库152中要在目标系统上执行的任务。
数据库轮询器获取(602)轮询变量。轮询变量可以包括PollSize(轮询大小),即一次从服务订单数据库152中提取的行的数量。也可能存在其他的轮询变量设置,并且轮询变量可以存储在外部XML文件中,以及从其中读取。数据库轮询器还从服务订单列表152中获取(604)针对目标系统的产品。在一个实现中,数据库轮询器执行Java数据库连接性(JDBC)调用,以获得定义目标系统的任务的行,并且使用在特定于目标系统的服务订单数据库152上创建的数据库视图。
下面的目标系统视图创建表格示出了数据库轮询器可以执行以构建目标系统的数据库视图(参见图4)的视图创建逻辑的例子。每个轮询器可以变化用于创建任何特定的目标系统的视图的方式。在表格中示出的例子中,该视图是针对名为‘VAS’的目标系统创建的,但是可以通过调整视图选择逻辑以指定不同的目标系统系统名称和通过对针对该特定目标系统的选择标准或者优先级处理的任何其他期望的改变来指定任何其他目标系统。视图创建逻辑指定‘VAS,系统的‘新’任务,并且执行对优先级和错误处理的严格控制。
具体地,在标记为/*TARGETSYSTEMPRIORITY*/(目标系统优先级)的点处,视图创建逻辑确保该视图包括最小数字的目标系统优先级(即,最高优先级),直到完成当前产品的所有任务。该视图创建逻辑还确保当产品的状态是“新”、“处理中”或者“已加载,,时,没有其他更高优先级任务具有‘失败’状态。当具有较高目标系统优先级(较小的数字)的产品任务被完成时,接着进行具有较低目标系统优先级(较大的数字)的产品任务。
此外,在标记为/*ACTIONPRIORITY*/(动作优先级)的点处,视图创建逻辑确保当前视图取得用于订单的产品的最小数字的动作优先级。当产品的状态是“新”、“处理中”或者“已加载”时,视图创建逻辑还检查(在该逻辑的最后)以确保针对当前订单ID没有任务是“失败”的。当具有较高动作优先级(较小的数字)的产品任务被完成时,接着进行具有较低动作优先级(较大的数字)的产品任务。
另外,在标记为/*TASKID*/(任务ID)的点处,视图创建逻辑确保该视图获取被包括在任务依赖性表格中的产品的TaskID,并且同时确保所有的上级任务(依赖性)都完成。当在针对当前任务ID的任务依赖性表格中没有定义任何依赖性时,该视图创建逻辑继续前进而不需要管理首先执行上级任务。
在标记为/*ACTIONCODE*/(动作代码)的位置,该视图创建逻辑确保具有ActionCode=’Add’的任务总是被获取而不需要进一步检查。如果ActionCode不是’Add’,则该视图创建逻辑基于账单帐户代码(以便确保针对一个账单帐户的订单的关联性)检查具有ActionCode=’Add’的产品是否已经完成或者该产品是否不存在于产品表格中(例如,产品已完成并且从表格中删除)。在该情况下,针对当前账单帐户代码可以完成任何其他动作。
目标系统视图创建表格 |
CREATE OR REPLACE VIEW VAS_VIEW(TASKID,ORDERID,PRODUCTID,PARENTPRODUCTID,MAINPRODUCTID,CUSTOMERCODE,ACTIONCODE,ACTIONPRIORITY,STATUS,SEQUENCEID,PRODUCTXMLDATA,CURRENTTASK,ORDERXMLDATA,TARGETSYSTEMPRIORITY)ASSELECT taskid,productdata.orderid,productdata.productid,parentproductid,mainproductid,customercode,actioncode,actionpriority,status,sequenceid,productdata.productxmldata,currenttask,orderdata.orderxmldata,targetsystempriority |
FROM products t,productdata,orderdataWHERE t.productid=productdata.productidAND t.orderid=orderdata.orderidAND t.status=′New′AND t.targetsystem=′VAS′/*TARGETSYSTEMPRIORITY*/AND t.targetsystempriority=(SELECT MIN(t1.targetsystempriority)FROM products t1WHERE t1.productid=t.productidAND(t1.status=′New′OR t1.status=′Processing′OR t1、status=′Loaded′)AND(SELECT COUNT (*)FROM products t1WHERE t1.productid=t.productidAND t1.targetsystempriority<t.targetsystempriorityAND t1.status=′Failed′)=0)/*ACTIONPRIORITY*/AND t.actionpriority=(SELECT MIN(t1.actionpriority)FROM products t1WHERE t1.orderid=t.orderidAND(t1.status=′New′OR t1.status=′Processing′OR t1.status=′Loaded′)AND t1.targetsystem=′VAS′)/*TASKID*/AND(t.taskid=ANY(SELECT T1.taskidFROM products t1 |
WHERE t1.taskid NOT IN (SELECTDISTINCT td.taskFROM products t1,task_dependencies tdWHERE t1.taskid=td.task))OR t.taskid=ANY(SELECT s1.taskFROM(SELECT td.task,COUNT(*)AS count1FROM products t1,task_dependencies tdWHERE t1.taskid=td.sup_taskAND t1.status=′Complete′GROUP BY td.task)s1,(SELECT td.task,COUNT(*)AS count2FROM products t1,task_dependencies tdWHERE t1.taskid=td.sup_taskGROUP BY td.task)s2WHERE s1.counnt1=s2.count2.AND s1.task=s2.task))/*ACTIONCODE*/AND(t.actioncode=′Add′ORt.actioncode=ANY(SELECT DISTINCT t1.actioncodeFROM products t1WHERE t1.billingaccountcode=t.billingaccountcodeAND t1.actioncode<>′Add′AND(SELECT COUNT(*)FROM products t1WHERE t1.billingaccountcode=t.billingaccountcodeAND t1.actioncode=′Add′AND(t1.status=′New′OR t1.status=′Loaded′OR t1.status=′Processing′OR t1.status=′Failed′ |
)AND t1.targetsystem=′VAS′)=0))AND(SELECT COUNT(*)FROM products t1WHERE t1.orderid=t.orderidAND t1.status=′Failed′AND t1.targetsystem=′VAS′)=0ORDER BY sequenceid,actionpriority,productid ASC |
该视图创建逻辑显示来自产品表格302的、可被处理的并且目标为‘VAS’目标系统的产品。该视图创建逻辑尊重处理每个产品和任务的优先级标准。为此,视图创建逻辑分析SequenceID、ActionPriority、TragetSystemPriority、ActionCode和/或TaskID(针对任务依赖性)。因此,该视图选择逻辑帮助确保一个产品或者任务不会不按顺序地在之前产品或者任务没有‘完成’之前就被处理。
数据库轮询器解析(606)创建数据库视图的过程所生成的视图输出字符串。该目标系统视图模式表格示出了用于验证视图创建逻辑的结果的一个合适的示例性目标系统视图模式。验证错误可以被写入日志以供调查和纠正。
目标系统视图模式表格 |
<?xml version=″1.0″encoding=″UTF-8″?><xs:schema xmlns:xs=″http://www.w3.org/2001/XMLSchema″elementFormDefault=″qualified″attributeFormDefault=″unqualified″><xs:element name=″Resultsets″><xs:complexType><xs:sequence><xs:element name=″ResultSet1″><xs:complexType> |
<xs:sequence><xs:element ref=″Record1″maxOccurs=″unbounded″/></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element><xs:complexType name=″Record1″><xs:sequence><xs:element name=″TASKID″type=″xs:string″/><xs:element name=″ORDERID″type=″xs:string″/><xs:element name=″PRODUCTID″type=″xs:string″/><xs:element name=″PARENTPRODUCTID″type=″xs:string″nillable=″true″/><xs:element name=″MAINPRODUCTID″type=″xs:string″nillable=″true″/><xs:element name=″CUSTOMERCODE″type=″xs:string″/><xs:element name=″ACTIONCODE″type=″xs:string″/><xs:element name=″ACTIONPRIORITY″type=″xs:string″//><xs:element name=″STATUS″type=″xs:string″/><xs:element name=″SEQUENCEID″type=″xs:string″/><xs:element name=″PRODUCTXMLDATA″type=″xs:string″/><xs:element name=″CURRENTTASK″type=″xs:string″/><xs:element name=″ORDERXMLDATA″type=″xs:string″minOccurs=″0″/><xs:element name=″TARGETSYSTEMPRIORITY″type=″xs:string″nillable=″true″/></xs:sequence></xs:complexType><xs:element name=″Record1″type=″Record1″/></xs:schema> |
数据库轮询器将视图输出字符串写入(608)日志。数据库轮询器接着对它已经从服务订单数据库152获取的产品进行迭代。数据库轮询器根据服务订单模式解析(610)每个订单数据字符串,所述服务订单模式诸如是在服务订单模式表格中示出的那些。验证错误可以被写入日志以供调查和纠正。
<?xml version=″1.0″encoding=″UTF-8″?><xs:schema xmlns:xs=″http://www.w3.org/2001/XMLSchema″targetNamespace=″NAMESPACE″elementFormDefault=″qualified″attributeFotmDefault=″unqualified″><xs:element name=″Envelope″><xs:complexType><xs:sequence><xs:element name=″Header″><xs:complexType><xs:sequence><xs:element name=″BEInstanceId″type=″xs:string″/><xs:elementname=″BEName″type=″xs:string″default=″ServiceOrderProvisioning″/><xs:element name=″CustomerCode″type=″xs:string″/><xs:element name=″ExecState″type=″xs:string″default=″Initial″/><xs:element name=″ReceivedDate″type=″xs:string″/><xs:element name=″OrganizationCode″type=″xs:string″/></xs:sequence></xs:complexType></xs:element><xs:element name=″ServiceOrderProvisioning″><xs:complexType><xs:sequence><xs:element name=″ServiceOrder″><xs:complexType><xs:sequence><xs:element name=″CustomerCode″type=″xs:string″minOccurs=″0″/><xs:element name=″BillingAccountCode″type=″xs:string″/><xs:element name=″OrderDate″type=″xs:string″minOccurs=″0″/><xs:element name=″OrderId″type=″xs:string″/><xs:element name=″OrderPriority″type=″xs:string″/><xs:element name=″OrganizationCode″type=″xs:string″/><xs:element name=″SOStatus″type=″xs:string″/><xs:element name=″ActionType″type=″xs:string″/><xs:element name=″SalesForceID″type=″xs:string″minOccurs=″0″/> |
<xs:element name=″CustomerFirstName″type=″xs:string″minOccurs=″0″/><xs:element name=″CustomerLastName″type=″xs:string″minOccurs=″0″/><xs:element name=″ToMHONetwork″type=″xs:boolean″minOccurs=″0″/><xs:element name=″OrderReason″type=″xs:token″minOccurs=″0″/><xs:element name=″FiscalCode″type=″xs:string″minOccurs=″0″/><xs:element name=″BirthDate″type=″xs:string″minOccurs=″0″/><xs:element name=″CustomerType″type=″xs:token″minOccurs=″0″/><xs:element name=″OldOrderId″type=″xs:string″minOccurs=″0″/><xs:element name=″OrderSubType″type=″xs:string″minOccurs=″0″/></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element></xs:schema> |
数据库轮询器进一步根据预定义的模式解析、验证和/或转换(612)订单数据字符串内的每个产品数据字符串。该预定义的模式可以是公共数据模型模式,诸如上面参考图5注意到的以及接收服务订单结构的那些。验证错误可以被写入日志以供调查和纠正。
原始的服务订单结构102包括订单和产品两个部分。在处理期间,这些部分被分开并且被分别存储。在(610)中,轮询器解析订单部分,其存储在订单数据表格中的OrderXMLData列中。在(612)中,轮询器解析产品部分,其被存储在产品数据表格中的ProductXMLData数据列中。
数据库轮询器确定(614)所获取的任务是否需要任何动作。对应于数据库轮询器的目标系统可以提供动作标准,诸如用于调用特定操作的路由逻辑。动作的例子包括‘激活’、‘重新激活’、‘替代IMSI’、‘替代MSISDN’、‘挂起’以及‘终止订购’。
数据库轮询器可以接着执行JDBC更新,以将产品表格302中的当前产品的当前状态从‘被加载’更新(616)到‘处理中’。当前产品是由TaskID标识的产品。数据库轮询器接着可以调用(618)针对特定目标系统的适配器,以在目标系统上执行所选择的任务。数据库轮询器还可以执行(620)服务订单数据库更新,其利用当前产品的当前状态来更新服务订单数据库152,或者在错误已经出现时写入错误数据。(618)和(620)可以是被衍生为并行运行的两个任务。
数据库轮询器还将与处理产品有关的状态信息写入日志(620)。同样,数据库轮询器捕获(622、624)异常并且可以相应地更新(626)产品状态和/或将异常写入(628)日志。
如上所述,每个数据库轮询器可以调整用于其对应的目标系统所执行的特定处理。作为一个例子,某些目标系统可以与订单组合器逻辑224联合工作。在这样的情况下,(610)和(620)可以用对组合器逻辑224的调用来替代。组合器逻辑224继而重构服务订单供应消息,该消息可以遵守例如原始服务订单结构102中的服务订单分层级的结构。重构的服务订单可以包括特定于特定目标系统的那些任务和产品,或者来自原始服务订单结构102的每个任务和产品。对组合器逻辑224的调用的输入参数可以包括OrderID和MainProductID。组合器逻辑224的输出可以是利用主产品构建的服务订单包封(envelop)。
每个目标系统可以处理一个特定的任务组。例如,除了上述VAS例子以外,‘PP’目标系统可以处理诸如‘添加用户’、‘修改用户’、‘改变USIM’、‘改变MSISDN’和‘修改状态’的动作。可以存在任何数量的目标系统,其实现与系统200交互的任何特定功能。
图7示出了组合器逻辑224的流程图700。在流程的各个点处,将处理结果写入日志。这提供了用于跟踪、审阅和纠正处理错误的鲁棒的容错处理跟踪机制。组合器逻辑224可以接受(702)OrderID和ProductID作为输入变量。输入数据被写入(704)日志。组合器逻辑224的输出包括服务订单结构,其可以遵守特定任何指定的模式,诸如上面提到的和在图11中示出的公共数据模型模式。组合器逻辑224还可以输出错误响应字符串。
如果给定OrderID,则组合器逻辑224发起(706)针对保存订单的XML字符串的搜索。例如,组合器逻辑224可以开始在订单数据表格304中执行数据库搜索:SELECT*FROMERRORHANDLER.ORDERDATA WHERE RDERID=?,以找到包含订单数据的XML字符串。如果不存在任何对应的记录,则组合器逻辑224可以输出‘没有找到订单’的错误响应字符串。对应的记录或者错误响应字符串被写入(708)日志。
一个订单可以具有多个主产品,但是一些目标系统一次仅接受一个主产品。因此,系统提供用于针对不同目标系统来重建不同订单的灵活性。另一个选项是构建部分订单,其中所有产品具有相同的动作代码;这可以针对一个订单仅可以处理一个动作的系统来进行。此外,在供应的同时,可以改变状态甚至产品数据本身。一旦利用产品信息进行重建,便可以重新提交订单。
一旦组合器逻辑224发现订单,组合器逻辑224就可以开始运行两个线程以便并行处理订单XML和产品XML,图7中其通过离开判决“存在否?”的两个”是”分支来示出。第一线程解析(730)订单XML,而第二线程解析产品XML。第二线程可以在订单执行数据库152中搜索(710)属于该订单的每个产品。例如,组合器逻辑224可以使用SQL语句找到产品:
SELECT
ERRORHANDLER.PRODUCTDATA.PRODUCTXMLDATA FROM
ERRORHANDLER.PRODUCTDATA WHERE ORDERID=?。
搜索结果被写入(712)日志。每个产品被顺序地获取、写入日志和解析(714)。
组合器逻辑224接着可以迭代下列逻辑:
IF
MainProductID被分配
THEN
对MainProductId=ProductInstanceId的产品进行迭代
ELSE
对不包含ParentOrderItemId的产品(即,对主产品)进行迭代;
分配Leve1:=ProductInstanceId[IterationNumber];
获取(716)每个根产品。组合器逻辑224检查是否存在主产品的子产品(例如,当NUMBER(RootOrderItemID=1evel的产品))>1时)。换言之,从迭代的主产品出发,该主产品下面存在更多的产品,即,该主产品具有一个或多个子产品。则每个子产品的子结构被调查并且被映射到该主产品之下。为此目的,组合器逻辑224利用以下输入来调用进程OP_ComposerMapper(718):
SourceForComposer(组合器的来源),包含从数据库中获取的每个产品的数据;Level;Product,被迭代的主产品;Output(输出);以及Product,被迭代的具有子结构的主产品。
组合器逻辑224检查是否不存在主产品的子产品(例如,当NUMBER(RootOrderItemID=level的产品)=1时)。如果不存在子产品,则该产品已经准备好进行映射。该主产品和所有的更低级别的子产品以及它们的次级产品被组装(720)进一个产品结构。在所有的主产品已经被处理之后,组合器逻辑224跳出迭代并且将结构映射(722)到重建的服务订单结构。该服务订单结构输出被写入(724)日志,并且组合器逻辑224可以将该重建的服务订单结构传递给目标系统。在处理期间出现的异常被捕获(726)并且被写入(728)日志。
图8示出针对OP Composer映射器逻辑718的流程图800的一个例子。映射器718的输入可以包括:SourceForComposer,其是一种XML模式;Level,其是字符串;以及Product,其是一种XML模式。输出可以是一种产品XML模式。工作变量包括:UpperLevel,其是表示较低级别的产品将被映射到的产品的字符串;以及LowerLevel,其是表示将被映射的产品的字符串。
映射器逻辑718将输入数据写入(802)日志。为了清楚起见,输入级别被称为UpperLevel(804)。接着,映射器逻辑718迭代下面的逻辑:
对ParentOrderItemId=UpperLevel的产品进行迭代(806)。
次级产品被获取并且被标记为LowerLevel:LowerLevel:=subproduct[i](808)。
映射器逻辑718确定较低级别产品是否具有子产品(例如当NUMBER (ParentOrderItemId=LowerLevel的产品)>0时)。当较低级别附属产品具有子产品时,则每个子产品被调查其次级结构,并且被映射到该较低级别次级产品之下。为此目的,映射器逻辑718递归地利用下述输入来调用(810)进程OP ComposerRecursiveCall:SourceForComposer,即从开始被映射的、包含从数据库获取的每个产品的数据;Level,(所映射的较低级别);Product,即较低级别的产品被映射到的较高级别的被处理的产品。输出可以包括:Product,即具有次级结构的较低级别的产品被映射到的较高级别的被处理的产品。映射器逻辑718将递归调用的数据输入写入日志,并且将递归调用返回的结果写入日志。
当没有子产品时(例如,当NUMBER(ParentOrderItemId=LowerLevel的产品)=0)时),较低级别产品不包含子产品。该较低级别产品准备好被映射到较高级别的结构中。通过该迭代过程,映射器逻辑718累积了具有次级结构的所有较低级别产品。
当映射器逻辑718跳出迭代时,映射器逻辑718将所有的较低级别产品以及次级结构映射(812)到它们的高级产品。完成的高级产品被写入(814)日志并且返回到该过程。在处理期间出现的异常被捕获(816)、写入日志(818)和发送到调用过程。
图9示出了针对数据库更新器逻辑222的流程图900的示例。数据库更新器逻辑222从目标系统216和220接收其输入,例如,如上面讨论轮询器时描述的那样。数据库更新器逻辑222将它接收的输入写入(902)日志。该输入可以指定OrderID、TaskID、MainproductID或其他标识符以及可应用于订单、任务和主产品或者其他实体的状态更新。
如果接收的状态更新指示(904)该处理没有正常完成,则数据库更新器逻辑222确定(906)是否已经提供OrderID(例如,通过确定OrderID是否为空来实现)。如果已经提供OrderID,则数据库更新器逻辑222根据接收的OrderID更新(908)错误数据库,并且更新产品表格。在(908)中,数据库更新器逻辑222在错误数据表格中插入一个记录,并且在(910)中,数据库更新器逻辑222更新产品表格中的状态。如果还没有提供OrderID,则数据库更新器逻辑222根据接收的TaskID更新(912)错误数据库,并且更新(914)产品表格中的状态。
当处理正常完成(904)时,数据库更新器逻辑222可以确定(916)是否已经提供TaskID。如果提供了,则数据库更新器逻辑222基于TaskID和接收的状态来更新(918)服务订单数据库152。否则,数据库更新器逻辑222确定(920)是否已经提供MainproductID。如果提供了,则数据库更新器逻辑222基于OrderID、MainProductID和TargestSystem更新(922)服务订单数据库152。否则,数据库更新器逻辑222基于OrderID和TargetSystem更新(924)服务订单数据库152。
数据库更新器逻辑222将其操作的输出写入日志(926)。此外,数据库更新器逻辑222捕获(928)异常并且将异常公布(930)给日志。
数据库更新器逻辑222可以利用在成功完成供应过程之后从目标系统获得的数据来更新产品XML数据的特定元素。在一个实现中,数据库更新器逻辑222从目标系统接收要更新的元素的名称和值,并且更新在服务订单数据库152中的产品数据表格312中的ProductXMLData列中的产品XML数据。数据库更新器逻辑222根据指定的ProductID提取产品XML数据,用接收的新值更新产品XML数据中的任何定义的元素,并且根据所述ProductID将更新的XML数据写进产品数据表格312中。
在一个实现中,数据库更新器逻辑222使用字符串操作来执行更新。首先,数据库更新器逻辑222可以提取和保存将被更新的元素的命名空间的前缀。利用该前缀和元素名称,组合三个变量的值:StartTag=<nsPrefix:ElementName>,EndTag=</nsPrefix:ElementName>,以及EmptyTag=<nsPrefix:ElementName/>。
数据库更新器逻辑222将这些值级联以获得ProductXMLData字符串的新值。EmptyTag变量被用于比较目的。数据库更新器逻辑222通过ProductID查询服务订单数据库152以获得ProductXMLData。如上面描述的那样,数据库更新器逻辑222还提取要更新的特定的XML元素的命名空间的前缀,并且向临时值的标签结构分配值:startTag,表示被更新元素的打开标签的字符串,endTag,表示被更新元素的关闭标签的字符串,以及emptyTag,表示被更新元素的空形式的字符串。
数据库更新器逻辑222接着将原始XML产品数据与新更新的原始数据级联。结果是包含产品数据和更新元素的级联的更新的XML字符串。数据库更新器逻辑222通过更新ProductID指定的行将更新的XML字符串插入数据库。
图10示出了在动态订单工作流模板实例器和解耦合器系统200中交互的若干实体所执行的处理的流程图1000。OP入口点202接收服务订单结构,将服务订单结构存储在事件数据库214中,并且提供服务订单结构给OP分解器204(1002)。OP分解器204获得服务订单结构,将服务订单结构分解成各个产品(1004),并且调用OP选择器逻辑206(1006)。对于每个产品,OP选择器逻辑206创建扩展产品向量并且将该向量作为单独的行被插入订单执行数据库152中的产品表格302中(1008)。OP分解器逻辑204可以更新(1010)事件数据库214中的状态,诸如服务订单结构是否被成功分解成各个扩展产品向量。
数据库轮询器检查服务订单数据库152,以找到准备好进行处理的产品(1012)。数据库轮询器根据上面提到的优先级来获取产品,并且调用(1014)目标系统来执行从产品表格中获取的行所指定的处理。目标系统尝试执行处理,并且返回(1016)响应(例如,成功或者出错)。该响应被传回(1018)OP分解器逻辑204,并且OP选择器逻辑206可以将对应的更新写进(1020)订单执行数据库。
图11示出了服务订单结构102可以遵守的模式1100的例子。ProductInstanceID提供了针对每个产品的唯一ID。CRMOrderID提供针对每个订单的唯一ID,其标识了产品所属于的订单。ParentOrderItemID提供了父产品的ProductInstanceID。RootOrderItemID提供了主产品(结构中的最高产品)的ProductInstanceID。
图12示出了可以实现系统200和上面描述的逻辑的处理系统1200和诸如目标系统的支持实体的硬件示图。处理系统1200包括处理器1202、存储器1204以及通信逻辑1206。该存储器1204保存上面描述的供处理器1202执行的程序和过程。例如,存储器1204可以存储实现OP入口点逻辑202、OP分解器逻辑204以及OP选择器逻辑206的程序逻辑。系统1200可以将目标系统和任务配置文件128读进存储器1204供解析。
系统200和1200可以以多种方式实现。例如,尽管某些特征是示出为存储在计算机可读存储器中(例如,作为实现为计算机可执行指令的逻辑或者作为存储器中的数据结构),该系统的全部或者部分及其逻辑和数据结构可以被存储在或分布在其他机器可读介质上,或者从其他机器可读介质上。该介质可以包括硬盘、软盘、CD-ROM、信号,诸如从网络接收的信号或者在网络上传送的多个分组上接收的信号。
系统200和1200可以利用附加的、不同的或者更少的部件来实现。作为一个例子,处理器可以实现为微处理器、微控制器、DSP、专用集成电路(ASIC)、离散逻辑、或者其他类型的电路或者逻辑的组合。作为另一个例子,存储器可以是DRAM、SRAM、闪存或者任意其他类型的存储器。系统的处理能力可以分布在多个部件上,诸如分布在多个处理器和存储器上,可选地包括多个分布式处理系统。参数、数据库和其他数据结构可以分别存储和管理,可以集成到单个存储器或者数据库中,可以逻辑地或者物理地以多种不同的方式组织,并且可以利用多种不同类型的数据结构实现,诸如链接表、哈希表或者内含的存储机制。逻辑,诸如是程序或者电路,可以进行组合或者可以分为多个程序,分布在多个存储器和处理器上,并且可以实现在库中,所述库诸如是共享库(例如,动态链接库(DLL))。DLL例如可以存储代码,其准备中间映射或者实现对映射的搜索。作为另一个例子,DLL可以自己提供系统、工具或者二者的所有功能或者某些功能。
作为一个特定的例子,上面描述的逻辑执行的处理可以利用一个或多个TibcoTMBusinessWorksTM进程来实现。该进程可以在任何支持TibcoTMBusinessWorksTM系统的环境中执行。这样的环境的例子包括运行WindowsTM操作系统和UnixTM操作系统的计算机系统。
该系统还可以包括多方面任务跟踪。这样的跟踪可以包括通过高度可配置的外部标识符的跟踪任务的外部标识符方面。另一方面,错误方面,包括跟踪在目标系统尝试执行任务时发生的错误,以及将那些错误按类别归到各个组。多方面跟踪提供了对每个任务的状态的详细了解,帮助解决顺序地执行复杂的产品请求的执行这一技术问题,同时维护在任务执行的每个阶段(从新加载进产品表格203到完成或者由于错误而失败)的执行状态的透明查看。多方面任务跟踪特征消除了人工搜索复杂的日志文件以确定任务状态的负担。此外,区分不同的错误组有助于定制地处理不同类型的错误。因此,该系统可以响应于分配给错误的错误组实现不同的错误解决范例。这样的处理有助于解决针对任何给定错误确定和执行恰当的纠错动作的技术挑战。
图13示出了包括跟踪控制台1302的系统1300。跟踪控制台1302生成跟踪接口1304。跟踪接口1304可以是图形用户接口,其显示存储在订单执行数据库152中的跟踪方面。操作员可以通过跟踪控制台1302与系统交互以查看任务执行状态、纠正在错误数据表格308中报告的错误、重新提交任务供执行、修改任务,以及采取其他动作。然而某些动作可以是自动化的,诸如当链接错误发生时重新提交任务供执行。
多方面任务特征由图2中示出的错误数据表格308和任务跟踪表格306来支持。回想针对每个目标系统上的每个任务,在产品表格302中写一行。产品表格302中的行包括状态字段。可以存储在状态字段中的轮询器、目标系统或者其他实体的值的例子包括:‘新’,表示该行是新插入产品表格302的;‘被加载’,表示轮询器已经提取该行但是还没有将任务发送给目标系统;‘处理中’,表示轮询器已经将任务发送给目标系统进行处理;‘完成’,指示已经由目标系统成功处理了任务;以及‘失败’,表示该任务不能被处理。
关于跟踪的错误方面,当任务执行失败时,针对本应已经执行执行任务的目标系统的轮询器可以指示数据库更新器逻辑222将错误记录写进错误数据表格308。例如,对于导致任务执行失败的连接错误,轮询器可以写入指定连接错误的错误记录。作为另一个例子,当在目标系统上出现应用错误时,目标系统可以向轮询器或者数据库更新器逻辑222返回错误代码和描述,轮询器或者数据库更新器逻辑222中的任意一个可以继而将对应的错误记录写进错误数据表格308。
错误记录可以包括上面关于错误数据表格308描述的数据字段。例如,当应用错误出现时,ErrorCode字段可以用目标系统返回的错误标识符来填充。因此,错误标识符可以反映应用专用的错误代码,其反映为何该应用不能处理该任务。对于连接错误,轮询器基于轮询器中预配置的错误数据来确定要写的错误代码。
ErrorDescription字段提供例如纯文本错误消息,其描述已经出现的错误。该错误消息可以由目标系统或者轮询器提供。ErrorTime字段存储记录错误发生时间的时间戳。
该错误记录还可以用组指定符来填充ErrorTypeGroup字段。该组指定符可以区分预定义的错误类型。作为两个例子,预定义的错误类型可以是‘应用’和‘连接’。对于应用错误,轮询器能够提交任务给纠正目标系统。然而,负责在目标系统上执行任务的应用不能够成功地处理该任务。可能存在很多原因为何目标系统不能完成任务,诸如缺少处理资源,在任务中规定了不正确的数据,以及其他原因。因为应用错误通常较复杂并且难于分析和纠正,因此系统可以将错误记录写入错误数据表格308而不重新提交任务供执行。相反,操作员可以分析错误记录,做出纠正或者采取其他修补动作,接着指示系统重新提交任务。
对于连接错误,轮询器不能够联系到任务所针对的目标系统。当与目标系统的通信信道不能够建立时,连接错误可能发生。当存在网络故障、目标系统死机或者其他情况下,连接错误可能发生。系统可以向具有连接错误的任务自动地应用预配置的任务执行重试规则集。例如,重试规则集可以指定轮询器将自动地按‘t’分钟的间隔重试任务执行‘n’次。一个例子是重试3次,重试中间的间隔是5分钟。
可以针对连接错误、应用错误或者任何其他类型的错误类型组建立任务执行重试规则集。例如,应用错误任务执行重试规则集可以指定对不能完成任务的应用采取纠正步骤。纠正步骤的例子包括指示应用来重试处理,指示应用利用指定的参数或者处理技术来重试处理,指示重试几次,以何频率重试或者其他的纠正步骤。
每当任务失败,系统可以向错误数据表格308添加一个新行。如上所述,每行提供任务何时重试和为何失败的记录。一个有益结果是错误数据表格308提供了任何给定任务碰到的错误的完整历史。
关于跟踪的外部标识符方面,任务跟踪表格306提供针对TaskID的别名字段。具体地,任务跟踪表格306允许任何数量的ExternalID连接到任何给定的TaskID。ExternalID可以是对于指定给定任务有用的任何标识符。例如,外部标识符可以是社会安全号、MSIDSN号、外部系统标识符、电话号码、订阅号码或者为任务提供备选标识符的任何其他标识符。
跟踪表格306进一步允许使用ExternalIDType字段指定外部标识符的类型(例如,电话号码、外部系统标识符、或者税目标识符)。作为结果,系统支持通过多个不同的别名搜索给定任务的执行状态。因此,当必须知道针对特定的MSISDN号哪些任务是未决的时,系统可以为跟踪表格306中的每个任务建立MSDISN外部标识符。
在一个实现中,轮询器填充跟踪表格306。例如,轮询器可以向跟踪表格306写入一行,指示将目标系统标识符作为TaskID的ExternalID。目标系统可以提供目标系统标识符以作为例如在从轮询器接收任务执行请求后对轮询器的回调。因此,跟踪表格306提供了容易地确定哪些外部目标系统正在处理哪个产品的哪些任务的技术方案。
例如,操作员可以基于MSISDN标识符、税目标识符、目标系统标识符或者链接到TaskID的其他外部标识符,来在跟踪表格306中搜索执行状态。给定任何数量的TaskID匹配外部标识符,操作员可以接着搜索产品表格302、错误数据表格308、或者其他表格,以找到匹配TaskID的任务的确切状态。
图14示出了多方面跟踪表格逻辑的流程图1400。系统建立跟踪(1402)表格306,错误数据表格308(1404),以及对于跟踪任何和产品的处理所期望的任何其他表格。如上所述,系统还可以利用任何期望的外部标识符来填充跟踪表格306,以提供(1406)系统生成的TaskID的别名。
当存在另外的要执行的任务时,轮询器获取(1408)下一个任务。每个轮询器尝试递送(1410)它获取的任务给分派的目标系统。当链接错误出现时,轮询器将连接错误记录写入(1412)错误数据表格308。如上面提到的,轮询器可以按任意配置的间隔和次数重试任务提交。
当任务被成功递送给目标系统时,轮询器可以从目标系统获取(1414)外部系统标识符。外部系统标识符可以是目标系统自身的标识符,目标系统分配的任务的标识符,或者其他类型的外部系统标识符。轮询器利用外部系统标识符来填充(1416)跟踪表格306。
目标系统尝试处理轮询器递送给它的任何任务。当目标系统成功地执行任务时,目标系统可以向轮询器或者数据库更新器逻辑222返回成功执行完成消息。该系统因此针对该任务将‘完成’状态写入产品表格302。然而,当目标系统碰到尝试处理任务的错误时,目标系统向轮询器和数据库更新器逻辑222返回错误信息。该错误信息可以包括错误标识符、错误描述、错误时间、或者其他错误信息。该系统(例如,数据库更新器逻辑222、轮询器、或者系统中的其他逻辑)可以使用该错误信息来查找匹配该错误信息的对应的错误类型组。这些错误特性可以形成系统写进错误数据表格308的错误记录。
尽管已经描述了本发明的各种实施例,但是对于本领域技术人员显然的是:在本发明的范围内存在许多另外的实施例和实现。因此,本发明不是限制性的,而是包括所附的权利要求和其等价。
根据另一方面,一种产品可以包括:计算机可读介质;订单处理器分解器逻辑,其存储在介质上并且被配置为通过将服务订单结构分解成构成无级产品列表的各个产品动作条目而从服务订单结构生成无级产品列表;以及存储在介质上的目标系统选择器逻辑,其被配置成:从无级产品列表选择第一个单项产品动作条目;在向量化文件中定位与该第一单项产品动作条目匹配的任务序列列表,其指定用于实现第一单项产品动作条目的目标系统和任务;创建用于实现第一单项产品动作条目的扩展产品向量,每个扩展产品向量包括任务序列列表指定的目标系统标识符、目标系统优先级、任务标识符、以及任务优先级;以及将扩展产品向量作为单独的行写入订单执行数据库中。
根据又一个方面,扩展产品向量可以包括:针对任务序列列表中指定的每个任务的各自的扩展产品向量。
根据又一个方面,向量化文件可以包括一系列的产品结构和/或每个产品结构中的动作类型结构。
根据又一个方面,动作类型结构可以包括:‘添加’结构;‘更新’结构;‘挂起’结构;‘删除’结构;和/或其任意组合。
根据又一个方面,其中动作类型结构可以包括各个目标系统结构。
根据又一个方面,其中各个目标系统结构可以包括:目标系统名称字段;目标系统优先级字段;和/或各个任务结构。
根据又一个方面,其中各个任务结构可以包括:任务名称字段;和/或任务优先级字段。