最近花了一天时间研究了一下对外的webapi接口开发,这里直接给出主要代码,供参考
对外接口分为两步:
第一:调用登录接口
http://localhost:5343/K3Cloud/Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser.common.kdsvc
}
这时会返回一个登录成功的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
推荐阅读