接口详细设计文档资料.doc

上传人:一*** 文档编号:2487969 上传时间:2020-04-12 格式:DOC 页数:45 大小:1.72MB
返回 下载 相关 举报
接口详细设计文档资料.doc_第1页
第1页 / 共45页
接口详细设计文档资料.doc_第2页
第2页 / 共45页
点击查看更多>>
资源描述

《接口详细设计文档资料.doc》由会员分享,可在线阅读,更多相关《接口详细设计文档资料.doc(45页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、#+接口详细设计文档作者:唐为(为哥)审核:赵锟日期:2005-5-27接口详细设计文档11编写目的32名词解释33组件分布图44程序结构54.1接入处理线程类图54.2接收线程类图64.3启动控制图65程序设计说明75.1对原系统的改动75.2ThreadInSvcProcessor 接入处理器85.2.1类图85.2.2时序图95.2.3流程图95.2.4ThreadInSvcProcessor类说明115.3PatternNewSyncAsyncInnerDir 同异步向内处理模式165.3.1类图165.3.2描述175.3.3流程图175.3.4类说明195.4ThreadReply

2、SvcProcessor 异步应答返回处理器245.4.1类图245.4.2类说明245.5ClientInfo 客户端连接数据335.5.1类图335.5.2类描述335.6ClientInfoTable 客户端连接数据表345.6.1类图345.6.2类描述345.7ClientInfoTableMonitor 客户端连接数据表监控程序385.7.1类图385.7.2类说明385.8FrontMain 主控程序405.8.1类间关系405.8.2流程图415.8.3类说明425.9问题441 编写目的预期读者:对接口行为和目的有一定了解的人背景说明n 软件系统名称:接口前端接入服务器n 描

3、述 接收不同商家的接入,接收数据转发给主机服务器,并同步/异步将返回数据发给接入商家的行为2 名词解释n ChannelBase渠道,通信基类,提供数据收发和释放的方法接口用子类实现来封装了不同通信方式 目前有TCP短连接接入, 从ACE Message_Queue中读取(IPC MessageQueue- ACE_Message_Queue)n Trade* trade商家对象,代表的其实是针对该商家处理方法的集合将接入数据的商家称为服务商家而将请求面向的商家称为主机商家,主机商家负责同步/异步返回交易的应答数据给接口平台n 而接口(数据交换)平台是在两者之间的交换平台n 渠道工厂:把接入数

4、据的渠道工厂统一定为服务渠道工厂,发送数据的渠道工厂统一定为主机通道工厂服务商家接口平台主机商家查不到,丢弃返回应答线程组ATM接入服务器ATM连接队列TCP渠道IPC消息队列渠道commserverIPC消息队列注各种服务渠道和主机通道抽象类都是相同的基类ChannelBase,只是作用不同渠道工厂生成各种渠道IPC消息队列commserver银联接入服务渠道抽象代表各种接入服务渠道接出服务渠道抽象TCP渠道IPC消息队列渠道发送请求线程组后台服务器连接监视器IPC消息队列通知清除超时间连接记录表接收线程接收IPC消息总控接入主机通道抽象IPC消息队列渠道3 组件分布图ATM4 程序结构4.

5、1 接入处理线程类图PatternNewSyncAsyncInnerDir是ProcessPattern的一个子类,实现发送主机服务器并判断同/异步返回同步直接返回给接入商家异步只做相应记录ProcessPattern是后续处理的全部流程抽象类子类实现对应不同流程ThreadInSvcProcessor是接入处理线程的主流程收数,接包无误后将处理控制权交给ProcessPattern4.2 接收线程类图4.3 启动控制图5 程序设计说明5.1 对原系统的改动n 改变原有商家Trade类,不存放渠道对象在商家类中,商家类只执行商家处理,不负责渠道的管理n 改动原有的系统中所有模式的处理,模式处理

6、必须对渠道的释放负责n 修改MidHstChannel,添加后台服务需要的个FML字段,这两个字段是:FML域名描述S_INTERF_NO接口标识号,整数。系统中接收异步响应程序的唯一编号。用于标识请求的来源,异步应答根据这个号码分发给具体的接口程序。S_TX_CTRL_ATTR交易控制属性,字符串。接口都填0,表示这是正常的交易请求。5.2 ThreadInSvcProcessor接入处理器5.2.1 类图5.2.2 时序图预先说明:n ChannelBase渠道通信基类,提供数据收发和释放的方法接口用子类实现来封装了不同通信方式。目前有 TCP短连接接入。从ACE Message_Queu

7、e中读取(IPC MessageQueue- ACE_Message_Queue)n Trade* trade商家:代表的其实是针对该商家处理方法的集合5.2.3 流程图服务商家商家渠道工厂GetChannel商家通过渠道收取数据商家的输入处理渠道没取到退出?超时?安全出错?请求:执行安全出错模式PatternErrorSyncInner处理模式请求/应答YesNo执行识别出的模式处理Yes同异步模式PatternNewSyncASyncInnerDirPatternASyncInnerDir应答丢弃5.2.4 ThreadInSvcProcessor类说明5.2.4.1 功能收取用不同渠道接

8、入的外部商家的请求识别,解包执行处理的模式具体的流程在模式中控制,并不做控制模式可能有3种:1. 无返回:发送后台,不接收应答对应模式PatternASyncInnerDir,需要修改原来的相关程序,在本文档中并不涉及2. 有返回,根据返回的应答判断是同步返回还是异步返回如果接收的应答表明是同步返回,按正常模式返回如果接收的应答表明是异步返回,按异步模式处理对应模式PatternNewSyncASyncInnerDirThreadInSvcProcessor后续的ProcessPattern 应该是PatternNewSyncASyncInnerDir.ThreadInSvcProcessor

9、只负责接入后调用模式,并处理异常情况3. 安全异常情况的模式下,调用模式PatternErrorSyncInner来处理,必须限制:主要的改动是渠道的释放由模式来管理涉及模式有 PatternASyncInnerDir , PatternNewSyncASyncInnerDir , PatternErrorSyncInner (可能不全面)5.2.4.2 程序描述ThreadInSvcProcessorThreadInSvcProcessor(Trade* ptrade , SvcChannelFactory* pfactory, bool*_bexit)功能:构造函数性能:输人项:Trade

10、* trade接入数据处理的商家类SvcChannelFactory* pfactory接入数据渠道工厂bool* exit退出标志输出项:注释:5.2.4.3 程序描述SvcRunvoid SvcRun()功能:主控流程输人项:无输出项:无流程:服务商家在开始已经生成,生存周期里一直存在一个DataBus对象(数据总线),每线程一个DataBus对象。在生存周期里一直存在DataBus对象初始化循环处理SINT32 ret = a_process_loop (Trade* ptrade , SvcChannelFactory* pfactory,DataBus* pDataBus );if(

11、bool* exit = true )释放渠道跳出循环为下一次使用清空DataBus对象收尾处理,释放recv_trade5.2.4.4 程序描述a_process_loopSINT32 a_process_loop (Trade* ptrade , SvcChannelFactory* pfactory,DataBus* pDataBus )功能:一次交易的处理输人项:Trade* pTrade , 接收数据的服务商家服务渠道SvcChannelFactory* pFactory,服务商家接收数据的主机通道SvcChannelFactory * pFactory 服务商家渠道的生成工厂。Da

12、taBus* pDataBus预先创建的数据总线,不需要每次重建输出项:S_OK成功完成其他出错信息流程:依次执行GetChannel生成接入渠道ChannelBase* (根据商家生成一个ChannelBase的子类)除非出错,整个流程不释放该ChannelBase , 委托给Patten负责释放TradeRecvData 服务商家接收数据TradeInProcess服务商家进入处理(最主要一项功能就是接口识别)If( TradeInProcess 成功 & 安全函数出错 ) /安全函数一般是mac校验失败根据p_databus- pack_type 对请求和应答作2种不同的处理if( pa

13、ck_type 是请求 ) 执行 RequestSecureFailedProcess 函数调用else /应答报文结果是应答 直接丢弃,返回成功不管结果如何都跳到异常处理,但是返回值可能因SecureFailedProcess的执行结果而不同else否则生成Patern对象生成对方商家hst_trade生成模式对象Pattern,将服务商家和对方商家传入执行ExecPattern执行具体的模式处理,将渠道委托给Patten负责释放异常处理:记录出错信息和时间当异常发生在ExecPattern之外,释放渠道结束处理:(无论异常与否都执行):释放对方商家 st_trade释放模式对象Patter

14、n注释:为了便于单元测试,从SvcRun中分离出该方法也可以在SvcRun中实现上述的全部逻辑5.2.4.5 程序描述GetChannelSINT32 GetChannel(SvcChannelFactory* factory, ChannelBase* ACE_Time_Value* time_val )功能:调用svc_factory生成服务渠道性能:输人项:SvcChannelFactory*svc_factory渠道工厂ACE_Time_Value*time_val超时时间这个超时目前是一个固定值,和接收数据和发送数据的超时无直接联系ChannelBase* !=NULL未取得=NUL

15、L取得输出项:返回值注释:出错信息在该方法中输出流程中只判断是否取得,没有取得则应该跳到开头进入下一次循环测试:对所有的可能生成的ChannelBase都进行一次测试5.2.4.6 程序描述TradeRecvDataSINT32 TradeRecvData(Trade* p_recv_trade , ChannelBase* p_chnbase , DataBus* p_databus , ACE_Time_Value* time_out )功能:商家通过渠道接收数据放入p_databus中输人项:ChannelBase* p_chnbase收取的渠道Trade* p_recv_trade接收

16、的商家DataBus* p_databus存放数据的DataBusACE_Time_Value* time_out超时时间输出项:0 成功-1读取失败或者超时注释:主流程不记录详细出错信息5.2.4.7 程序描述TradeInProcessSINT32 TradeInProcess(Trade* p_trade , DataBus* p_databus )功能:执行商家的入口处理(识别,解包。)p_databus的_data_buff 和 _len 字段分别表示数据指针和长度输入处理后将数据填入 p_databus 的 _var_pool 和 _var_reco_pool(识别数据)中输人项:

17、Trade* p_ trade接收服务商家DataBus* p_databus存放数据的DataBus输出项:0成功-1读取失败或者超时注释:没有超时限制,要控制短时间内完成5.2.4.8 程序描述RequestSecureFailedProcessSINT32 RequestSecureFailedProcess(DataBus* p_databus , Trade* p_trade , ChannelBase* in_svc_channel)功能:对输入是请求报文的安全类函数失败后的处理(输入是应答报文的就直接丢弃)输人项:DataBus* p_databus数据Trade* p_trad

18、e输入服务商家ChannelBase* in_svc_channel输入服务的渠道输出项:S_OK应答保报文,不加理会INTIDENERROR( SECUFAILED )请求报文,执行安全异常处理模式成功其他。请求报文,执行安全异常处理模式中出错注释:无论SecureFailedProcess 的执行结果如何都不继续执行后面的操作5.2.4.9 程序描述ExecPatternSINT32 ExecPattern(ProcessPattern * pattern , DataBus* p_databus , ChannelBase* p_channel)功能:执行处理模式,全部处理交给patte

19、rn输人项:ProcessPattern* pattern处理模式DataBus* p_databus存放数据的数据总线ChannelBase* channel输入服务渠道,交给Pattern管理释放输出项:S_OK成功其他失败注释: ChannelBase* 输入渠道,如果Pattern没有生成等错误,还是主控来释放p_channel执行pattern-Process 后就不管了可能设置一个标志位来表示是否执行了Pattern,执行过最后就不用释放channel了(是否可以这样?SINT32 ExecPattern(ProcessPattern * pattern , DataBus* p_

20、databus , ChannelBase* p_channel)主程序都删除p_channel,但是ExecPattern有可能返回的p_channel 是NULL。此时的主控是什么都不做。如果非null就删除)5.3 PatternNewSyncAsyncInnerDir同异步向内处理模式5.3.1 类图5.3.2 描述预先了解:交换平台接入的是服务商家,发送的是主机商家(主机)PatternNewSyncAsyncInnerDir 继承 ProcessPattern 类5.3.3 流程图见下页执行主机商家的输出处理主机商家服务商家接口平台CallHost接口平台主机商家是否同步返回Yes

21、服务商家的输出处理(OutProcess),生成输出数据是否服务商家读写渠道相同是否服务商家读写渠道相同创建ClientInfo,记录当前的信息。失败则转出错处理(不大可能)ClientInfo-channel=输入渠道channel=NULL后续不释放channelClientInfo.channel=NULL释放channelchannel=NULL释放channelchannel = NULL创建新的write_channelwrite_channel = channelchannel=NULL通过write_channel返回数据释放write_channelYesNoYes释放!=N

22、ULL的channel处理完成返回S_OK记录到ClientInfoTableNotpcall出错,记录错误释放!=NULL的渠道返回错误码出错释放使用的通道服务商家的读入渠道channel通过后台返回的fml变量S_TX_STATUS来判断5.3.4 类说明5.3.4.1 构造函数PatternNewSyncAsyncInnerDirPatternNewSyncAsyncInnerDir(Trade * svc_trade ,Trade *host_trade );svc_trade 和 host_trade 分别代表服务商家和主机商家5.3.4.2 方法ProcessSINT32 Proc

23、ess(DataBus * p_databus , ChannelBase* p_channel , ACE_Time_Value * time_val) ;DataBus * p_databus数据总线,包含了解包解开的数据 (FML格式)ChannelBase* p_inchannel服务商家接入的渠道ACE_Time_Value * time_val超时时间这样我们就拥有了处理需要的全部信息。而其他缺少的是在执行中生成的信息了服务商家svc_trade接口平台主机商家host_trade接入渠道是否生成返回渠道由is_same_rw_channel来判断如果读写渠道相同则使用原来的接入渠

24、道原路返回,不用生成服务商家主机商家接口平台该主机通道和上图的返回渠道可能是不同的路线比如是TUX和IPC Queue2种5.3.4.3 程序描述TradeOutProcessSINT32 TradeOutProcess( Trade* p_trade , DataBus* p_databus )功能:执行商家输出处理将数据处理(打包,加密。)处理到发送前的状态输人项:Trade* p_trade 商家DataBus* p_databus数据总线输出项:S_OK成功其他失败注释:5.3.4.4 程序描述CallHostSINT32 CallHost( Trade* p_hst_trade ,

25、DataBus* p_databus )输人项:Trade* p_ hst_trade 主机商家DataBus* p_databus数据总线输出项:S_OK成功其他失败注释:实际上是封装了一次发送接收的处理在这个模式里并不考虑单发无返回的情况,全部是发送后等待返回的情况功能:执行和主机商家的一次交互。执行的流程如下:创建主机商家发送的主机通道,发送数据if(读写不是同一条通道)释放发送主机通道设置发送主机通道为NULL创建主机商家接收的主机通道接收数据释放接收的主机商家通道,在此过程中所有生成的通讯渠道都要负责清除失败情况分析:ChannelBase*send_channel=NULL;Cha

26、nnelBase*recv_channel =NULL创建主机商家发送的主机通道失败问题:当tuxedo出错的时候的处理如何进行回答: 在目前的情况下,主机服务渠道实际上是tpcall后台,渠道实现中控制了该渠道的发送接收必然返回同步成功,如果通讯失败,由该主机生成返回码,复制请求数据到返回数据中返回码的生成是设置交易状态为同步返回S_TX_STATUS = 1 , 设置响应码S_RSP_CD 为“2023”设置响应码描述信息S_RSP_DESC 为“调用后台服务错误”交易或者通讯(tpcall)的失败由返回标志位和返回码来确定可能发生情况:1. 同步失败可细分为通讯失败和后台处理返回失败(问

27、题中的情况)2. 同步成功同步执行完毕3. 异步已发送异步处理,已经成功发送S_TX_STATUS = 05.3.4.5 程序描述TradeInProcessSINT32 TradeInProcess(Trade* p_trade , DataBus* p_databus )功能:执行主机商家的输入处理执行主机商家的对应操作,将p_databus中的原始数据识别出接口信息,转换成FML数据存放在p_databus的_var_pool和_var_reco_pool中输人项:Trade* p_ hst_trade 主机商家DataBus* p_databus数据总线输出项:S_OK成功其他失败注释

28、:5.3.4.6 程序描述is_sync_returnbool is_sync_return(DataBus* p_databus )功能:查看p_databus,判断这次返回是否是同步返回输人项:DataBus* p_databus数据总线输出项:true同步返回false异步返回注释:服务商家接口平台主机商家接入渠道是否生成返回渠道由is_same_rw_channel来判断如果读写用相同的渠道返回则使用原来的接入渠道,不用生成5.3.4.7 程序描述is_same_rw_svcchannelbool is_same_rw_svcchannel ( Trade* p_trade )功能:查

29、看该商家是否在同一链路上返回请求根据商家查看该商家的服务渠道定义查询如果没有定义了商家写的渠道,则表明读写渠道是一样的如果定义了商家写的渠道,则表明读写渠道是不同的输人项:Trade* p_trade服务商家输出项:true是false不是注释:通过查看商家的读写渠道是否相同,可以在处理前明白是否可以提前释放读的渠道返回给商家的时候明白是否要生成新的写的渠道5.3.4.8 程序描述createClientInfoClientInfo* createClientInfo( DataBus* p_databus , ChannelBase* p_channel ) 功能:创建一项异步返回的客户端连

30、接记录无论p_channel是否=NULL,都填入新建的ClientInfo 中输人项:DataBus* p_databus ChannelBase* p_channel返回的渠道只有读写原路返回的才!=NULL如果写要重新创建的填NULL可以的话用ACE_ASSERT判断一下输出项:ClientInfo*客户连接记录!=NULL成功=NULL不大可能注释:5.3.4.9 程序描述addToClientInfoTablevoid addToClientInfoTable( string key , ClientInfo* info )功能:创建一项异步返回的客户端连接记录输人项:string

31、key键值目前是由ClientInfoTable的generateKey(p_databus : DataBus*)生成ClientInfo* info记录输出项:ClientInfo*客户连接记录注释:5.4 ThreadReplySvcProcessor异步应答返回处理器5.4.1 类图5.4.2 类说明5.4.2.1 程序描述ThreadReplySvcProcessorThreadReplySvcProcessor (Trade* ptrade , SvcChannelFactory* pfactory, bool*_bexit)功能:构造函数性能:输人项:Trade* trade接收

32、返回数据处理的商家类服务商家,对于ATM接口就是ATM服务商家SvcChannelFactory* pfactory接收返回数据渠道工厂bool* exit退出标志输出项:注释:主机商家服务商家接口平台异步返回这里的服务商家就是存放在ClientInfo记录中的商家代码(trade_code)对应的服务商家,要根据trade_code来动态生成和释放5.4.2.2 程序描述SvcRunvoid SvcRun()主流程功能:接收主机商家异步交易返回的数据并向服务商家发送的输人项:无输出项:无流程:生成接收主机商家DataBus初始化循环处理SINT32 ret = a_process_loop

33、(ptrade , SvcChannelFactory* pfactory,DataBus* pDataBus );清空DataBus,以便下次重复使用if( 退出标志被设置 并且 渠道返回获得渠道收数为超时 )跳出循环收尾处理,释放recv_trade注释:单次处理的方法在a_loop_process中实现5.4.2.3 程序描述a_process_loopSINT32 a_process_loop (Trade* ptrade , SvcChannelFactory* pfactory,DataBus* pDataBus )功能:一次交易的处理输人项:Trade* pTrade 将应答数据

34、返回对应的商家(对于ATM接口就是ATMC对应的那个)SvcChannelFactory* pFactory主机商家接收数据的主机通道 异步应答渠道的生成工厂DataBus* pDataBus预先创建的数据总线,不需要每次重建输出项:S_OK成功完成其他出错信息流程设置主机商家接收通道和服务商家返回渠道,返回的服务商家为NULLChannelBase* recvChannel = NULL;ChannelBase* returnChannel = NULL;Trade* svcChannel = NULL;先执行 GetRecvChannel取得接收数据的渠道( ChannelBase* ),

35、取不到则直接跳到最后的出错处理然后执行TradeRecvDataRecvReplyData收数据放入DataBus的_databuff , 长度放入_len收完数据可以释放recvChannel,recvChannel=NULL然后执行UnpackRecvData 解开数据执行UnpackRecvData将数据解开为FML Buffer然后调用 ClientInfoTable 的 generateKey方法生成键值然后调用fetchClientInfoRecord取得记录 ClientInfoRecord*然后RecoverDataBusInfo调用恢复返回前的DataBus信息然后根据Cli

36、entInfoRecord* record 的 trade_code中 调用GetTrade取得要返回信息的服务商家 Trade*然后调用TradeOutProcess生成对服务商家发送的数据然后判断是否要生成返回渠道ChannelBase* return_channel = clientinfo.channel;clientinfo.channel = NULL;/释放和clientInfo的联系if( return_channel = NULL )创建return_channel = CreateOutputChannel创建失败,转入出错处理调用TradeSendData 向服务商家发送

37、数据,失败转入出错处理释放return_channel return_channel=NULL释放svc_trade svc_trade=NULL出错处理:记录错误如果收发渠道 !=NULL释放收发渠道结束处理:如果 svc_trade!=NULL释放svc_trade注释:为了便于单元测试,从SvcRun中分离出该方法也可以在SvcRun中实现上述的全部逻辑可以单元测试 正常处理 以及 取渠道超时,输入处理失败,生成服务商家写渠道失败等情况问题:是否真的有助于单元测试?5.4.2.4 程序描述GetRecvChannelChannelBase* GetRecvChannel(Trade* p

38、_recv_trade )功能:根据商家取得接收的渠道输人项:Trade*p_recv_trade接收的商家输出项:ChannelBase*!=NULL取到=NULL没有取到注释:5.4.2.5 程序描述TradeRecvData (建议改为RecvReplyData)SINT32 TradeRecvDataRecvReplyData( ChannelBase* p_chnbase , Trade* p_trade , DataBus* p_databus , ACE_Time_Value* p_timeout ) 功能:从商家收取数据输人项:ChannelBase* p_chnbase渠道(

39、定义了数据收取方式)Trade* p_trade商家(商家收取数据的格式可能不同) (不可能存在不同的情况)DataBus* p_datrabus数据总线,收取数据存放地ACE_Time_Value* p_timeout超时时间输出项:S_OK成功其它失败注释:5.4.2.6 程序描述UnpackRecvDataSINT32 UnpackRecvData (DataBus* p_databus )功能:解开p_databus中的数据(_data_buff,_len),放入_var_pool输人项:DataBus* p_databus输出项:S_OK成功其它失败注释:5.4.2.7 程序描述fe

40、tchClientInfoRecordClientInfo* fetchClientInfoRecord(string key) 功能:从ClientInfoTable中查找客户端连接信息输人项:string key键值输出项:!=NULL找到=NULL没找到注释:key是由ClientInfoTable 的generateKey(p_databus : DataBus*)方法生成的5.4.2.8 程序描述RecoverDataBusInfoSINT32 RecoverDataBusInfo(ClientInfo* p_clientinfo_record , DataBus* p_databu

41、s ) 功能:从ClientInfo*信息中恢复出原来的DataBus信息输人项:string key键值输出项:!=NULL找到=NULL没找到注释:问题:原来的InProcess以后DataBus的数据怎么办?这里很容易出错,要单元测试5.4.2.9 程序描述getTradeTrade* getTrade( string trade_code ) 功能:生成商家输人项:string trade_code输出项:!=NULL找到=NULL没找到注释:5.4.2.10 程序描述TradeOutProcessSINT32 TradeOutProcess( Trade* p_trade, Data

42、Bus* p_databus ) 功能:执行商家的对外数据处理输人项:Trade* p_tradeDataBus* p_databus输出项:S_OK成功其他失败注释:5.4.2.11 程序描述CreateOutputChannelChannelBase* CreateOutputChannel( Trade* out_trade ) 功能:创建输出的渠道输人项:Trade* p_trade输出项:ChannelBase !=NULL成功=NULL失败注释:在读写渠道不同的情况下被调用生成写的渠道5.4.2.12 程序描述TradeSendDataSINT32 TradeSendData(p_trade : Trade*, p_databus : DataBus*) 功能:调用商家方法发送数据总线中的数据输人项:Trade* p_tradeDataBus* p_databus输出项:S_OK成功其他失败注释:5.5 ClientInfo客户端连接数据5.5.1 类图5.5.2 类描述类

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 施工组织

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁