U8开发之CS门户集成

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C/S门户集成
摘要
通过企业应用平台(简称门户),企业员工可以通过单一的访问入口访问企业的各种信息,定义自己的业务工作,并设计自己的工作流程。

企业应用平台通过各类导航执行具体的功能,通过桌面提供快捷常用功能和快捷报表信息,通过边框区提供辅助功能。

什么是门户?
门户(Portal):原意是指正门、房屋的出入口;现多用与互联网的门户网站,是指集成了多样化内容服务的Web站点,又称为网络门户;我们这里所说的门户是指客户服务器结构(C/S)的应用程序的入口,集成了用友U8应用的绝大部分内容,为用户提供了一个单一的入口。

U8门户是一个开放的平台,可以支持用户进行二次开发,以拓展U8的功能,满足用户个性化的业务场景。

目标
本文主要介绍使用门户提供的开发框架进行二次开发的相关事项,以方便将用户个性化的应用集成到U8门户中,以解决U8标准产品不提供的、用户实际工作需要的问题。

门户可以做什么?
门户可以将用户开发的程序,通过门户提供的扩展机制,集成到门户中。

具体支持如下几种方式的扩展:
1.将使用VB开发的组件集成到门户
2.将使用.Net开发的UserControl集成到门户
3.将独立运行的Exe程序集成到门户
4.将使用.Net开发的ViewPart集成到门户
如何开发可与门户集成的VB dll?
1.代码修改(890/10.0/10.1)
第一步:引用UFPortalProxyInterface.dll组件
实现接口ILoginable
Option Explicit
'修改1 实现接口
Implements UFPortalProxyInterface.ILoginable
Private Function ILoginable_CallFunction(ByVal cMenuId As String, ByVal cMenuName As String, ByVal cAuthId As String, ByVal cCmdLine As String) As Object
End Function
Private Function ILoginable_Login() As Boolean
MsgBox "Log on"
ILoginable_Login = True
End Function
Private Function ILoginable_LogOff() As Boolean
MsgBox "Log off"
End Function
各接口含义如下:
1、Login接口( Private Function ILoginable_Login() As Boolean ),不管弹出的是模式窗体还是非模式窗体,此接口在成功登录后须返回True,而且要保证登录成功后,第二次调用此接口时也要返回True。

只有在登录失败后方可返回False。

也就是说此接口返回值的含义是是
否已经成功登录子系统。

2、LogOff接口( Private Function ILoginable_LogOff() As Boolean ),此接口的含义是执行LogOff过程,如查成功使该子系统LogOff状态返回True,否则返回False。

也就是说,如果该子统还未登录,则真接返回False就可以了。

如果系统处于已经登录的过程,则执行业务组原有所需的LogOff过程,如果执行功能,正确LogOff了子系统,则返回True,否则返回False。

如果在实际程序中没有此过程,则直接返回True即可。

3、CallFunction接口(Private Function ILoginable_CallFunction() As Boolean)。

如果您的应用没有子系统登录过程的产品,此值须返回True.
第二步:增加Business属性
可读可写,且对大小写敏感。

此属性维护一个对于此业务工程全局变量,以实现和VB程序和Portal的交互。

参考实现如下:
增加Business属性
Option Explicit
'修改2增加Business属性
Public Property Get Business() As Object
Set Business = g_business
End Property
Public Property Set Business(busVal As Object)
Set g_business = busVal
End Property
第三步:增加全局变量
新建一module文件,并加入如下全局变量
增加Business属性
Option Explicit
'修改3增加g_business全局变量
Public g_business As Object
Public g_bLogined As Boolean
第四步:修改窗体
1、修改嵌入Portal的窗体文件
原来有MdiExtender控件的窗体,要嵌入Portal的窗体
修改方法:
调用CreateFormEnv方法
调用ShowForm方法
每个窗体都要有方法ExitForm
2、修改第一次弹出就是模态的窗体
可以直接使用通过采用VB窗体的Form.Show (vbModal)的方式,也调用
ShowForm方法来显示此窗体。

3、由嵌入Portal的窗体弹出的窗体
不作修改,如果是模式窗体,请在此窗体上加入UFFormPartner控件第五步:UFToolbar的修改,请参考《U8开发之工具栏控件》
窗体的UnLoad修改
Set UFToolbar1.Business = Nothing
其它:
FormIsOpened ‘判断窗体是否打开
SetFormActive ‘设置并激活某个已经存在的窗体
CloseForm ‘在显示过程中(窗体已经显示)关闭自身窗体
ShowForm
显示嵌入Portal的窗体
Public Function ShowForm(ByVal obj As Object, ByVal SubID As String, ByVal sKey As String, Optional modalable As Boolean = False, Optional DockToProtal As Boolean = True, Optional ByVal vfd As Object) As String
obj: Form对象;
SubID: 子产品号;
sKey: Key,注意不能是form的Hwnd,在窗体的生命周期中,此值必须唯一;
modalable: 该窗体是否为Model窗口;
DockToProtal : 是否要嵌入到Portal中;
vfd: 由CreateFormEnv对象的返回对象
CreateFormEnv
初始化嵌入Portal的环境
Public Function CreateFormEnv(ByVal sKey As String, ByRef formObj As Object) As VBFormDescriptor
sKey: Key,注意不能是form的Hwnd,在窗体的生命周期中,此值必须唯一;
formObj: Form对象
CloseForm
关闭一个已经打开的窗体
Public Function CloseForm(ByVal sKey As String, ByVal obj As Object)
sKey: Key,注意不能是form的Hwnd,在窗体的生命周期中,此值必须唯一obj: Form对象。

SetFormActive
使某个窗口成为当前窗口
Public Function SetFormActive(ByVal sKey As String, ByVal obj As Object)
sKey: Key,注意不能是form的Hwnd,在窗体的生命周期中,此值必须唯一obj: Form对象
2.数据库修改
菜单预置数据
--例:增加门户菜单,将您的程序挂接到供应链(SCMG)下面
--select * from ua_menu where cMenu_id='SCMG'
--select * from ua_subsys where cSub_Id='dm'
DELETE FROM[UFSystem].[dbo].[ua_subsys]WHERE cSub_id='DM' INSERT INTO
[UFSystem].[dbo].[ua_subsys](cSub_id,cSub_name,iTasks,bInstalled, iVersion,cObjCreate,dStart,nType,cEntType,iOrder,cMonthEndFld) values('DM','DM',0,0,'11.0','CreateCom',NULL,64,NULL,100,NULL)
DELETE FROM[UFSystem].[dbo].[UA_Menu]WHERE[cMenu_Id]='DM' INSERT INTO[UFSystem].[dbo].[UA_Menu]([cMenu_Id],[cMenu_Name], [cMenu_Eng],[cSub_Id],
[IGrade],[cSupMenu_Id],[bEndGrade],[cAuth_Id],[iOrder], [iImgIndex],[Paramters],[Depends],[Flag])
VALUES('DM','测试产品
',null,'DM',0,'SCMG',0,NULL,0,0,NULL,NULL,NULL)
DELETE FROM[UFSystem].[dbo].[UA_Menu]WHERE[cMenu_Id]='DM01' INSERT INTO[UFSystem].[dbo].[UA_Menu]([cMenu_Id],[cMenu_Name], [cMenu_Eng],[cSub_Id],
[IGrade],[cSupMenu_Id],[bEndGrade],[cAuth_Id],[iOrder], [iImgIndex],[Paramters],[Depends],[Flag])
VALUES('DM01','测试产品单据
',null,'DM',1,'DM',1,NULL,0,0,NULL,NULL,NULL)
DELETE FROM[UFSystem].[dbo].[UA_Menu]WHERE[cMenu_Id]='DM02' INSERT INTO[UFSystem].[dbo].[UA_Menu]([cMenu_Id],[cMenu_Name], [cMenu_Eng],[cSub_Id],
[IGrade],[cSupMenu_Id],[bEndGrade],[cAuth_Id],[iOrder], [iImgIndex],[Paramters],[Depends],[Flag])
VALUES('DM02','测试产品单据列表
3. 系统启用
如何开发可与门户集成的 .Net UserControl ?
1.
代码修改(890/10.0/10.1

第一步:使用VisualStudio 创建项目ProductSample 项目引用路
',null,'DM',1,'DM',1,NULL,0,0,NULL,NULL,NULL)
--增加idt 对应记录
DELETE FROM [UFSystem].[dbo].[ua_idt] where id ='DM' INSERT INTO [UFSystem].[dbo].[ua_idt]([id], [assembly], [catalogtype], [type], [class], [entrypoint], [parameter], [reserved])
VALUES ('DM','TestVBActiveX.Person',0,0,null,null,null,null) DELETE FROM [UFSystem].[dbo].[ua_idt] where id ='DM01' INSERT INTO [UFSystem].[dbo].[ua_idt]([id], [assembly], [catalogtype], [type], [class], [entrypoint], [parameter], [reserved])
VALUES ('DM01','TestVBActiveX.Person',0,0,null,null,null,null) DELETE FROM [UFSystem].[dbo].[ua_idt] where id ='DM02' INSERT INTO [UFSystem].[dbo].[ua_idt]([id], [assembly], [catalogtype], [type], [class], [entrypoint], [parameter], [reserved])
VALUES ('DM02','TestVBActiveX.Person',0,0,null,null,null,null)
径:
U8安装路径\ Interop\Interop.U8Login
U8安装路径\Portal\UFIDA.U8.Portal.Framework.dll
U8安装路径\ Portal \UFIDA.U8.Portal.Proxy.dll
U8安装路径\ Portal \mon.dll
第二步:继承NetLoginable,重载SubSysLogin,SubSysLogOff和CallFunction方法继承NetLoginable
public class MyLoginable : Loginable {
public override object CallFunction(string cMenuId, string cMenuName, string cAuthId, string cCmdLine)
{
INetUserControl mycontrol = new MyNetUserControl();
mycontrol.Title = "测试";
base.ShowEmbedControl(mycontrol, cMenuId, true);
return null;
}
public override bool SubSysLogin()
{
GlobalParameters.gLoginable = this;
return base.SubSysLogin();
}
public override bool SubSysLogOff()
{
return base.SubSysLogOff();
}
}
第三步:实现INetUserControl,重载SubSysLogin,SubSysLogOff和CallFunction方法实现INetUserControl
public class MyNetUserControl:UFIDA.U8.Portal.Proxy.editors.INetUserControl {
#region INetUserControl 成员
UserControl1 usercontrol = null;
private IEditorInput _editInput = null;
private IEditorPart _editPart = null;
private string _title;
///<summary>
/// EditorInput
///</summary>
public IEditorInput EditorInput
{
get
{
return _editInput;
}
set
{
_editInput = value;
}
}
///<summary>
/// EditorPart
///</summary>
public IEditorPart EditorPart
{
get
{
return _editPart;
}
set
{
_editPart = value;
}
}
///<summary>
///页签标题
///</summary>
public string Title
{
get
{
return this._title;
}
set
{
this._title = value;
}
}
public bool CloseEvent()
{
//throw new Exception("The method or operation is not implemented.");
return true;
}
public System.Windows.Forms.Control CreateControl(clsLogin login, string MenuID, string Paramters)
{
//构造U8登陆对象
U8Login.clsLogin u8login = new U8Login.clsLoginClass();
if (login != null)
{
u8login.ConstructLogin(erToken);
string taskId = login.GetTaskID("DP");
u8login.set_TaskId(ref taskId);
}
usercontrol = new UserControl1();
= "sddddddddd";
return usercontrol;
}
public Action[] CreateToolbar(clsLogin login)
{
IActionDelegate nsd = new NetSampleDelegate();
string skey = "mynewcontrol";
NetAction ac = new NetAction("sss", nsd);
NetAction[] aclist ;
aclist= new NetAction[1];
ac.Text = "Sample Button 2";
ac.Tag = usercontrol;
aclist[0]= ac;
return aclist;
// throw new Exception("The method or operation is not implemented.");
}
private void buttonclick(string buttonid)
{
}
#endregion
}
2.预置菜单
菜单预置数

--例:增加门户菜单,将您的程序挂接到供应链(SCMG)下面
DELETE FROM[UFSystem].[dbo].[UA_Menu]WHERE
[cMenu_Id]='AB'
INSERT INTO[UFSystem].[dbo].[UA_Menu]([cMenu_Id],
[cMenu_Name],[cMenu_Eng],[cSub_Id],
[IGrade],[cSupMenu_Id],[bEndGrade],[cAuth_Id],
[iOrder],[iImgIndex],[Paramters],[Depends],
[Flag])
VALUES('AB','测试
UserControl',null,'DP',0,'SCMG',1,NULL,0,0,NULL,N
ULL,NULL)
DELETE FROM[UFSystem].[dbo].[ua_idt]where id='AB'
INSERT INTO[UFSystem].[dbo].[ua_idt]([id],
[assembly],[catalogtype],[type],[class],
[entrypoint],[parameter],[reserved])
VALUES('AB','.\Portal\ProductS
ample.dll',0,2,'ProductSample.
MyLoginable',null,null,null)
3.部署
将程序集ProductSample.dll拷贝到U8安装目录Portal目录下
如何将独立运行的Exe程序集成到门户?
1、菜单调整
进入UAP,打开开菜单调整工具;
2、新增菜单
鼠标选中需要挂接的文件夹(如果没有可以用菜单调整工具新建文件夹),点新增按钮;
3、保存
保存后,自动生成一个菜单编号; 自动生成
菜单的多语名称,将在U8左树菜单里显示
如果是文件夹这里选否
如果控制功能权限,这里就选是
这里选择EXE
EXE时,参数无效这里输入EXE文件的路径,是一个相对于U8安装路径的相对路径,
举例,U8安装在d:\U8Soft,这里设置为.\EAI\U8EAI.exe,表示
D:\U8Soft\EAI\U8EAI.exe。

4、编辑idt.dll文件
用文本编辑器打开并修改U8安装目录\Portal\idt.dll文件,在文件末尾</idts>的前
面增加一行<idt id=’UA8’ type=’1’ assembly=’.\EAI\U8EAI.exe’/
如何开发一个类似助手视图一样的视图,嵌入门户?
1、创建项目
使用VisualStudio创建项目UFIDA.U8.Portal.SampleViews ,项目引用路径:
U8安装路径\Portal\UFIDA.U8.Portal.Framework.dll
U8安装路径\ Portal \mon.dll
2
继承ViewPart
namespace UFIDA.U8.Portal.SampleViews
{
public class PublisherView : ViewPart
{
private PublisherControl m_PublisherControl = null;
public const String ID = "UFIDA.U8.Portal.SampleViews.PublisherView.
消息发布视图";
public PublisherView()
: base(ID)
{
}
public override System.Windows.Forms.Control CreatePartControl()
{
m_PublisherControl = new PublisherControl();
m_PublisherControl.PublishMessage.Click += new
EventHandler(PublishMessage_Click);
return m_PublisherControl;
}
void PublishMessage_Click(object sender, EventArgs e) {
IMessage message = new Message();
message.Type = MessageTypeConstants.SAMPLE_MESSAGETYPE;
this.MessageExchanger.PublishMessage(message);
}
}
}
3
预置数据
--在账套库中执行下面脚本
DELETE FROM UA_VIEW WHERE
cInstanceID='59F7AC1B-BC07-4982-856A-55D2D7C70021'
INSERT INTO
UA_VIEW(cID,cName,cImplClass,cCategory,cDescription,cExtensi on,cInstanceID,bDisplay,bSystem,bDeleted,IsWebFlag)
VALUES('PublisherView','发布消息视图',
'UFIDA.U8.Portal.SampleViews.PublisherView,UFIDA.U8.Portal.S ampleViews','Assistant',
'发布消息视图',
NULL,'59F7AC1B-BC07-4982-856A-55D2D7C70021',1,1,0,0)
DELETE FROM UA_View_Lang WHERE
cInstanceID='59F7AC1B-BC07-4982-856A-55D2D7C70021'
INSERT INTO
UA_View_Lang(cInstanceID,cName,cDescription,cLocalID) VALUES('59F7AC1B-BC07-4982-856A-55D2D7C70021','发布消息视图','发布消息视图','zh-cn')
INSERT INTO
UA_View_Lang(cInstanceID,cName,cDescription,cLocalID) VALUES('59F7AC1B-BC07-4982-856A-55D2D7C70021','发布消息视图','发布消息视图','zh-tw')
INSERT INTO
UA_View_Lang(cInstanceID,cName,cDescription,cLocalID)
VALUES('59F7AC1B-BC07-4982-856A-55D2D7C70021','发布消息视图','发布消息视图','en-us')
go
4、部署
将UFIDA.U8.Portal.SampleViews.dll拷贝U8安装目录\Portal目录下
5、配置
进入单据页面设置,点“新增”按钮,输入标题,点“添加”按钮,选择“发布消息视图”,点“确定”按钮。

选中“关联菜单”页签,展开菜单树,选中“销售订单”,点“添加”。

然后确定。

打开“销售订单”单据
可以看到视图已经展现在“销售订单”左边。

相关文档
最新文档