文件服务.二开案例.第三方文件服务集成至金蝶云星空

本文档将介绍如何将一个第三方的文件服务实例集成到金蝶云星空下,使得后续我们可以在金蝶云星空直接使用该文件服务实例上传下载附件。
发布版本:7.5
上线日期:2020年4月30日
补丁号:PT-146833
新特性介绍
- 可实现将一个第三方的文件服务实例集成到金蝶云星空下,使得后续我们可以在金蝶云星空直接使用该文件服务实例上传下载附件。
操作指引
1元数据设计,创建连接配置界面
2元数据设计,拓展文件服务设置界面
3编码实现,连接配置表单插件
4编码实现,第三方存储服务插件
5预插脚本,存储服务插件表格
特性效果展示
本文档将以金蝶云盘·企业云存储作为示例,下图为实现后的效果。


1、操作步骤
1.1、元数据设计
1.1.1、创建连接配置界面
1)首先新建动态表单,必须继承自 BOS => 基对象模板 => 动态表单 => 云存储配置模板,下图为初始界面。

2)然后开始添加连接配置信息需要使用到的相关字段,如账号密码,如服务器地址等等,关键是看你使用的文件服务实例需要提供什么连接配置信息。
此处以金蝶云盘·企业云存储为例,需用户提供账号、密码以及企业编码。下图为示例界面,其中如果不希望填写内容被展示,可勾选密码字段属性。

3)注册表单插件,待1.2.1步骤表单插件编写完毕,可回来注册表单插件。
1.1.2、拓展文件服务设置界面
二开拓展BOS_FileServerConfig文件服务设置动态表单,此为初始界面。

1)首先向“文件存储位置”枚举类型下添加“金蝶云盘·企业云存储”枚举项,如下图。可选中“单选按钮组”字段,通过枚举类型属性添加新的枚举项。
注意:此处的枚举值,为给标准产品预留枚举值防止冲突,自定义的枚举值可用英文字符从a开始。同时记住该枚举值,后续做预插数据时,需要通过该枚举值映射1.2.2第三方存储服务插件。

2)接着拖“单选按钮”字段到“单选按钮组”里面,单选按钮的字段的名称、标题改为“金蝶云盘·企业云存储”,组别属性选择“单选按钮组”,枚举项属性选择新添加的“金蝶云盘·企业云存储”枚举项,勾选即时触发值更新事件属性,如下图所示。

1.2、编码实现
1.2.1、连接配置表单插件
1)创建表单插件,继承Kingdee.BOS.Business.PlugIn.CloudServiceCfgPlugin, Kingdee.BOS.Business.PlugIn 存储配置基类。
2)必须实现的方法有四个,GetStorageServiceClassName返回第三方存储服务插件名、BuildKernelXml读取界面信息构建配置信息的xml字符串、FillFieldDataByKernelXml解析配置信息xml字符串绑定界面数据、BuildConnectConfigDic读取界面信息构建配置信息字段,用以实现连接配置信息存储跟界面数据绑定。
注意:GetStorageServiceClassName()方法需要返回1.2.2步骤的第三方存储服务插件名。
3)可选实现的方法有两个,SetKernelFieldDisabled、CheckKernelFieldIsModified,用以实现连接配置被使用后,相关字段是否可修改的控制。
4)插件编写完成后,需注册至连接配置界面的表单插件上,如下图:

5)如下为示例代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Xml;
using Kingdee.BOS.Business.PlugIn;
using Kingdee.BOS.Util;
namespace Running.Sample.PlugIn.Others
{
/// <summary>
/// 金蝶云盘·企业云存储连接配置的表单插件。
/// </summary>
[Description("金蝶云盘·企业云存储连接配置的表单插件"), HotUpdate]
public class KdPanEntpCloudCfgPlugIn : CloudServiceCfgPlugin
{
//字段标识。
private const string FUserName = "FUserName"; //用户名。
private const string FPassword = "FPassword"; //密码。
private const string FOrgId = "FOrgId"; //企业编码。
/// <summary>
/// 返回存储服务插件类名。
/// </summary>
/// <returns></returns>
public override string GetStorageServiceClassName()
{
return "Running.Sample.PlugIn.Others.KdPanEntpCloudStorageServicePlugin, Running.Sample.PlugIn";
}
/// <summary>
/// 构建并返回配置信息的自定义XML字符串,用以保存文件服务的连接配置信息进数据库。
/// </summary>
/// <returns></returns>
protected override string BuildKernelXml()
{
StringBuilder strXml = new StringBuilder();
strXml.Append("<ConfigMetadata>\n");
//调整此处逻辑,改为自己的连接配置字段即可。
strXml.AppendFormat("<UserName>{0}</UserName>\n", GetParamValue(FUserName));
strXml.AppendFormat("<Password>{0}</Password>\n", GetParamValue(FPassword));
strXml.AppendFormat("<OrgId>{0}</OrgId>\n", GetParamValue(FOrgId));
strXml.Append("</ConfigMetadata>\n");
return strXml.ToString();
}
/// <summary>
/// 传入 BuildKernelXml 方法构建的自定义配置信息,将其解析并填充到界面各自定义字段上,
/// </summary>
/// <param name="kernelXml">由 BuildKernelXml 方法构建的自定义配置信息。</param>
protected override void FillFieldDataByKernelXml(string kernelXml)
{
XmlNode node = ConvertKernelXmlToXmlNode(kernelXml);
if (node == null) return;
foreach (XmlNode nod in node.ChildNodes)
{
switch (nod.Name)
{
case "UserName": this.View.Model.SetValue(FUserName, nod.InnerText); break;
case "Password": this.View.Model.SetValue(FPassword, nod.InnerText); break;
case "OrgId": this.View.Model.SetValue(FOrgId, nod.InnerText); break;
}
}
}
/// <summary>
/// 构建并返回云存储配置信息的字典集合,用以在云存储服务插件内解析该云存储配置是否可用。
/// </summary>
/// <returns></returns>
protected override Dictionary<string, string> BuildConnectConfigDic()
{
Dictionary<string, string> dicConnConfig = new Dictionary<string, string>();
dicConnConfig["UserName"] = GetParamValue(FUserName);
dicConnConfig["Password"] = GetParamValue(FPassword);
dicConnConfig["OrgId"] = GetParamValue(FOrgId);
return dicConnConfig;
}
/// <summary>
/// 连接配置一旦被使用过了,本质上要求核心字段不可再更改,此处可设置哪些字段不可用,
/// 如此处要求连接配置一旦被使用,用户名及企业编码不再允许更改。
/// </summary>
protected override void SetKernelFieldDisabled()
{
//不允许修改账号及企业编码,但允许修改密码及是否启用等,防止密码变了但是不可改配置信息的情况。
this.View.GetControl(FUserName).Enabled = false;
this.View.GetControl(FOrgId).Enabled = false;
}
/// <summary>
/// 保存时,判断连接配置是否已使用,同时检查配置信息核心字段是否已被修改过。
/// </summary>
/// <param name="kernelXml">由 BuildKernelXml 方法构建的存储自定义配置信息的XML字段值。</param>
/// <returns>返回配置信息核心字段是否已被修改过。</returns>
protected override bool CheckKernelFieldIsModified(string kernelXml)
{
//界面填写值。
string userName = GetParamValue(FUserName);
string orgId = GetParamValue(FOrgId);
//数据库存储值。
XmlNode node = ConvertKernelXmlToXmlNode(kernelXml);
if (node == null) return false;
foreach (XmlNode nod in node.ChildNodes)
{
if (nod.Name == "UserName" && nod.InnerText != userName)
return true;
if (nod.Name == "OrgId" && nod.InnerText != orgId)
return true;
}
return false;
}
}
}
1.2.2、第三方存储服务插件
1)创建插件类,继承Kingdee.BOS.Core.FileServer.AbstractCloudStorageServicePlugin, Kingdee.BOS.Core 存储服务插件基类。
2)必须实现的方法:
KdPanEntpCloudStorageServicePlugin()、KdPanEntpCloudStorageServicePlugin(int fileServiceId)构造函数,GetFormId返回第三方连接配置表单的唯一标识,即1.1.1创建的动态表单唯一标识,TestConnect测试云存储实例是否可用,SaveFile文件保存,DeleteFile文件删除,DownloadFile文件下载、DownloadFileByPart文件分块下载。
3)可选实现的方法:
GetFormTitle返回连接配置界面标题,默认为:云存储配置模板。
4)存储服务插件编写完成后,需执行预插脚本,可参考1.3步骤的格式,用以关联第三方连接配置。
5)如下为示例代码:
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using Kingdee.BOS;
using Kingdee.BOS.Core.FileServer;
using Kingdee.BOS.Core.Objects.CloudObject;
using Kingdee.BOS.FileServer.Core.StorageService;
using Kingdee.BOS.JSON;
using Kingdee.BOS.ServiceHelper;
namespace Running.Sample.PlugIn.Others
{
[Description("金蝶云盘·企业云存储服务插件")]
public class KdPanEntpCloudStorageServicePlugin : AbstractCloudStorageServicePlugin
{
private readonly KdEntpCloudStorageService _service = new KdEntpCloudStorageService();
private readonly ConcurrentDictionary<int, KdEntpCloudStorageServiceArgs> _connArgDic =
new ConcurrentDictionary<int, KdEntpCloudStorageServiceArgs>();
public KdPanEntpCloudStorageServicePlugin()
: base(0)
{ }
public KdPanEntpCloudStorageServicePlugin(int fileServiceId)
: base(fileServiceId)
{ }
/// <summary>
/// 返回第三方连接配置表单的唯一标识。
/// </summary>
/// <returns></returns>
public override string GetFormId()
{
return "YZDS_KingdeeEntpCloudStorageCfg";
}
/// <summary>
/// 测试云存储实例是否可用。
/// </summary>
/// <param name="jArray">云存储连接配置信息。</param>
/// <returns>返回是否可用。</returns>
public override bool TestConnect(JSONArray jArray)
{
//此处拿到连接配置信息JSONArray,可根据实际第三方文件服务要求,验证连接是否可用。
if (jArray == null || jArray.Count <= 0) return false;
Dictionary<string, string> dict = jArray[0] as Dictionary<string, string>;
if (dict == null) return false;
KdEntpCloudStorageServiceArgs connArgs = new KdEntpCloudStorageServiceArgs
{
UserName = dict["UserName"],
Password = dict["Password"],
OrgId = dict["OrgId"]
};
return _service.TestConnect(connArgs);
}
/// <summary>
文件服务.二开案例.第三方文件服务集成至金蝶云星空
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



