二开案例.表单服务.服务端表单服务

【应用场景】
将服务端的通用功能封装成表单服务,当操作在服务端执行时,连带执行此服务。
【案例演示】
封装一个发送消息的表单服务,绑定在采购订单的保存操作上,每次保存时,就给指定用户发送一条消息。


【实现步骤】
编写表单服务自定义参数界面->编写表单服务类->注册表单服务->在单据上使用表单服务
<1>打开BOS设计器,设计表单服务自定义参数界面。


<2>编写自定义参数类,用于包装表单服务的自定义参数。
using Kingdee.BOS.Orm.DataEntity;
using System;
namespace Jac.XkDemo.BOS.Core.AppBusinessService
{
/// <summary>
/// 发送消息服务的配置参数
/// </summary>
[Serializable]
public class SendMessageParameter
{
/// <summary>
/// 接收人字段Key
/// </summary>
[SimpleProperty]
public string ReceiverKey { get; set; }
/// <summary>
/// 组织字段Key
/// </summary>
[SimpleProperty]
public string OrgKey { get; set; }
}
}
<3>编写表单服务在BOS设计器中的自定义参数界面的控制代码,实现设计时功能。
using DevExpress.XtraEditors.Controls;
using Kingdee.BOS.Core.Designer;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Core.Metadata.FormElement;
using Kingdee.BOS.DomainModelDesigner.PropertyEditor;
using Kingdee.BOS.DomainModelDesigner.ServiceDesigner;
using Kingdee.BOS.Resource;
using Kingdee.BOS.Util;
using Kingdee.BOS.WinForm;
using Kingdee.BOS.WinForm.Ctrl;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace Jac.XkDemo.BOS.Core.AppBusinessService
{
/// <summary>
/// 发送消息服务配置界面
/// </summary>
public class SendMessageDesigner : KDDynamicUserControl, IFormBusinessServiceDesigner
{
#region 私有变量、控件
/// <summary>
/// 接收人字段(必录)
/// </summary>
private KDComboBox cbbReceiverKey;
/// <summary>
/// 组织字段
/// </summary>
private KDComboBox cbbOrgKey;
/// <summary>
/// 界面配置成果
/// </summary>
private FormBusinessService businessService;
#endregion
#region ctor
/// <summary>
/// 构造函数,传入本界面对应的动态表单编码,基类自动完成界面的加载
/// </summary>
/// <remarks>
/// 本界面与特定下推、特定选单共用一个界面,界面改动时,要注意影响
/// </remarks>
public SendMessageDesigner()
: base("Jac_SendMessage")
{
// TODO
}
#endregion
#region IFormBusinessServiceDesigner
/// <summary>
/// 初始化控件
/// </summary>
protected override void InitializeComponent()
{
base.InitializeComponent();
this.cbbReceiverKey = (KDComboBox)(this.GetControl<KDItemContainer>("F_Jac_ReceiverKey").Control);
this.cbbReceiverKey.Properties.TextEditStyle = TextEditStyles.DisableTextEditor;
this.cbbOrgKey = (KDComboBox)(this.GetControl<KDItemContainer>("F_Jac_OrgKey").Control);
this.cbbOrgKey.Properties.TextEditStyle = TextEditStyles.DisableTextEditor;
}
/// <summary>
/// 表单服务编辑控件
/// </summary>
public System.Windows.Forms.Control ActionDesignerCtl
{
get { return this; }
}
/// <summary>
/// 表单服务实例、描述信息
/// </summary>
public FormBusinessService Service { get; set; }
/// <summary>
/// 表单服务所在的元素实例
/// </summary>
public AbstractElement SourceElement { get; set; }
/// <summary>
/// 领域模型设计Model对象,管理元数据信息
/// </summary>
public IMetaDataDesignerModel Model { get; set; }
/// <summary>
/// 表单服务确定后,返回检查结果
/// </summary>
private bool actionValidated;
/// <summary>
/// 表单服务确定后,返回检查结果
/// </summary>
public bool ActionValidated
{
get
{
this.actionValidated = true; // 默认为通过
// 校验
var errorMessage = string.Empty;
if (!ValidateOperateParameter(ref errorMessage))
{
KDMessageBox.Show(errorMessage, "金蝶提示", MessageBoxButtons.OK);
this.actionValidated = false;
return this.actionValidated;
}
return this.actionValidated;
}
set { this.actionValidated = value; }
}
/// <summary>
/// 表单服务类型
/// </summary>
public string ActionType { get; set; }
/// <summary>
/// 开始解析、展示实例数据
/// </summary>
public new void Load()
{
this.businessService = this.Service;
if (this.businessService == null)
{
this.businessService = new FormBusinessService(this.Service);
}
var businessInfo = this.Model.FormMetaData.BusinessInfo;
// 把已经配置的服务参数,展示到界面上
SendMessageParameter sendMessageParameter = null;
if (!string.IsNullOrWhiteSpace(businessService.Setting))
{
sendMessageParameter = JsonConvert.DeserializeObject<SendMessageParameter>(businessService.Setting);
}
if (sendMessageParameter == null)
{
sendMessageParameter = new SendMessageParameter();
}
BindReceiver(businessInfo, sendMessageParameter);
BindOrg(businessInfo, sendMessageParameter);
}
/// <summary>
/// 打包、提交表单服务实例
/// </summary>
public void Commit()
{
var sendMessageParameter = new SendMessageParameter();
var receiverKey = this.cbbReceiverKey.EditValue as ListItem;
if (receiverKey != null)
{
sendMessageParameter.ReceiverKey = receiverKey.Value.ToString();
}
var orgKey = this.cbbOrgKey.EditValue as ListItem;
if (orgKey != null)
{
sendMessageParameter.OrgKey = orgKey.Value.ToString();
}
businessService.Setting = JsonConvert.SerializeObject(sendMessageParameter);
this.Service = this.businessService;
}
#endregion
#region 私有函数
/// <summary>
/// 绑定接收人字段
/// </summary>
private void BindReceiver(BusinessInfo businessInfo, SendMessageParameter parameter)
{
this.cbbReceiverKey.Properties.Items.Clear();
var userFields = businessInfo.GetFieldList().Where(o => o is UserField).ToList();
var list = new List<ListItem>();
list.Add(new ListItem("", ""));
ListItem defaultItem = null;
var hasDefaultItem = !string.IsNullOrWhiteSpace(parameter.ReceiverKey);
foreach (var field in userFields)
{
var item = new ListItem(field.Key, field.Name.ToString());
list.Add(item);
if (hasDefaultItem && field.Key.EqualsIgnoreCase(parameter.ReceiverKey))
{
defaultItem = item;
}
}
this.cbbReceiverKey.Properties.Items.AddRange(list);
if (defaultItem != null)
{
this.cbbReceiverKey.EditValue = defaultItem;
}
else
{
this.cbbReceiverKey.EditValue = list[0];
}
}
/// <summary>
/// 绑定组织字段
/// </summary>
private void BindOrg(BusinessInfo businessInfo, SendMessageParameter parameter)
{
this.cbbOrgKey.Properties.Items.Clear();
var orgFields = businessInfo.GetFieldList().Where(o => o is OrgField).ToList();
var list = new List<ListItem>();
list.Add(new ListItem("", ""));
ListItem defaultItem = null;
var hasDefaultItem = !string.IsNullOrWhiteSpace(parameter.OrgKey);
foreach (var field in orgFields)
{
var item = new ListItem(field.Key, field.Name.ToString());
list.Add(item);
if (hasDefaultItem && field.Key.EqualsIgnoreCase(parameter.OrgKey))
{
defaultItem = item;
}
}
this.cbbOrgKey.Properties.Items.AddRange(list);
if (defaultItem != null)
{
this.cbbOrgKey.EditValue = defaultItem;
}
else
{
this.cbbOrgKey.EditValue = list[0];
}
}
/// <summary>
/// 校验参数对象
/// </summary>
/// <param name="errorMessage"></param>
/// <returns></returns>
private bool ValidateOperateParameter(ref string errorMessage)
{
SendMessageParameter sendMessageParameter = null;
if (!string.IsNullOrWhiteSpace(businessService.Setting))
{
sendMessageParameter = JsonConvert.DeserializeObject<SendMessageParameter>(businessService.Setting);
}
if (sendMessageParameter == null || string.IsNullOrWhiteSpace(sendMessageParameter.ReceiverKey))
{
errorMessage = "请设置接收人字段";
return false;
}
return true;
}
#endregion 配置校验
}
}
<4>编写服务端表单服务,实现运行时功能。
using Kingdee.BOS;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.Enums;
using Kingdee.BOS.Core.Metadata.FormElement;
using Kingdee.BOS.Core.Msg;
using Kingdee.BOS.Msg;
using Kingdee.BOS.Orm;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Util;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
namespace Jac.XkDemo.BOS.Core.AppBusinessService
{
/// <summary>
/// 【服务层表单服务】发送消息
/// </summary>
public class SendMessageService : AbstractAppBusinessService
{
#region var
/// <summary>
/// 服务端表单服务执行参数
/// </summary>
private AppBusinessServiceArgs appBusinessServiceArgs;
/// <summary>
/// 服务配置
/// </summary>
private FormBusinessService serviceConfig;
#endregion
二开案例.表单服务.服务端表单服务
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



