二开对外开发webapi案例可用于绝大多数场景原创
金蝶云社区-BobbyLIU
BobbyLIU
20人赞赏了该文章 170次浏览 未经作者许可,禁止转载编辑于2024年06月13日 17:51:10

最近花了一天时间研究了一下对外的webapi接口开发,这里直接给出主要代码,供参考

对外接口分为两步:

第一:调用登录接口

http://localhost:5343/K3Cloud/Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser.common.kdsvc

{
"parameters": ["数据中心id",
"usename",
"kdpassword",
2052]

}

这时会返回一个登录成功的json

然后我们再进行第二步

第二: 开发我们需要的接口

public class ProTrackRptApi : AbstractWebApiBusinessService

    {

        public ProTrackRptApi(KDServiceContext context)

            : base(context)

        {

            //

        }

 public object GetProTrackRpt(string UserToken, string FOrgs, string FBudgetNo, string FYWPerson, string FIndustry, string FArea)

        {

            Context ctx = this.KDContext.Session.AppContext;

            if (ctx == null)

            {

                throw new Exception("还未登录,请先调用登录接口,并传入UserToken值信息!");

            }

            if (UserToken.Length==0)

            {

                throw new Exception("请传入登录返回信息中UserToken值!");

            }

            // 访问数据库获取用户名

            var sql = "SELECT FNAME FROM T_SEC_USER WHERE FUSERID=@FUSERID";

            var paramUserId = new Kingdee.BOS.SqlParam("@FUSERID", Kingdee.BOS.KDDbType.Int32, ctx.UserId);

            var userName = DBUtils.ExecuteScalar(ctx, sql, string.Empty, paramUserId);

            if (userName.Length>0) {

                Dictionary<string, string> Args = new Dictionary<string, string>();

                Args.Add("FBudgetNo", FBudgetNo);

                Args.Add("FYWPerson", FYWPerson);

                Args.Add("FIndustry", FIndustry);

                Args.Add("FArea", FArea);

                Args.Add("FOrgs", FOrgs);

                return ExecuteService(ctx,Args);//调用你二开的功能,可以报表,也可以其他单据,这里是报表的调用示例

            }

            else

            {

                return "未找到当期用户登录信息,请重新登录!";

            }

        }

        

 public string ExecuteService(Context ctx,Dictionary<string, string> Args)

        {

            ISysReportService sysReporSservice = ServiceFactory.GetSysReportService(ctx);

            var filterMetadata = FormMetaDataCache.GetCachedFilterMetaData(ctx);//加载字段比较条件元数据。

            var reportMetadata = FormMetaDataCache.GetCachedFormMetaData(ctx, "TYSI_ProjectTrackRpt");//加载物料收发明细表

            var reportFilterMetadata = FormMetaDataCache.GetCachedFormMetaData(ctx, "TYSI_ProjectTrackRptFilter");//加载物料收发明细表表过滤条件元数据。

            var reportFilterServiceProvider = reportFilterMetadata.BusinessInfo.GetForm().GetFormServiceProvider();

            var model = new SysReportFilterModel();

            model.SetContext(ctx, reportFilterMetadata.BusinessInfo, reportFilterServiceProvider);

            model.FormId = reportFilterMetadata.BusinessInfo.GetForm().Id;

            model.FilterObject.FilterMetaData = filterMetadata;

            model.InitFieldList(reportMetadata, reportFilterMetadata);

            model.GetSchemeList();//过滤方案的主键值,可通过该SQL语句查询得到:SELECT * FROM T_BAS_FILTERSCHEME

            var filter = model.GetFilterParameter();

            IRptParams p = new RptParams();

            p.FormId = reportFilterMetadata.BusinessInfo.GetForm().Id;

            p.StartRow = 1;

            p.EndRow = int.MaxValue;//StartRow和EndRow是报表数据分页的起始行数和截至行数,一般取所有数据,所以EndRow取int最大值。

            p.FilterParameter = filter;

            p.FilterFieldInfo = model.FilterFieldInfo;

            //加上自定义参数,需要自行在报表插件中解析

            p.CustomParams.Add("FBudgetNo", Args["FBudgetNo"]);

            p.CustomParams.Add("FYWPerson", Args["FYWPerson"]);

            p.CustomParams.Add("FIndustry", Args["FIndustry"]);

            p.CustomParams.Add("FArea", Args["FArea"]);

            p.CustomParams.Add("FOrgs", Args["FOrgs"]);

            MoveReportServiceParameter param = new MoveReportServiceParameter(ctx, reportMetadata.BusinessInfo, Guid.NewGuid().ToString(), p);

            var rpt = sysReporSservice.GetReportData(param);

            SerializerProxy serialHelper = new SerializerProxy(MessageFormats.Json, UTF8Encoding.UTF8, false, "", true);

            var strs = serialHelper.Serialize(rpt.DataSource);

            return strs;

        }

}

调用成功后会返回对应的结果数据json





赞 20