手把手演示如何对单据的分录行提交流程审批
金蝶云星空流程审批的数据载体是基于整个单据的,因此要对分录数据进行审批就比较困难。本文将演示如何通过二开的方式来变通实现分录行数据审批。
首先演示原单据如下:
需要对表体数据进行流程审批。那针对这个表体我们先检查是否有状态字段,如果没有就添加上,例如上图的FRowStatus,状态集合列表和单据状态的一样,ABCD分别表示创建、审核中、已审核、重新审核。然后对表体添加分录审批和查看流程图菜单,在分录审批菜单配置添加事件,在事件中添加一个空操作,该空操作改名为“刷新状态”,添加操作后刷新字段,用于提交工作流后自动刷新当前分录的数据。参考如下:
新建流程审批分录单据,参考如下:
该单据继承自1.2业务单据模板。新建的时候只有单据编号和单据状态两个字段,首先把单据头的表设置为原单的单据体的表,然后把单据的主键设置为原单据体的主键字段。单据状态字段和原单分录行状态字段对上。参考如下:
由于分录是没有单据编号的,这个分录单据的单据编号可以设置不可见,如果分录上有文本类型的分录编号字段,这里也可以把字段名设置为分录编号字段。其他如有需要显示的字段,例如物料、数量、金额等,在这个单据上都设计好,最为关键的是字段名要和原单据分录的字段名保持一致。其他分录单据元数据属性,例如标题等一并搞定。保存单据并发布,由于这个单据不需要新增,所以发布的时候可以设置不可见(为什么一定要发布呢?因为工作流模型设计只能选到已发布菜单的单据)。
表单都设计好之后,原单需要二开一个表单插件,主要完成分录提交流程和查看流程图功能,演示代码参考如下:
using Kingdee.BOS; using Kingdee.BOS.Core.Bill.PlugIn; using Kingdee.BOS.Core.DynamicForm; using Kingdee.BOS.Core.List; using Kingdee.BOS.JSON; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.Util; using Kingdee.BOS.WebApi.FormService; using Kingdee.BOS.Workflow.Model; using Kingdee.BOS.Workflow.ServiceHelper; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; namespace JDSample.FormPlugIn.Bill { [Description("演示单据分录提交审批")] public class SubmitBillEntryRowEdit : AbstractBillPlugIn { string _formId = "k38e42b9e76e947c79ff8f441d21bff90"; public override void EntryBarItemClick(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.BarItemClickEventArgs e) { int currentRowIndex = -1; DynamicObject currentRowData; this.Model.TryGetEntryCurrentRow("F_Jac_Entity", out currentRowData, out currentRowIndex); // 提交流程 if (e.BarItemKey.Equals("tbRowSubmit", StringComparison.OrdinalIgnoreCase)) { JObject jobject = new JObject(); if (currentRowData != null) { object entryId = currentRowData.DynamicObjectType.PrimaryKey.GetValueFast(currentRowData); jobject.Add("Ids", ObjectUtils.Object2String(entryId)); // 克隆上下文,因为调用的是API接口,可能会改变当前上下文 Context ctx = ObjectUtils.CreateCopy(this.View.Context) as Context; // 提交 var result = WebApiServiceCall.Submit(ctx, _formId, jobject.ToString()); if (result != null) { Dictionary<string, object> dctResult = result as Dictionary<string, object>; if (dctResult != null) { Dictionary<string, object> responseStatus = dctResult["Result"] as Dictionary<string, object>; Dictionary<string, object> dctStatus = responseStatus["ResponseStatus"] as Dictionary<string, object>; if (Convert.ToBoolean(dctStatus["IsSuccess"])) { this.View.ShowMessage("当前行审批提交成功。"); return; } else { if (dctStatus.ContainsKey("Errors")) { List<object> errors = dctStatus["Errors"] as List<object>; if (errors.Count > 0) { Dictionary<string, object> error = errors[0] as Dictionary<string, object>; this.View.ShowMessage(ObjectUtils.Object2String(error["Message"])); return; } } } } } } } //查看流程图 if (e.BarItemKey.Equals("tbViewFlow", StringComparison.OrdinalIgnoreCase)) { string[] hisProcInstIds; if (currentRowData != null) { object entryId = currentRowData.DynamicObjectType.PrimaryKey.GetValueFast(currentRowData); string procInstId = WorkflowChartServiceHelper.GetCurrentProcInstIdByBill(this.View.Context, _formId,ObjectUtils.Object2String(entryId), out hisProcInstIds); if (string.IsNullOrWhiteSpace(procInstId) && hisProcInstIds.IsEmpty()) { this.View.ShowMessage("未找到单据对应的流程实例,无流程图可供查看!"); return; } ShowWorkflow(procInstId, hisProcInstIds); } } } /// <summary> /// 查看流程图 /// </summary> /// <param name="procInstId"></param> private void ShowWorkflowChartForm(string procInstId) { JSONObject customPar = new JSONObject(); customPar.Add("ProcInstanceId", procInstId); customPar.Add("VersionId", ""); customPar.Add("ProcDefId", ""); string procName = WorkflowChartServiceHelper.GetProcNameByProcInstId(this.View.Context, procInstId); DynamicFormShowParameter par = new DynamicFormShowParameter(); par.FormId = WFDynamicFormConst.CHART_FORMID; par.OpenStyle.ShowType = ShowType.MainNewTabPage; par.CustomParams.Add("ProcKeys", Kingdee.BOS.JSON.KDObjectConverter.SerializeObject(customPar)); par.Caption = "流程图—" + procName; this.View.ShowForm(par); } private void ShowWorkflow(string procInstId, string[] hisProcInstIds) { if (!procInstId.IsNullOrEmptyOrWhiteSpace()) { ShowWorkflowChartForm(procInstId); } else { ShowHistoryList(hisProcInstIds); } } /// <summary> /// 查看历史流程 /// </summary> /// <param name="procInstId"></param> private void ShowHistoryList(string[] procInstId) { if (procInstId.IsEmpty()) return; string instIds = string.Join("','", procInstId); var param = new ListShowParameter(); param.FormId = "WF_ProcInstBillView"; param.IsShowQuickFilter = false; param.IsLookUp = true; param.MultiSelect = false; param.ListFilterParameter.Filter = string.Format("FPROCINSTID in ('{0}')", instIds); this.View.ShowForm(param, new Action<FormResult>((result) => { object data = result.ReturnData; if (data == null) return; if (!(data is ListSelectedRowCollection)) return; ListSelectedRowCollection listData = data as ListSelectedRowCollection; if (null != listData && listData.Count > 0) { string tempProcInstId = listData[0].PrimaryKeyValue; ShowWorkflowChartForm(tempProcInstId); } })); } } }
一切搞定后,就可以直接演示了。首先针对分录单据设计流程模型并发布。
原单演示如下:
分录单据审批演示如下:
案例演示到此结束,整个实现过程还是比较简单的。
手把手演示如何对单据的分录行提交流程审批
金蝶云星空流程审批的数据载体是基于整个单据的,因此要对分录数据进行审批就比较困难。本文将演示如何通过二开的方式来变通实现分录行数据...
点击下载文档
本文2024-09-23 03:36:43发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-159960.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章