套打二开审批路线示例

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

套打二开审批路线示例

需求背景:客户需要打印单据历史的审批路线。

示例说明:提供套打审批路线的二开思路代码。本示例基于表单插件。

using Kingdee.BOS.Core.Bill.PlugIn;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kingdee.BOS.Util;
using Kingdee.BOS.Workflow.ServiceHelper;
using Kingdee.BOS.Orm.Metadata.DataEntity;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Core.NotePrint;
using Kingdee.BOS.Workflow.Models.Chart;
using Kingdee.BOS.Workflow.Kernel;
using Kingdee.BOS.Core.Bill;
using Kingdee.BOS.App.Data;

public class WorkFlowNotePrintBillPlugIn : AbstractBillPlugIn
{
   /// 审批路线字段
 private static string[] approveLineFields = { "FActivityName", "FActivityStatu", "FStartActivity", "FTargetActivity", "FActionName", "FReceiverName", "FActionResult", "FDisposition", "FCompletedTime", "FConsignNames" };
        public override void OnPrepareNotePrintData(Core.DynamicForm.PlugIn.Args.PreparePrintDataEventArgs e)
        {
            base.OnPrepareNotePrintData(e);
            if (e.DataSourceId.Contains("workflow."))
            {
                string procDefId = e.DataSourceId.Split('.')[1];
                var newData = GetProcessRouter(procDefId);
                e.DataObjects = newData.ToArray();
            }
        }

  private DynamicObjectCollection GetProcessRouter(string procDefId)
        {
            string formID = this.View.BusinessInfo.GetForm().Id;
            object pkValue = (this.View.Model as IBillModel).GetPKValue();
            //返回这个单据的所有流程实例ID
            List<string> processIds = GetProcInstIdByBillInst(formID, pkValue.ToString());
            //选一个实例ID去打印
            string processID = processIds[0];
            if (procDefId.Equals("approveLine") && !processID.IsNullOrEmpty())
            {
                List<ChartActivityInfo> routeCollection = WorkflowChartServiceHelper.GetProcessRouter(this.View.Context, processID);
                DynamicObjectType approveType = new DynamicObjectType("tempObject");
                RegisterApproveLine(approveType, approveLineFields);
                DynamicObjectCollection ApproveResult = new DynamicObjectCollection(approveType);
                int state;
                string stateDesc;
                List<ApproveRouteInfo> approveRouteInfoList = new List<ApproveRouteInfo>();
                foreach (ChartActivityInfo activityDetail in routeCollection)
                {
                    state = (int)activityDetail.ActivityStateType;
                    if (state == 1 || state == 3)
                    {
                        stateDesc = Kingdee.BOS.Resource.ResManager.LoadKDString("完成", "002426030027703", Kingdee.BOS.Resource.SubSystemType.BOS);
                    }
                    else if (state == 2)
                    {
                        stateDesc = Kingdee.BOS.Resource.ResManager.LoadKDString("当前", "002426030027704", Kingdee.BOS.Resource.SubSystemType.BOS);
                    }
                    else
                    {
                        stateDesc = Kingdee.BOS.Resource.ResManager.LoadKDString("出错", "002426030027705", Kingdee.BOS.Resource.SubSystemType.BOS);
                    }
                    ApproveRouteInfo approveRouteInfoMain = new ApproveRouteInfo();
                    approveRouteInfoMain.ActivityName = activityDetail.ActivityName;
                    approveRouteInfoMain.StatuDesc = stateDesc;
                    approveRouteInfoMain.SourceActivityName = activityDetail.SourceActivityName;
                    approveRouteInfoMain.ActivityName = activityDetail.ActivityName;
                    approveRouteInfoMain.ActivityId = activityDetail.ActivityId;
                    for (int j = 0; j < activityDetail.ActionDetails.Count; j++)
                    //第一次添加审批明细的时候在节点的同一行记录里,剩余的在新增行添加
                    {
                        //已完成节点里面只展现已完成的待办任务信息
                        if (activityDetail.ActivityStateType != MapStateResult.Idled && !activityDetail.ActionDetails[j].IsCompleted)
                        {
                            continue;
                        }
                        ChartActionInfo action = activityDetail.ActionDetails[j];
                        ApproveRouteInfo approveRouteInfo = new ApproveRouteInfo();
                        approveRouteInfo = (ApproveRouteInfo)ObjectUtils.CreateCopy(approveRouteInfoMain);
                        approveRouteInfo.Title = action.Title;
                        approveRouteInfo.ReceiverName = action.ReceiverName;
                        approveRouteInfo.ActionResult = action.ActionResult;
                        approveRouteInfo.DisPosition = action.DisPosition;
                        approveRouteInfo.CompletedTime = action.CompleteTime;
                        approveRouteInfo.ConsignNames = action.ConsignNames;

                        approveRouteInfoList.Add(approveRouteInfo);
                    }
                    if (approveRouteInfoList != null)
                    {
                        List<int> AddedActivityId = new List<int>();
                        foreach (var approveRouteInfo in approveRouteInfoList)
                        {
                            DynamicObject workFlowDataObj = new DynamicObject(approveType);
                            //第一次添加审批明细的时候在节点的同一行记录里,剩余的在新增行添加
                            if (!AddedActivityId.Contains(approveRouteInfo.ActivityId))
                            {
                                workFlowDataObj["ac_approve_FActivityName"] = approveRouteInfo.ActivityName;
                                workFlowDataObj["ac_approve_FActivityStatu"] = approveRouteInfo.StatuDesc;
                                workFlowDataObj["ac_approve_FStartActivity"] = approveRouteInfo.SourceActivityName;
                                workFlowDataObj["ac_approve_FTargetActivity"] = approveRouteInfo.ActivityName;
                                AddedActivityId.Add(approveRouteInfo.ActivityId);
                            }

                            workFlowDataObj["ac_approve_FActionName"] = approveRouteInfo.Title;
                            workFlowDataObj["ac_approve_FReceiverName"] = approveRouteInfo.ReceiverName;
                            workFlowDataObj["ac_approve_FActionResult"] = approveRouteInfo.ActionResult;
                            workFlowDataObj["ac_approve_FDisposition"] = approveRouteInfo.DisPosition;
                            workFlowDataObj["ac_approve_FCompletedTime"] = approveRouteInfo.CompletedTime;
                            workFlowDataObj["ac_approve_FConsignNames"] = approveRouteInfo.ConsignNames;
                            ApproveResult.Add(workFlowDataObj);
                        }
                        approveRouteInfoList.Clear();
                    }
                  }
                return ApproveResult;
             }
            else
            {
                return null;
            }
        }
        private void RegisterApproveLine(DynamicObjectType type, string[] approveFields)
        {
            string key = string.Empty;
            foreach (var actField in approveFields)
            {
                key = "approve_" + actField;
                string name = "ac_" + key;
                if (type.Properties.Contains(actField) == false)
                {
                    type.RegisterSimpleProperty(
                        name,
                        typeof(string),
                        attributes: new SimplePropertyAttribute() { Alias = key }
                        );
                }
            }
        }

       private List<string> GetProcInstIdByBillInst(string formId, string pkValue)
        {
            List<string> procInsIds = new List<string>();
            string sql = string.Format(@"SELECT  PIBI.FPROCINSTID FROM V_WF_PIBIMAPALL PIBI
                    INNER JOIN {0} PROCINST ON PIBI.FPROCINSTID = PROCINST.FPROCINSTID
                    WHERE FOBJECTTYPEID = @FOBJECTTYPEID AND FKEYVALUE = @FKEYVALUE",
                    Kingdee.BOS.Workflow.Models.Const.WorkFlowTableConst.V_WF_PROCINSTMG);

            var dataObject = DBUtils.ExecuteDynamicObject(this.Context, sql, paramList: new SqlParam[]
            {
                new SqlParam("@FOBJECTTYPEID",KDDbType.AnsiString,formId),
                new SqlParam("@FKEYVALUE",KDDbType.AnsiString,pkValue)
            });

            if (!dataObject.IsEmpty())
            {
                foreach (var obj in dataObject)
                {
                    procInsIds.Add(ObjectUtils.Object2String(obj["FPROCINSTID"]));
                }
            }
            return procInsIds;
        }
}

 

套打二开审批路线示例

需求背景:客户需要打印单据历史的审批路线。示例说明:提供套打审批路线的二开思路代码。本示例基于表单插件。using Kingdee.BOS.Core.Bi...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息