二开案例.表单服务.操作监控服务
【应用场景】将某种通用的业务逻辑封装成一种服务,使得操作通过配置即可获得该服务能力,实现代码重用,降低系统复杂度。
【案例演示】以菜单订单的删除操作为例,封装一个操作监控的服务,监控采购订单的删除动作。
【实现步骤】
<1>编写表单服务,代码如下。
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.Enums;
using Kingdee.BOS.Core.Log;
using Kingdee.BOS.Util;
using System.Collections.Generic;
using System.ComponentModel;
namespace Jac.XkDemo.BOS.App.PlugIn.Service
{
/// <summary>
/// 【表单服务】操作监控服务
/// </summary>
[Description("【表单服务】操作监控服务"), HotUpdate]
public class OperationMonitorAppBusinessService : AbstractAppBusinessService
{
#region 重载函数
/// <summary>
/// 重载是否允许在IDE中设定执行时机:本服务不允许在IDE设定时间点,服务要求必须在操作后执行
/// </summary>
public override bool SupportActionPoint
{
get { return false; }
}
/// <summary>
/// 重载执行时间点:设定本服务仅在操作后执行
/// </summary>
public override int ActionPoint
{
get { return (int)BOSEnums.Enu_ServiceActionPoint.AfterOperation; }
}
/// <summary>
/// 是否允许批量执行?本服务允许批量执行;
/// </summary>
public override bool RequestBatchProcess
{
get { return true; }
}
/// <summary>
/// 添加本服务必须加载的字段
/// </summary>
/// <param name="fieldKeys"></param>
public override void PreparePropertys(List<string> fieldKeys)
{
// TODO:fieldKeys.Add("???")
}
/// <summary>
/// 服务执行函数:在允许批量执行时,本函数不会被调用
/// </summary>
/// <param name="e"></param>
public override void DoAction(AppBusinessServiceArgs e)
{
// TODO: 本服务允许批量执行,本函数不会被调用,无需实现
}
/// <summary>
/// 服务执行函数:在允许批量执行时,本函数被调用
/// </summary>
/// <param name="e"></param>
public override void DoActionBatch(AppBusinessServiceArgs e)
{
// TODO
if (this.FormOperation.Operation.EqualsIgnoreCase("Delete"))
{
// 执行删除操作后写入上机日志
var logs = new List<LogObject>();
var billName = this.BusinessInfo.GetForm().Name;
var billNoField = this.BusinessInfo.GetBillNoField();
foreach (var dataEntity in e.DataEntities)
{
var log = new LogObject();
log.pkValue = dataEntity.DataEntity[0].ToString();
log.Description = string.Format("[{0}{1}]被{2}删掉啦!", billName, dataEntity[billNoField.PropertyName], Context.UserName);
log.OperateName = "表单服务保存上机日志";
log.ObjectTypeId = this.BusinessInfo.GetForm().Id;
log.SubSystemId = this.BusinessInfo.GetForm().SubsysId;
log.Environment = OperatingEnvironment.BizOperate;
logs.Add(log);
}
ServiceFactory.GetLogService(Context).BatchWriteLog(this.Context, logs);
}
// TODO
}
#endregion 重载函数
}
}
<2>拷贝插件组件到应用站点的WebSite\Bin目录下,重启IIS。
<3>发布表单服务,使之在BOSIDE设计器可见。前往业务账套所在数据库,执行以下SQL脚本完成表单服务的注册。
-- 注册表单服务
DELETE FROM T_MDL_FORMBUSINESS WHERE FACTIONID=888101;
INSERT INTO T_MDL_FORMBUSINESS (FACTIONID,FNAME,FTYPE,FSETCOMPONENT,FRUNCOMPONENT,FDESIGNERVISIBLE,FREVERSEACTIONCLASS,FPUSHCOMPONENT,FDEFAULTRAISETYPE,FAPPSCENARIOTYPE)
VALUES (888101,'OperationMonitor',8,'','Jac.XkDemo.BOS.App.PlugIn.Service.OperationMonitorAppBusinessService,Jac.XkDemo.BOS.App.PlugIn',0,'','',41,1);
DELETE FROM T_MDL_FORMBUSINESS_L WHERE FACTIONID=888101 AND FLOCALEID=2052;
INSERT INTO T_MDL_FORMBUSINESS_L (FPKID,FACTIONID,FLOCALEID,FDESC,FSYNTAX,FPARAMETER)
VALUES ((SELECT ISNULL(MAX(FPKID),100000)+1 FROM T_MDL_FORMBUSINESS_L),888101,2052,N'操作监控服务',N'',N'');
<4>BOSIDE扩展采购订单,给删除操作注册表单服务【操作监控服务】,保存元数据,开发完毕。
现在可以登录业务站点,执行采购订单的删除操作后,查看上机日志可知,我们发布并绑定在采购订单删除操作删的表单服务已经被成功执行啦~~
【知识点】
<1>表单服务分为Web层表单服务和App层表单服务。
Web层表单服务:继承自Kingdee.BOS.Business.DynamicForm.AbstractFormBusinessService,多用于控件编程,界面交互等,对应T_MDL_FORMBUSINESS表的FTYPE=7。
参考示例:标准产品中的显示字段,隐藏字段,锁定字段等。
App层表单服务:继承自Kingdee.BOS.Business.DynamicForm.AbstractAppBusinessService,多用于业务逻辑处理、数据校验,数据处理及数据持久化等,对应T_MDL_FORMBUSINESS表的FTYPE=8。
参考示例:标准产品中的库存更新服务,自动下推服务。
<2>标准产品的表单服务的实现类可通过以下脚本获得(FRUNCOMPONENT为运行时的实现类)。
SELECT b.FDESC, a.* FROM T_MDL_FORMBUSINESS a LEFT JOIN T_MDL_FORMBUSINESS_L b ON a.FACTIONID=b.FACTIONID and b.FLOCALEID=2052 ORDER BY a.FACTIONID
---------------------------------------------------------------------------------------------
【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696
二开案例.表单服务.操作监控服务
本文2024-09-23 04:21:07发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-164747.html