二开案例.WebApi.网控
【应用场景】
开启网控,在单据执行某个操作时,锁住单据,禁止其他用户同时操作。
【注意事项】
操作完成后,需要主动释放网控,否则单据将一直处于锁定状态。
【案例演示】
采购订单,修改操作,通过WebApi创建修改网控,禁止其他用户同时修改该单据。
【实现步骤】
<1>编写自定义WebApi,代码如下。
using Kingdee.BOS; using Kingdee.BOS.App.Core.NetworkCtrl; using Kingdee.BOS.App.Data; using Kingdee.BOS.Core.NetworkCtrl; using Kingdee.BOS.ServiceFacade.KDServiceFx; using Kingdee.BOS.Util; using Kingdee.BOS.WebApi.ServicesStub; using System; namespace Jac.XkDemo.BOS.WebApi { /// <summary> /// 【WebApi】网控 /// </summary> public class NetControlWebApiService : AbstractWebApiBusinessService { public NetControlWebApiService(KDServiceContext context) : base(context) { // } /// <summary> /// 启动网控 /// </summary> /// <param name="netCtrlId">网控对象内码</param> /// <param name="interID">单据内码</param> /// <param name="operationName">操作名称,例如:修改</param> /// <param name="operationDesc">操作描述,例如:采购订单-CGDD100608-修改</param> /// <returns>返回新增的网控记录的内码(T_BAS_NETWORKCTRLRECORDS.FID)</returns> public string StartNetworkCtrl(string netCtrlId, string interID, string operationName, string operationDesc) { var ctx = KDContext.Session.AppContext; if (ctx == null) { // 会话超时 throw new Exception("ctx = null"); } var networkCtrlRecordId = SequentialGuid.NewGuid().ToString(); var mInfo = new NetWorkCtrlMonitorInfo(); mInfo.Id = networkCtrlRecordId; mInfo.NetCtrlType = NetworkCtrlType.BusinessObjOperateMutex; mInfo.OrgID = ctx.CurrentOrganizationInfo == null ? 1 : ctx.CurrentOrganizationInfo.ID; mInfo.StartMenID = Convert.ToInt32(ctx.UserId); mInfo.ComputerName = ctx.ComputerName; mInfo.IP = ctx.IpAddress; mInfo.NetCtrlId = netCtrlId; mInfo.OperationDesc = operationDesc; mInfo.InterID = "-1"; mInfo.Token = ctx.ContextId; mInfo.InterID = interID; mInfo.FuncDeatilId = operationName; mInfo.StartTime = DateTime.Now; new NetWorkCtrlMInfoRepository(ctx).Create(mInfo); return networkCtrlRecordId; } /// <summary> /// 释放网控 /// </summary> /// <param name="networkCtrlRecordId">网控记录内码(T_BAS_NETWORKCTRLRECORDS.FID)</param> /// <returns></returns> public bool CommitNetworkCtrl(string networkCtrlRecordId) { var ctx = KDContext.Session.AppContext; if (ctx == null) { // 会话超时 throw new Exception("ctx = null"); } var sql = "DELETE FROM T_BAS_NETWORKCTRLRECORDS WHERE FID=@FID"; var parameter = new SqlParam("@FID", KDDbType.String, networkCtrlRecordId); DBUtils.Execute(ctx, sql, parameter); return true; } } } /* -- 查询采购订单的修改操作的网控对象内码 SELECT a.FID AS 网控对象内码 , b.FNAME AS 网控对象名称 , t.FNAME AS 网控类型名称 , c.FNAME AS 业务对象名称 , e.FNAME AS 操作名称 , a.* FROM T_BAS_NETWORKCTRLOBJECT a LEFT JOIN T_BAS_NETWORKCTRLOBJECT_L b ON a.FID = b.FID AND b.FLOCALEID = 2052 LEFT JOIN T_BAS_NETWORKCTRLTYPE_L t ON a.FTYPE = t.FID AND t.FLOCALEID = 2052 LEFT JOIN T_META_OBJECTTYPE_L c ON a.FMETAOBJECTID = c.FID AND c.FLOCALEID = 2052 LEFT JOIN T_MDL_FORMOPERATIONTYPE d ON a.FNUMBER = d.FOPERATION LEFT JOIN T_MDL_FORMOPERATIONTYPE_L e ON d.FID = e.FID AND e.FLOCALEID = 2052 WHERE a.FMETAOBJECTID = 'PUR_PurchaseOrder' AND a.FNUMBER = 'Edit' */
<2>拷贝自定义的WebApi组件到应用站点的WebSite\Bin目录下,重启IIS,开发完毕。
【测试步骤】
<1>新增单元测试基类,代码如下。
namespace Jac.XkDemo.BOS.WebApi.Tests { /// <summary> /// WebApi测试基类 /// </summary> public abstract class AbstractWebApiTests { #region 测试参数 /// <summary> /// 应用站点地址 /// </summary> protected string url = "http://172.20.111.186/k3cloud/"; /// <summary> /// 数据中心内码(账套ID) /// </summary> protected string dbid = "5f3a43d65be160"; /// <summary> /// 登录账号 /// </summary> protected string userName = "demo"; /// <summary> /// 登录密码 /// </summary> protected string password = "888888"; /// <summary> /// 登录语言内码(2052:中文;1033:英文) /// </summary> protected int lcid = 2052; #endregion } } /* -- 获取数据中心内码 SELECT a.FDATACENTERID AS 数据中心内码,b.FNAME AS 数据中心名称,a.* FROM T_BAS_DATACENTER a LEFT JOIN T_BAS_DATACENTER_L b ON a.FDATACENTERID=b.FDATACENTERID and b.FLOCALEID=2052 */
<2>新增单元测试类,代码如下。
using Kingdee.BOS.WebApi.Client; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Jac.XkDemo.BOS.WebApi.Tests { [TestClass] public class NetControlWebApiServiceTests : AbstractWebApiTests { [TestMethod] public void StartNetworkCtrlTest() { // Init var apiClient = new K3CloudApiClient(url); var isLoginOk = apiClient.Login(dbid, userName, password, lcid); string rval = string.Empty; // Action if (isLoginOk) { // 启动网控 var apiParameters = new object[] { "903eafb2784042b5948fe9a245b5dddf", "102010", "修改", "采购订单-CGDD000682-修改-WebApi" }; rval = apiClient.Execute<string>("Jac.XkDemo.BOS.WebApi.NetControlWebApiService.StartNetworkCtrl,Jac.XkDemo.BOS.WebApi", apiParameters); } // Assert Assert.IsTrue(isLoginOk); Assert.IsTrue(!string.IsNullOrWhiteSpace(rval)); } [TestMethod] public void CommitNetworkCtrlTest() { // Init var apiClient = new K3CloudApiClient(url); var isLoginOk = apiClient.Login(dbid, userName, password, lcid); var rval = false; // Action if (isLoginOk) { // 删除网控 var apiParameters = new object[] { "00505691-8444-9bde-11ed-16bfe4f3e97d" }; rval = apiClient.Execute<bool>("Jac.XkDemo.BOS.WebApi.NetControlWebApiService.CommitNetworkCtrl,Jac.XkDemo.BOS.WebApi", apiParameters); } // Assert Assert.IsTrue(isLoginOk); Assert.IsTrue(rval); } } }
<3>测试接口StartNetworkCtrlTest,会新增网控记录,效果如下。
<4>测试接口CommitNetworkCtrlTest,会删除网控记录。
---------------------------------------------------------------------------------------------------------
【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696
二开案例.WebApi.网控
【应用场景】开启网控,在单据执行某个操作时,锁住单据,禁止其他用户同时操作。【注意事项】操作完成后,需要主动释放网控,否则单据将一...
点击下载文档
本文2024-09-23 04:01:30发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-162624.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章