二开案例.WebApi.网控

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

二开案例.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.网控

【应用场景】开启网控,在单据执行某个操作时,锁住单据,禁止其他用户同时操作。【注意事项】操作完成后,需要主动释放网控,否则单据将一...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息