普元流程开发手册(共58页).doc

上传人:飞****2 文档编号:14363988 上传时间:2022-05-04 格式:DOC 页数:58 大小:4.46MB
返回 下载 相关 举报
普元流程开发手册(共58页).doc_第1页
第1页 / 共58页
普元流程开发手册(共58页).doc_第2页
第2页 / 共58页
点击查看更多>>
资源描述

《普元流程开发手册(共58页).doc》由会员分享,可在线阅读,更多相关《普元流程开发手册(共58页).doc(58页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、精选优质文档-倾情为你奉上普元流程开发手册浪潮通信 OSS综合业务中心2011年6月1 熟悉流程通过Visio画出业务的流程图,充分理解流程的流转过程,流程环节,角色等信息(如图1-1)。(如图1-1)2 数据库建表2.1 建表目的存储流程发起页面的字段内容,供流程详情页面使用。(如图2-1)2.2 表字段 表命名规范:以T_BNS_为前缀。 工单发起页面中除资源服务外的所有字段(上传附件另外存储这里不作考虑)。 必须包括的字段l IDNUMBER not null表主键l FORM_NOVARCHAR2(40)工单编号l FLOW_IDNUMBER工单流水号l PIDNUMBER流程实例号l

2、 STATENUMBER 工单状态l TITLEVARCHAR2(200)工单主题l START_TIMEDATE派单时间l OWNER_IDNUMBER派单人IDl OWNER_NAMEVARCHAR2(50)派单人l DEPT_IDNUMBER派单人部门IDl DEPT_NAMEVARCHAR2(50)派单人部门名称l CELL_PHONEVARCHAR2(40)派单人联系电话l FINISH_TIMEDATE要求完成时间(可选)l COMPANY_ID NUMBER公司IDl COMPANY_NAMEVARCHAR2(50)公司名称l ACCEPT_TIMEDATE受理时限l REPLY

3、_TIME DATE回复时限其中:FORM_NO是工单发起页面显示的工单编号。 FLOW_ID是工单的唯一标示。 PID是bps流程引擎生成的流程实例号。 STATE显示工单流程状态 ACCEPT_TIME是规定时间必须受理。 REPLY_TIME是规定时间必须处理完。2.3 Sequence规则:表名+seq。3 WSH生成代码3.1 生成代码3.1.1 参考WSH文档3.1.2 注意事项3.2 修改代码以基站入网流程为例: 增加com.inspur.app.btsIn.process包。 修改TbnsBtsIn.javal 增加属性templateName,processinstDesc。

4、同时增加get、set方法。l 增加clone();public Object clone()tryTbnsBtsIn cloneObject = (TbnsBtsIn)super.clone();return cloneObject;catch(CloneNotSupportedException ex)throw new InternalError(); 修改BaseTbnsBtsIn.javal 更改继承的BasePojo为com.inspur.app.basic.pojo.BasePojo。l 如有如下字段,字段类型必须符合,不符合的手工修改: flowId Long型 formNo

5、String型 title String型 state Long型 ownerName String型 ownerId Long型 companyName String型 companyId Long型 deptName String型 deptIdLong型 startTimejava.util.Date型 replyTimejava.util.Date型同时修改hbm配置文件。 修改TbnsBtsInAction.javal 更改继承关系,改为继承com.inspur.app.basic.action.AbstractTBnsAction类。l 更改getModel()方法的返回值为Obj

6、ect。l 实现AbstractTBnsAction的 getTbnsService()方法返回service实现类;如:service实现类为 tbnsBtsInService;public Object getTbnsService() return tbnsBtsInService;l 增加流程模板名:protected final static String TEMPLETNAME = com.inspur.app.btsIn.process.btsIn; 更改service层TbnsBtsInServiceImpl.javal 更改继承关系,继承com.inspur.app.basi

7、c.service.AbstractCommonTBnsService类。l 修改生成的action配置文件名,添加前缀struts-。l 修改struts.xml加入新生成的action配置文件。l 修改生成的spring配置文件。4 设计BPS流程4.1 配置BPS图4-1如上图所示配置好IP地址和端口号4.2 创建BPS流程图(如图4-2) 新建bps流程文件:l 流程文件创建在各流程的对应的process包下(如图4-3)。(如图4-3)l 流程名称为英文也是流程文件名。流程文件包路径+流程名称在系统流程设计器中还要用到。 设置流程属性:l 鼠标双击编辑区空白处,弹出流程属性设置对话框

8、。一般只需填写显示名称、作者、描述(如图4-4)。(如图4-4)4.3 添加活动和连接线 根据Visio流程图添加流程环节:l 增加流程活动:根据要添加的流程环节性质选取图元,从选用面板拖动到流程编辑区项目中常用活动流程编辑器中图元对应资源文件人工活动Jsp/html文件自动活动Java方法子流程流程文件注意: 由于在新建业务流程时,开始图元和结束图元默认已经生成,所以一般情况下无需拖拽这两个图元,并且在一个流程当中开始图元和结束图元都有且仅有一个,不能重复拖拽。l 编辑活动属性: 基本信息编辑活动ID为英文,该活动ID在系统流程设计器中还要用到。注意: u 开始环节后的第一个环节(发起及输入

9、数据)活动ID必须为jbr。u 结束环节前的最后一个环节(归档)活动ID必须为gd。 聚合模式为确定流程运行时该活动启动前,它的前驱活动触发该活动的启动条件。 分支模式为确定流程运行时该活动结束后,它的后继活动将以何种方式启动。l 指定参与者选择参与者选项卡,可以根据需要灵活地赋予当前活动不同的参与者。一般情况流程的第一个环节和最后一个环节的参与者应设为流程启动者。 如为页面手动选择派发对象,则参与者应选择技术手段设置中的相关数据,变量命名规则为assignList_ + 当前活动ID。如下图 如为后台程序自动压入参与者,则需根据流程具体情况自己编写代码,并通过规则逻辑选择该方法。注意更新bp

10、s引擎中的对应文件。参数配置表中写法如下图如下图 如果两个环节的处理人相同,可以在参与者中选择活动执行者 点击浏览选择与其参与者相同的环节。如下图建议活动参与者在建流程图之初都选择流程启动者,等整个流程流转无问题后在对活动参与者进行设置。l 添加连接线:在选用面板选择连接线,在流程编辑区连接两个活动图元。修改活动的属性,根据连线情况设定活动属性中的聚合模式和分支模式。如该环节处理结束后,后继环节为多个并行环节,则分支模式选择为多路分支(如图4-5):图4-5如该环节启动前,前驱环节为并行环节则聚合模式选择为多路聚合(如图4-6)。图4-6驳回操作需设置连接线属性(如图4-7):图4-7如果该流

11、程压入的is_back的值为true就执行该分支。(另见5.5流程表单库管理) 复杂连线:图4-8如图4-8:l A设置的是“多路分支”l E设置的是“多路聚合”l AB条件为b=1l AC条件为c=1l AD条件为d=1当AB、AC、AD中有一个执行完毕后,E活动会做是否启动的判断,由于E有三个分支线汇入,因此会判断是否三条线都满足条件。如果没有在线上设置条件,则默认是符合条件,E活动会一直等待其余分支的完成,如果AD中d!=1,则AD不会执行,因此E活动会因为等不到AD活动的结束而一直处于等待状态。解决方法是聚合的线上条件要与分支的一致,即:BE条件为b=1、CE条件为c=1、DE条件为d

12、=1。4.4 提交BPS流程 操作前首先确认BPS Server已经启动。 使用BPS流程编辑器打开流程文件,在流程编辑器中右键,中选择流程定义库交互/提交流程菜单项。 提交模式选择:l 按照默认方式提交用户选择按照默认方式提交流程时会有两种情况: 如果流程定义库已经存在业务流程则覆盖最新版本的流程。 如果流程定义库中不存在流程定义,则创建新版本流程。 l 覆盖已有版本如果流程不是第一次提交,用户可以从已经存在的版本列表中选择,指定一个已有的版本进行覆盖操作。 l 创建新版本用户提交业务流程时,可以选择创建新版本。版本生成规则是由BPS引擎控制的。如:当前流程版本为1.1.1,则会创建新版本1

13、.1.2;如果第一次提交版本则会创建版本1.1.1。 l 输入版本描述,选择是否立即发布。用户可随需输入版本描述信息,系统默认的注释信息为用户名和提交时间。用户可以决定是否立即发布流程: 选中立即发布复选框,则为部署后马上执行发布动作,如果有已经发布的旧版本则取消发布旧版本,马上发布当前版本。 不选中立即发布复选框,则为部署后不执行发布动作。如果是覆盖旧版本则不会改变原来版本的发布状态;如果是新版本则部署后为未发布状态。注意: 项目一般用默认方式提交。 记住提交的版本号,之后系统的流程设计器会用到。 如果忘记版本号可以去 WFPROCESSDEFINE表中查找 发布结果:提交完成后会显示提交结

14、果信息,可以查看流程和流程所引用的业务资源是否成功提交,对于提交失败的资源,会显示失败的错误信息。4.5 子流程l 创建BPS子流程:双击编辑区空白处,选择流程参数,设定子流程需要的参数。l 父流程引入子流程:l 设置参数:l 双击子流程图标,选择多子流程策略。被迭代元素为要压入bps流程引擎的变量名,一般为ArrayList。迭代变量为传入每个子流程的变量名。l 选择子流程参数,点击浏览选择要关联的子流程。并设定上要传入子流程的值。(迭代变量作为值传入子流程)5 应用流程设计器设计流程5.1 创建流程信息 选择流程设计器面板中的流程库: 创建流程信息l 流程英文名称是bps流程文件包路径+b

15、ps流程文件名。l 版本号与bps引擎流程模板的版本号保持一致(如果忘记版本号可查询数据库wfprocessdefine表)l 业务主表为之前第二步创建的数据表。l url为该流程action类的访问路径。l 是否是子流程:标示所建流程是否是子流程,子流程选择时可见(如下图)。以工程管理流程为例url为勘查单录入的action的名字 添加流程图(工单处理环节流程图查看时用到):将Visio画出的流程图放在项目eoms-skins/default/images/workflow下图片文件名为流程英文名称。文件格式为jpg。5.2 字典配置选择流程设计器面板中的字典配置:5.2.1 环节分类流程环

16、节分类的管理,用于环节库管理、流程表单库管理、流程库管理的业务类型选择。 选择左侧面板中的环节分类 创建环节类型点击创建(如上图) 创建环节分类字典中没有的分类。注意:显示名、数据值唯一不允许重复。 模糊查询环节分类:查询是否含有该流程所需的环节分类。 编辑和删除环节分类字典信息:5.2.2 流程分类在角色人员中要用到 选择左侧面板中的环节分类 创建环节类型点击创建(如上图) 填写新的类型操作与环节分类类似5.3 角色库 单击选择角色库: 明确流程中的角色:根据Visio流程图确定该流程所需的角色。 模糊查询相关角色:查询角色库中可以复用的角色。可根据归属类型、角色中文名称,角色英文名称查询。

17、 创建角色:创建角色库没有的角色。l 右键点击归属类型选择添加角色: 修改与删除角色:根据具体需要修改或删除角色。注意:删除是在数据库中做删除标志。1为删除。5.4 环节库l 维护流程中的环节:根据Visio流程图确定该流程所需的环节。l 模糊查询相关环节:查询环节库中可以复用的环节。l 创建环节:创建环节库中没有的环节。注意:l 环节的中文名称和英文名称在环节库中唯一,不允许重复。l 环节关联信息暂不操作。 修改与删除环节:根据具体需要修改或删除环节。注意:删除是在数据库中做删除标志。Y为删除。5.5 表单库管理 创建流程各环节表单:流程中除发起工单环节的各个环节的表单都要在流程表单库创建。

18、表单项解释:l 表单中文名称英文名称在流程表单库唯一不能重复;l 表单类型暂时没有用到;l 表单用途如选择环节处理,说明该表单为流程相关表单,将被放在工单页面中的工单处理信息区显示;l 表单用途如选择业务信息,说明该表单为业务服务相关表单,将被放在工单页面中的业务信息区显示;l 表单URL为处理该表单的Action类的访问路径;l 数据区对应变量为要往流程引擎压入的变量名,以逗号分隔。(如驳回操作压入is_back变量另见4.3添加活动和连接线);l 提交URL,工单处理信息提交的URL;l 如处理工单无特殊的处理,只是通用的字段,表单URL使用通用处理wfCommonAction即可,无需自

19、己再写action处理类和工单处理页面;通用工单处理页面: l 如只需简单增加字段,只需应用流程设计器中的流程环节表单定制器,自定义额外增加的部分。(数据的存储显示无需关心,通用方法会自动处理)l 如需特殊处理,需要自己写该环节的工单处理类。以工程管理流程中设计审核环节为例,步骤如下:1. 在对应流程的action包下创建新action类(约定该类只与一个环节对应)。2. 该action类继承com.inspur.app.basic.action. AbstractTBnsAction类,并根据不同需求实现父类抽象方法(另见第7章)。3. 该action类的配置文件中增加相应的跳转页面。res

20、ult name为deal转向工单处理页面;为detail的转向工单详情页面;还有为businessInfo的转向业务信息中流程侧页面;还有为historyBusinessInfo的为流转信息中业务信息流程侧页面;5.6 应用流程设计器画出流程定义一份与引擎流程模板的信息保持一致的流程数据,包括流程主信息、流程节点及节点与角色、表单、资源服务的关联数据,用于开发流程时使用,开发时以本功能定义的流程为根据开发,业务侧与引擎里的流程脱离,引擎里的流程只提供流转的功能。 选取要绑定的流程:选择需要绑定资源、表单、角色的流程,点击编辑流程图,弹出流程图编辑模板。 比照该流程的bps流程文件画出流程图:

21、说明:l 业务节点通过面板左上的业务节点类型选择。l 左键单击流程图的业务节点,在属性对话框编辑节点的属性说明:l 流程节点的英文名称与bps引擎流程模板活动节点的英文名称保持一致。l 派发对象类型:无需派发就选择不使用,并行的选择并行分支。 派发类型对象选择单一分支的工单处理页面自动添加一个派单信息组件。如图: 派单对象选择并行分支的工单处理页面根据分支个数添加派单信息组件。如图: 派单对象选择为不使用的工单处理界面不添加派单信息组件。如图:注意:并行分支汇总前的环节只有一个有派单对象。如: 业务端口确认的派发对象类型为不使用。l 子流程用子流程图表表示(另见5.1):l 绑定操作:选中流程

22、节点点击鼠标右键,单击绑定相关资源。说明:l 分别可以绑定表单、角色、资源服务。其中角色虽然与环节绑定,但整个流程该角色都可见。l 双击各列表的中资源的名称,该资源就会出现在已绑定的列表中。在已绑定的列表中单击名称,就会取消该绑定。5.7 提交流程点击提交,提交该流程的信息。5.8 表单定制 创建自定义表单:l 点击表单属性编辑自定义表单的信息说明: 流程分类:对应流程库管理中流程信息的流程分类。根据流程分类过滤流程。 流程名称:对应流程库管理中流程信息的流程中文名称,确定自定义表单要绑定的流程。 流程环节:对应流程库管理中该流程所绑定的环节,确定自定义表单要绑定的环节。 生成form标签:是

23、否在自定义表单中生成form标签(一般是否)。l 设计表单:特别说明:列表框的选择类型:新建选择项需要创建字典页面并在备注中填写customform。例:自定义表单部分:通过流程环节表单定制器绑定到流程环节后:5.9 角色人员 选择流程:在流程角色树选择要操作的流程。 选择角色:点击要操作的流程,显示已绑定在流程上的所有角色(参见5.6) 创建编辑群组:选择要增加的群组成员类型,点击增加按钮。根据选择的群组成员类型会弹出人员或组的选择框。选择后点击保存完成操作。注意:公司名称必选,只有当角色绑定到相关环节后才能正常添加群组成员6 制作发起页面发起页面需要自己制作发起页面必须包含如果发起页面有附

24、件必须在js中包含7 EXT派发抄送人员选择对话框说明方法参数释义:showSelector( title, cfgstr, callback, processNameEn, mode)1. title:(string类型)-设置整个弹出窗口的标题,如果为空,则标题默认为:“选择派发/抄送人员”;2. cfgstr:(string 类型)-选择树显示配置,用以控制显示哪个(哪些)树。值为role, user, group三者的自由组合,中间以逗号隔开。例如:role,user表示显示角色树以及人员树;user,group表示显示人员树与群组树;3. callback:(function 类型)

25、-回调函数。回调函数请设置两个参数分别接收派发、抄送人员的结果集。结果集的类型均为fields为id,name,type的EXT RECORD 类型的数组。例如回调函数为function callback(records1, records2),我们可以在方法体中对records1或者records2这两个数组进行遍历,遍历的每一项都是一个EXT的RECORD(可参考Ext.data.Record),它有三个可取值的key: id,name,type,可以通过record.get(id)等方法取得所需要的数据;4. processNameEn:(string 类型)-流程定义名,此参数仅在选择

26、区域中存在角色树的情况下有效且必须。用以展示流程所绑定的角色;5. mode:(string类型)-选择模式,可选值为pf、cs以及空值。分别代表:“只显示派发选择框”,“只显示抄送选择框”,“两个都显示”。注意:任何情况下回调函数callback都需要接收两个参数,假设mode取cs,只显示抄送人员选择区,在callback回调函数中也要写两个参数,但仅仅对第二个参数进行抽取数据即可。分派人时三个必须的条件有处理人的id 、name、type。例如:8 初始化工单页面AbstractTBnsAction的init()方法已经封装了通用操作。包括初始化当前操作人的基本信息;查询当前节点的派发对

27、象类型及后续节点列表;生成一个工单流水号等流程所需的参数;关联的子流程;绑定该环节自定义表单的加载;处理环节中绑定该环节除iframe外的资源服务加载;通用工单处理页面;自定义表单的显示和数据存储。 新建工单初始化(发起页面):l 如果发起页面需要特殊的业务处理,则需要在该流程的action类的initBody()方法中实现如: 发起页面绑定资源服务(发起页面绑定资源服务作特殊处理):Overridepublic void initBody() throws Exception object.setTemplateName(TEMPLETNAME);if(TextUtil.isNull(obj

28、ect.getActiveName() super.getTresConfigTasksService().creResTasksWhenFlowInit(super.getRequest(), object, null);程序说明:发起页面未生成环节名称。object.getActiveName()为空。对于工单信息通过flowId获取:object.getFlowId();TbnsEngineeringProMgt object1 = tbnsEngineeringProMgtService.getTbnsObjectByFlowId(object.getFlowId();9 发起流程或者

29、完成当前环节AbstractTBnsAction的submit()方法已经封装了通用操作。包括发起页面数据的处理;启动流程;完成当前环节处理。 发起流程:l 发起工单数据的封装,压入相关变量已有通用方法实现不需要另外编写代码。例如:在工程管理流程中的设计审核压入相关数据super.getRelationMap().put(finish_gcshg, true);super.getRelationMap().put(finish_gcsg, true);l 发起工单数据的保存,需要自己编写代码。 流程service实现类中实现父类抽象方法startupProcessBody()其中参数mainO

30、bj封装了发起工单的数据,参数resultMap封装了流程引擎数据,参数relationMap为相关数据区。例:完成工程管理流程发起页面数据的保存。Overridepublic void startupProcessBody(Map resultMap, Object mainObj, HashMap arg2, HttpServletRequest arg3) throws Exception TbnsEngineeringProMgt tbnsBtsIn = (TbnsEngineeringProMgt)mainObj;String pid = (String)resultMap.get(

31、pid);tbnsBtsIn.setPid(Long.valueOf(pid);tbnsEngineeringProMgtDao.saveOrUpdate(tbnsBtsIn); 完成当前环节:l 判断绑定的资源侧是否满足提交条件,表单数据入库,流程引擎相关操作不需要自己编写代码。l 如有特殊业务需要,在流程service实现类中实现父类抽象方法finishProcessBody()。Overridepublic void finishProcessBody(Map resultMap, Object mainObj, HashMap relationMap, HttpServletReque

32、st request) throws Exception . 扩展submit()方法:可以在submitBody()中编写代码。比如压入相关数据10 环节信息处理环节信息如需要特殊处理,有特殊处理的信息比如 工程管理流程的设计审核环节需要新建一个关于设计审核的pojo 新建的pojo在此环节对应的action中作为模型驱动对象。新建的pojo必须包含的属性如下所示private java.lang.String formNo;private java.lang.Long flowId;private java.lang.Long pid;private java.lang.String ti

33、tle;private java.lang.Long state;private java.lang.Long ownerId;private java.lang.String ownerName;private java.lang.Long deptId;private java.lang.String deptName;private java.lang.String cellPhone;private java.lang.Long companyId;private java.lang.String companyName;private java.lang.String process

34、DefName;如有其它信息继续添加属性 比如设计审核的审核结果 通过 不通过添加与页面表单中对应的属性 private java.lang.String back_layout;新添加的表单信息需要在环节详情页面用到$object. back_layout一个环节调用另一个环节的处理信息 代码如下WfActiveInfo activeInfo = super.getWfActiveInfoService().getActiveInfoByFlowIdAndActiveName(object.getFlowId(), contract,);List dealInfoList = new Arr

35、ayList() ;if(!TextUtil.isNull(activeInfo)dealInfoList=super.getWfActiveDealInfoService().listByCondition( and t.wfActiveInfo.id=+activeInfo.getId();/将取到的另一个环节的信息压入此环节对应的模型驱动对象中if(TextUtil.isNotNull(dealInfoList)setMObjByMap(object,dealInfoList);流程结束时如有特殊处理,重写finishProcessBody方法如下Overridepublic void

36、finishProcessBody(Map arg0, Object obj, HashMap arg2, HttpServletRequest request) throws Exception /获取流程的环节idString activeName = BeanUtils.getProperty(obj, activeName);if(TextUtil.isNotNull(activeName) & inspectionAudit.equalsIgnoreCase(activeName) )/获取相关数据区中的数据String openresult = request.getParamet

37、er(back_gcsg);if(true.equals(openresult) String names = finish_gcsg,tzbg;String processInstid = BeanUtils.getProperty(obj, pid);/移除相关数据区中的数据super.getWfCommonUtil().removeRelativeData(processInstid, names);11 环节驳回处理1、 拿工程管理流程中勘查单确认环节驳回到分派勘查单环节作为例子2、 在驳回的链接线上选择简单表达式,填入相关数据 和 值入下图3、 在环节处理信息中用表单radio确认是

38、否驳回, radio的name值与上图中的左值相同,代码如下:是否接收: 是否4、当流程主干信息驳回到流程分支上时,需要在流程出现分支的环节压入,流程聚合条件的相关数据。比如工程管理子流程中 设计审核环节开始有了分支,在主干环节验收环节需要驳回到 分支环节工程随工和工程施工!需要在设计审核环节提交时压入聚合的条件super.getRelationMap().put(finish_gcsg , true);super.getRelationMap().put(finish_gcsg, true);工程随工和工程施工到竣工报验的连接线的条件分别是finish_gcsg = true和finish_

39、gcsg=true如下图4、 当一个环节可能有多个流转方向时,该环节的分支模式选择多路分支,在连接线上选择简单表达式,当满足相应的简单表达式时,流程会按照对应的连接线进行流转。12 工单详情页面AbstractTBnsAction的detail()方法已经封装了通用操作。包括发起的工单详情和流转信息中工单处理信息,驳回到发起页面的处理。 流转信息中工单处理信息的展示,通用方法已实现无需编写代码。 工单详情需要编写新页面。工单详情页面为工单申请信息的展示,没有编辑功能。l detail.jsp代码开发:1. 拷贝发起页面create.jsp代码。2. 只保留工单信息,其余代码全部删除(将文本编辑框改为纯文本显示)。 驳回到发起页面,需要新建一个编辑页面。l 命名规范:统一命名为edit.jspl edit.jsp代码开发:1. 拷贝发起页面create.jsp代码。2. 去掉附件管理组件相关代码(tab页已有附件管理功能所以页面不需要)。3. 去掉extjs相关资源的include引入。l 流程主Action配置文件中增加相应跳转:页面路径 l 流程主Action中重写detailBody()方法,判断是驳回到工单发起页面时,从数据库查询出工单

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

当前位置:首页 > 教育专区 > 教案示例

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com