手把手演示如何对单据的分录行提交流程审批

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

手把手演示如何对单据的分录行提交流程审批

金蝶云星空流程审批的数据载体是基于整个单据的,因此要对分录数据进行审批就比较困难。本文将演示如何通过二开的方式来变通实现分录行数据审批。


首先演示原单据如下:

需要对表体数据进行流程审批。那针对这个表体我们先检查是否有状态字段,如果没有就添加上,例如上图的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);
                }
            }));
        }
    }   
}

一切搞定后,就可以直接演示了。首先针对分录单据设计流程模型并发布。

原单演示如下:

分录单据审批演示如下:

案例演示到此结束,整个实现过程还是比较简单的。



手把手演示如何对单据的分录行提交流程审批

金蝶云星空流程审批的数据载体是基于整个单据的,因此要对分录数据进行审批就比较困难。本文将演示如何通过二开的方式来变通实现分录行数据...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息