WebApi实现生产订单的状态机操作(兼容正反向执行)原创
金蝶云社区-战斗车
战斗车
5人赞赏了该文章 2644次浏览 未经作者许可,禁止转载编辑于2021年11月04日 09:56:23

关于生产订单状态机调用的自定义接口,
详情可参见本贴 :http://club.kingdee.com/forum.ph ... 8245&extra=page%3D1
对于有些小伙伴实际使用过程中,反向执行(例如反计划确认)时,可能会碰到类似{"从额外选项OperateOption中获取变量失败,变量[_BillOperationSelectedRows_]不存在!"} 的错误,这是因为传给系统行执行方法的参数缺少生产订单的单据内码。
现将兼容反向执行的自定义生产订单行状态机API接口实现示例如下:

1、封装自定义Webapi实现类示例如下:

using Kingdee.BOS.JSON;
using Kingdee.BOS.Orm;
using Kingdee.BOS.Util;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.ServiceFacade.KDServiceFx;
using Kingdee.BOS.WebApi.ServicesStub;
using Kingdee.K3.MFG.App;
using Kingdee.K3.MFG.Contracts.PRD;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Kingdee.EK.K3.MFG.WebApi.ServicesStub
{
public class MoTransfer : AbstractWebApiBusinessService
{
public MoTransfer(KDServiceContext context)
: base(context)
{

}

///


/// 执行服务
///
/// (操作码,字典(生产订单行内码,生产订单内码))
///
public JSONArray ExecuteService(KeyValuePair<string, dictionary<long, long>> parameters)
{
JSONArray jsonArray = new JSONArray();
try
{
string operation = parameters.Key;
Dictionary<long, long> dctMoeIds = parameters.Value;
List<long> moEntryIds = dctMoeIds.Keys.ToList();
OperateOption statusOption = OperateOption.Create();
var selectedRows = new ListSelectedRowCollection();
foreach (var dctMoeId in dctMoeIds)
{
    selectedRows.Add(new ListSelectedRow(dctMoeId.Value.ToString(), dctMoeId.Key.ToString(), 0, "PRD_MO"));
}
//下一句需引用Kingdee.BOS.Core.dll组件,并using Kingdee.BOS.Core.DynamicForm命名空间后可用
statusOption.SetBillOperationSelectedRows(selectedRows);
var result = AppServiceContext.GetMFGService<IMOService>().MOStateTransfer(this.KDContext.Session.AppContext, moEntryIds, operation, statusOption);


if (result.FuncResult.IsNullOrEmpty())
{
//校验不过的原因
string message = result.ValidationErrors[0].Message;
jsonArray.Add(message);
}
else
{
jsonArray.Add("生产订单状态机执行成功");
}

}
catch (Exception ex)
{
jsonArray.Add(ex.Message);
}
finally
{

}
return jsonArray;
}
}
}

2、封装自定义Webapi实现类示例如下:

// 使用webapi引用组件Kingdee.BOS.WebApi.Client.dll
//http://localhost:1400/ 本地部署的Cloud站点地址
ApiClient client = new ApiClient("http://localhost:1400/");
//参数:数据中心ID,用户名,密码,语言
bool result = client.Login("59c9f8153bb26a", "demo", "888888", 2052);
// 登陆成功
object responseOut = null;
if (result)
{
//状态机操作码,打开BOS设计器操作列表里面可以找到相应的操作码,如ToStart,UndoToPlanConfirm等
string operation = "UndoToPlanConfirm";
//构建结构为(生产订单行内码,生产订单内码)的数据字典
Dictionary<long, long> dctMoeIds = new Dictionary<long, long>();
dctMoeIds.Add(100467, 100027);

KeyValuePair<string, dictionary<long, long>> parameters = new KeyValuePair<string, dictionary<long, long>>(operation, dctMoeIds);
// 注意第一个参数 sn + classname + methodname,assembly
responseOut = client.Execute("Kingdee.EK.K3.MFG.WebApi.ServicesStub.MoTransfer.ExecuteService,Kingdee.EK.K3.MFG.WebApi.ServicesStub", new object[] { parameters });
}

3、部署(调试)说明:

将步骤1中的类所在组件编译成Kingdee.EK.K3.MFG.WebApi.ServicesStub.dll,放置于Cloud站点目录下的WebSite\Bin文件夹中,然后调试步骤2的代码,即可调用步骤1API接口。如果要调试步骤1的接口,则需要将步骤1的工程在Cloud服务器中采用附加IIS进程(w3wp.exe进程)的方法进行调试。