微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CCFlow SDK模式开发

需求:

    1、业务数据要保存在我们自己的数据库
    2、CCFlow有保存草稿的功能,但是领导要求每个业务都要有草稿箱,流程从草稿箱发起,每个业务单独查询,而不要在CCFlow的统一界面查询,所以每个业务的列表页面以及增删改查都要有的
    3、工作流的消息和我们应用系统的消息要整合到一起,放在一起排序、提示
    4、我们项目用的框架是第三方的我记录MVC框架,框架根据Web.config配置的路径按照MVC的模式解析路由,配置的路径之外的,还是按照ASP.NET WebForm的方式处理,所以我把CCFlow的ClientBin、DataUser、WF文件夹直接放到Web下,然后引用所需的dll。VS就是强大,两个不同的解决方案,打上断点照样可以调试,所以同时运行CCFlow的源码后,可以从我们项目的代码处运行到CCFlow的源码的断点处。

    5、审核通过,则发送到下一步,审核不通过,则直接结束流程

    6、支持分公司,同一个业务,各分公司的流程可能是不一样的

 

实现:

一、CCFlow的数据库与应用系统的数据库耦合

部门:
SELECT     TOP (100) PERCENT dept.Id AS No,dept.Name + '(' + comp.Name )' AS Name,CAST(dept.Pid AS varchar(20)) AS ParentNo,1)">'' AS NameOfPath,1)">AS TreeNo,AS leader,1)">AS Tel,0 AS Idx,1)">AS IsDir,1)"> FK_DeptType
FROM         CQSD_Dev.dbo.IMP_Dept AS dept INNER JOIN
                      CQSD_Dev.dbo.IMP_Dept AS comp ON comp.Id = dept.Cid
WHERE     (dept.DelFlg = 0)
ORDER BY comp.Pid,comp.Id

岗位:
PERCENT job.Id 3 AS StaGrade,1)">AS DutyReq,1)">AS Makings,1)"> FK_StationType
FROM         CQSD_Dev.dbo.IMP_Job AS job ON dept.Id = job.DeptId WHERE     (job.DelFlg  comp.Id

人员:
SELECT     u.Username pubAS Pass,e.DeptId AS FK_Dept,1)">AS EmpNo,1)">AS FK_Duty,1)">123AS SID,1)">AS Email,1)"> NumOfDept
FROM         CQSD_Dev.dbo.IMP_Employee AS e 
                      CQSD_Dev.dbo.Sys_User AS u ON u.RelationId  e.Id
WHERE     (e.DelFlg )

部门人员:
AS FK_Emp,1)"> FK_Dept
0) AND (e.Code IS NOT NULL) AND (e.Code <> '')

岗位人员:
 FK_Station
'')
View Code

 

二、菜单、待办、抄送、查询等列表界面

菜单

待办:

 流程消息:

 三、流程消息和应用系统的其他消息合并的View

SELECT     MyPK,Sender,e2.Name AS SenderName,SendTo,e3.Name AS SendToName,Title,Doc,MsgType,RDT  SendTime,IsRead
FROM         CQSD_Flow_Dev.dbo.Sys_SMS AS sms 
                      Sys_User u2 on u2.Username = Sender join
                      IMP_Employee e2 ON e2.Id=u2.RelationId 
                      Sys_User u3 on u3.Username = SendTo 
                      IMP_Employee e3 ON e3.Idu3.RelationId
UNION
SELECT     cast(m.id AS mypk,u.Username AS Sender,e.Name AS sendto,e1.Name  title,emailcontent AS doc,1)">CQSDMailAS msgtype,m.createtime AS SendTime,readingstate  isread
FROM         IMP_InternalMail m 
                      IMP_InternalMailRecv mr ON mr.EMailThemeId = m.id LEFT 
                      IMP_Employee e ON e.id = m.createuserId 
                      Sys_User u on u.RelationId=e.Id 
                      IMP_Employee e1 ON e1.id = mr.UserId   
                      Sys_User u1 on u1.RelationIde1.Id
WHERE     m.delflg 0 AND mr.delflg AND m.EMailStatus 1
View Code

 四、操作CCFlow数据库的Service

using System;
 System.Collections.Generic;
 System.Linq;
 System.Text;
 CQSD.Service.Interface.Admin.CCFlow;
 System.Data;
 Simpo;
 BP.WF;
 CQSD.Const;
 BP.En;
 CQSD.Domain.DB;
 CQSD.Service.Interface.Admin.HR;
 CQSD.Service.Admin.HR;

namespace CQSD.Service.Admin.CCFlow
{
    /// <summary>
    /// 工作流数据库服务
    </summary>
    public class CCFlowService : Service,ICCFlowService
    {
        #region 根据WorkID获取工作
        <summary>
         根据WorkID获取工作
        </summary>
        <param name="WorkID">WorkID</param>
        public DataTable GetWork(string WorkID)
        {
            StringBuilder sb = new StringBuilder(string.Format(@"
                select wk.*
                from dbo.WF_GenerWorkFlow wk
                where WorkID={0}",WorkID));

            return BP.DA.@R_874_404[email protected]sqlReturnTable(sb.ToString());
        }
        #endregion

        #region 工作查询
         工作查询
        <param name="flowSortNo">流程类别编号public DataTable GetFlowList( flowSortNo,IMP_Employee loginEmployee)
        {
            StringBuilder sb = 
                select fl.*,fs.Name as FK_FlowSortText,fs.No as FK_FlowSort
                from WF_Flow fl
                left join WF_FlowSort fs on fl.FK_FlowSort=fs.No
                where 1=1));

            if (!strUtil.IsNullOrEmpty(flowSortNo))
            {
                sb.Append(" and fs.No='{0}'sqlClean(flowSortNo)));
            }

            string FK_Flows = GetCompFK_Flows(loginEmployee);
            strUtil.IsNullOrEmpty(FK_Flows))
            {
                sb.Append( and fl.No in ({0})else
            {
                sb.Append( and 1=2 );
            }

            sb.Append( order by fs.No);

            #region 获取有流程的流程类别
         获取有流程的流程类别
        </summary>
        public DataTable GetFlowTypeList()
        {
            StringBuilder sb = 
                select distinct fs.*
                from WF_Flow fl
                left join WF_FlowSort fs on fl.FK_FlowSort=fs.No
                where 1=1));

            sb.Append(#region 根据WorkID、FK_Node、FK_Emp获取工作记录
         根据WorkID、FK_Node、FK_Emp获取工作记录
        public DataTable GetGenerWorkerlist(string WorkID,string FK_Node,1)"> FK_Emp)
        {
            StringBuilder sb = 
                select gwl.*
                from WF_GenerWorkerlist gwl
                where WorkID={0} and FK_Node={1} and FK_Emp='{2}'#region 获取流程退回信息
         获取流程退回信息
        string GetReturnWorksInfo( WorkID)
        {
            if (!strUtil.IsNullOrEmpty(FK_Node) && !strUtil.IsNullOrEmpty(WorkID))
            {
                //流程退回信息
                ReturnWorks rws = new ReturnWorks();
                rws.Retrieve(ReturnWorkAttr.ReturnToNode,ReturnWorkAttr.WorkID,ReturnWorkAttr.RDT);

                StringBuilder sb =  StringBuilder();
                if (rws.Count != 0)
                {
                    BP.WF.ReturnWork rw = (BP.WF.ReturnWork)rws[rws.Count - 1];

                    CCFlow源码有BUG,所以这里进行特殊处理
                    string returnNodeName = rw.ReturnNodeName;
                    DataTable dtNode = GetNode(rw.ReturnNode);
                    if (dtNode.Rows.Count > )
                    {
                        returnNodeName = dtNode.Rows[0][Name].ToString();
                    }

                    sb.Append(<span>来自节点:{0}&nbsp;&nbsp;退回人:{1}&nbsp;&nbsp;{2}</span><br /> sb.ToString();
            }
            
            {
                return null;
            }
        }
        #region 获取流程移交信息
         获取流程移交信息
        string GetShiftWorksInfo(流程退回信息
                ShiftWorks sws =  ShiftWorks();
                BP.En.QueryObject qo =  QueryObject(sws);
                qo.AddWhere(ShiftWorkAttr.WorkID,WorkID);
                qo.addAnd();
                qo.AddWhere(ShiftWorkAttr.FK_Node,FK_Node);
                qo.addOrderBy(ShiftWorkAttr.RDT);
                qo.DoQuery();

                StringBuilder sb = if (sws.Count != )
                {
                    BP.WF.ShiftWork sw = (BP.WF.ShiftWork)sws[sws.Count - ];

                    sb.Append(<span>移交人:{0}&nbsp;&nbsp;{1}</span><br />#region 获取系统消息
         获取系统消息
        <param name="FK_Emp"></param>
        <param name="isRead">-1全部,0未读,1已读public DataTable GetSMS(string FK_Emp,1)">int isRead)
        {
            StringBuilder sb = 
                select sms.*
                from Sys_SMS sms
                where sms.SendTo='{0}'if (isRead != Constants.OptionAllVal)
            {
                sb.Append( and sms.IsRead={0}#region 标记消息为已读
         标记消息为已读
        public DataTable ReadSMS( MyPK)
        {
            StringBuilder sb = 
                update Sys_SMS 
                set IsRead=1
                where MyPK='{0}'#region 获取Node
         获取Node
        <returns></returns>
        public DataTable GetNode( NodeID)
        {
            StringBuilder sb = 
                select nd.*
                from WF_Node nd
                where NodeID={0}#region 结束流程处理
         结束流程处理
        <param name="employee">结束人</param>
        <param name="FK_Flow">流程编号工作IDpublic DataTable EndFlowProcess(IMP_Employee employee,1)">string FK_Flow,1)">取流程数据表名
            StringBuilder sb = 
                select flow.PTable
                from WF_Flow flow
                where NO='{0}' BP.DA.@R_874_404[email protected]sqlReturnTable(sb.ToString());
            string pTable = dtFlow.Rows[PTable].ToString();

            更新流程数据表
            sb = 
                update {0}
                set FlowEnder='{1}',FlowEmps=FlowEmps+'@{1},{2}'
                where OID={3}#region 获取员工的待办件数
         获取员工的待办件数
         DataTable GetDaiBanCount()
        {
            StringBuilder sb = 
                select ew.FK_Emp,count(ew.FK_Emp) as Cnt
                from WF_EmpWorks ew
                group by ew.FK_Emp#region 根据员工获取所属分公司的流程编号集合
         根据员工获取所属分公司的流程编号集合
        private  GetCompFK_Flows(IMP_Employee employee)
        {
            IEmployeeService employeeService =  EmployeeService();
            IMP_Dept comp = employeeService.GetCompByEmployeeId(employee.Id);

            StringBuilder sb = CompId={0}fig> flowConfigList = find<IMP_FlowConfig>(sb.ToString()).list();
            if (flowConfigList.Count == 0) ;
            string.Join(",flowConfigList.ConvertAll<string>(a => '" + a.FK_Flow + ).ToArray());
        }
        #endregion

    }
}
View Code

 五、CCFlow控制器基类

 Simpo.Web.Mvc;
 CQSD.Service.Interface;
 CQSD.Service.Interface.Admin.Sys;
 CQSD.Service;
 CQSD.Service.Admin.Sys;
 CQSD.Service.Admin.CCFlow;
 CQSD.Domain;
 CQSD.Utils;
 CQSD.Service.Admin.HR;
 System.Threading;
 CQSD.Service.Interface.Sys;
 Simpo.Web.Mvc.Attr;
 Simpo.Web;
 Simpo.Web.Utils;
 System.Web;
 System.IO;

 CQSD.Controller.Admin.CCFlow
{
     流程控制器基类
     FlowControllerBase : ControllerBase
    {
        #region 变量和构造函数
        protected IEmployeeService employeeService;
         IUserService userService;
         IDeptService deptService;
         IDictService dictService;
         ICCFlowService ccFlowService;
         IFlow_AuditService flowAuditService;
         IDropListService dropListService;
         IJobService jobService;
         IUploadFileService uploadFileService;

         FlowControllerBase()
        {
            employeeService =  EmployeeService();
            userService =  UserService();
            deptService =  DeptService();
            dictService =  DictService();
            ccFlowService =  CCFlowService();
            flowAuditService =  Flow_AuditService();
            dropListService =  DropListService();
            jobService =  JobService();
            uploadFileService =  UploadFileService();
        }
        #region 属性
         登录用户
         Sys_User LoginUser
        {
            get
            {
                Sys_User loginUser = AdminUtil.GetLoginUser(ctx);
                loginUser.Employee = employeeService.findById<IMP_Employee>(loginUser.RelationId);
                 loginUser;
            }
        }

         员工
         IMP_Employee Employee
        {
            
            {
                IMP_Employee employee = employeeService.findById<IMP_Employee>(LoginUser.RelationId);
                employee.EmployeeUser = AdminUtil.GetLoginUser(ctx);
                 employee;
            }
        }

         FK_Flow
        protected  FK_Flow
        {
            return ctx.Get(FK_Flow);
            }
        }

         WorkID
         WorkID
        {
             FK_Node
         FK_Node
        {
            FK_Node FID
         FID
        {
            FID SID
         SID
        {
            SID);
            }
        }
        #region 通用设置
         通用设置
        void CommonSet(IMP_Employee employee)
        {
            登录CCFlow
            LoginCCFlow();

            回退、移交信息设置
            SetInfo();

            设置SID,用于控制按钮是否显示
            if (SID == )
            {
                set(none);
            }
            事件设置
            FlowMenuController designController =  FlowMenuController();
            SendResult?FK_Flow=" + FK_Flow + &WorkID=" + WorkID + &FK_Node=" + FK_Node);
            ForwardLinkCCUrl&FID=" + FID + 01);
            ReturnWorkLink" + FK_Node +  FID);
        }
        #region 回退、移交信息设置
         回退、移交信息设置
         SetInfo()
        {
            Msginfo""流程退回信息,退回信息和移交信息不可能同时存在
            string msginfo = ccFlowService.GetReturnWorksInfo(FK_Node,WorkID);
            strUtil.IsNullOrEmpty(msginfo))
            {
                sginfo);
            }

            流程移交信息
            msginfo = ccFlowService.GetShiftWorksInfo(FK_Node,msginfo);
            }
        }
        #region 登录CCFlow
         登录CCFlow
         LoginCCFlow()
        {
            登录CCFlow
            BP.Port.Emp emp =  BP.Port.Emp(LoginUser.Username);
            BP.Web.WebUser.SignInOfGener(emp,true);
        }
        #region 获得部门树
         获得部门树      
         GetDeptTree()
        {
            echoJson(dropListService.GetDeptsTree(LoginUser));
        }
        #region 获取岗位
         获取岗位
         GetJobs()
        {
            int deptId = ctx.PostInt(deptId);
            StringBuilder sb =  StringBuilder();
            List<IMP_Job> jobList = jobService.GetList(deptId);
            sb.Append(<option value='{1}'>{0}</option>0],1)">]));
            foreach (IMP_Job job in jobList)遍历课程
            {
                sb.Append(<option value='{0}'>{1}</option>#region 获取员工
         获取员工
         GetEmps_IdName()
        {
            int jobId = ctx.PostInt(jobId StringBuilder();
            List<IMP_Employee> empList = employeeService.GetList(jobId);
            sb.Append(foreach (IMP_Employee emp in empList)
            {
                sb.Append((" + emp.Code + )));
            }
            echoText(sb.ToString());
        }

         获取用户 
         GetUsers()
        {
             StringBuilder();
            List<Sys_User> userList = userService.GetList(jobId);
            sb.Append(foreach (Sys_User user  userList)
            {
                sb.Append(" + user.Username + ));
            }
            echoText(sb.ToString());
        }
        #region 获取员工(部门树和员工)
         获取员工(部门树和员工)
         GetEmployees()
        {
            echoJson(GetDepts(Constants.OptionAllVal,dropListService.GetDepts(LoginUser)));
        }

         获取部门树
        private List<Dictionary<string,1)">object>> GetDepts(int parentDeptId,List<IMP_Dept> allDeptList)
        {
            List<Dictionary<object>> dicList = new List<Dictionary<object>>();

            List<IMP_Dept> deptList = parentDeptId == Constants.OptionAllVal ?
                allDeptList.FindAll(a => a.Type == DictCodeConst.CD01_FGS) : allDeptList.FindAll(a => a.PId == parentDeptId);
            if (deptList.Count == 0 && parentDeptId != Constants.OptionAllVal) ;

            foreach (IMP_Dept dept  deptList)
            {
                Dictionary<object> dic = new Dictionary<object>();
                dic.Add(iddept dept.Id);
                dic.Add(textcheckBox);

                List<Dictionary<object>> childDicList = ();

                当前部门下的子部门
                List<Dictionary<object>> childDeptDicList = GetDepts(dept.Id,allDeptList);
                if (childDeptDicList != )
                {
                    childDicList.AddRange(childDeptDicList);
                }

                当前部门下的员工
                List<Dictionary<object>> childEmployeeDicList = GetEmployees(dept);
                if (childEmployeeDicList != )
                {
                    childDicList.AddRange(childEmployeeDicList);
                }

                if (childDicList != null && childDicList.Count > )
                {
                    dic.Add(stateopen" : closed);
                    dic.Add(children dicList;
        }

         获取部门下的员工
         GetEmployees(IMP_Dept dept)
        {
            List<Dictionary<();

            List<IMP_Employee> employeeList = employeeService.FindEmployeeDept(dept.Id);
            if (employeeList.Count == ;
            employeeList.sort((a,b) => .Compare(a.Name,b.Name));

            foreach (IMP_Employee employee  employeeList)
            {
                Dictionary<);
                string attributes = 'DeptName':'{0}','JobName':'{1}','EmpCode':'{2}','EntryTime':'{3}'null ?  : employee.Dept.Name,employee.Job ==  : employee.Job.Name,employee.Code ==  : employee.Code,employee.EntryTime == DateTime.MinValue ?  : employee.EntryTime.ToString(Constants.FormatDate));
                dic.Add(attributes dicList;
        }
        #region 上传附件
         上传附件
        </summary>
        [DbTransaction]
         UploadFile()
        {
            StringBuilder sbUploadFileIds =  StringBuilder();
            List<HttpFile> fileList = ctx.GetFiles();
            foreach (HttpFile file  fileList)
            {
                if (file.ContentLength == continue;

                Result resultFile = Uploader.SaveFile(file);上传附件
                if (resultFile.HasErrors)
                {
                    ctx.errors.Errors = resultFile.Errors;
                    echoJsonMsg(ctx.errors.ErrorsText,1)">false,1)">);
                    ;
                }

                保存附件实体类
                UploadFile uploadFile =  UploadFile();
                String filePath = strUtil.Join(sys.Path.diskPhoto,resultFile.Info.ToString());  获取文件路径
                uploadFile.Name = file.FileName;
                uploadFile.FileType = ()UploadFlieType.TrainingFile;
                uploadFile.Path = filePath;
                uploadFile.Created = DateTime.Now;
                Result resultUploadFile = uploadFileService.insert(uploadFile);
                 (resultUploadFile.HasErrors)
                {
                    ctx.errors.Errors = resultUploadFile.Errors;
                    echoText(<script>parent.finishUploadFile('error');</script>;
                }
                sbUploadFileIds.Append( uploadFile.Id);
            }

             这里的内容返回给 iframe
            StringBuilder sb =  StringBuilder();
            sb.Append(<script> 这段内容在iframe中,所以通过 parent 来调用页面方法
            if (sbUploadFileIds.Length > )
            {
                sb.Append(parent.finishUploadFile('" + sbUploadFileIds.ToString().Substring(1) + ')parent.finishUploadFile(''));
            }
            sb.Append(</script>);

            echoText(sb.ToString());
        }
        #region 下载附件
         附件下载
        void DownloadFile( uploadFileId)
        {
            UploadFile uploadFile = uploadFileService.findById<UploadFile>(uploadFileId);
            if (uploadFile != )
            {
                HttpContext context = (HttpContext)ctx.web.Context;
                if (context != )
                {
                    string filePathName = PathHelper.Map(sys.Path.diskPhoto) + uploadFile.Path.Replace(/static/upload/image"").Replace(/\\int pos = filePathName.LastIndexOf(string fileName = filePathName.Substring(pos + string UserAgent = context.Request.ServerVariables[http_user_agent].ToLower();
                    if (UserAgent.IndexOf(firefox") == -)
                    {
                        非火狐浏览器
                        context.response.addheader(content-dispositionattachment;filename= HttpUtility.UrlEncode(uploadFile.Name));
                    }
                    
                    {
                        context.response.addheader( uploadFile.Name);
                    }
                    FileStream fs =  FileStream(filePathName,FileMode.Open,FileAccess.Read);
                    byte[] bArr = new byte[fs.Length];
                    fs.Read(bArr,bArr.Length);
                    fs.Close();
                    context.Response.ContentEncoding = Encoding.UTF8;
                    context.Response.BinaryWrite(bArr);
                    context.Response.Flush();
                    context.Response.End();
                }
            }
        }
        

    }
}
View Code

 六、待办、抄送、查询等流程列表页面的控制器代码

 System.Collections;
 CQSD.Service.Interface.Admin.CCFlow;

 工作流(设计器、新建工作、待办工作等)
     FlowMenuController : FlowControllerBase
    {
        #region 工作流设计器
         工作流设计器
         Design()
        {

        }
        #region 发起
         发起
         FaQi()
        {
            登录
TimeKeyNow.ToString(yyyyMMddHHmmss));
            UserNo初始化查询条件
            Flow_FlowInfo con =  Flow_FlowInfo();

            BindFaQiCon(con);
            BindFaQiAction();
        }

          绑定事件
         BindFaQiAction()
        {
            GetFaQiData 绑定查询条件
         BindFaQiCon(Flow_FlowInfo con)
        {
            con.Typecon.Name 获取可以发起的流程
         GetFaQiData()
        {
            Flow_FlowInfo con =  Flow_FlowInfo();
            con.Type = ctx.Get();
            con.Name = ctx.Get(获取用户可发起的流程
            DataTable dt = BP.WF.Dev2Interface.DB_GenerCanStartFlowsOfDataTable(LoginUser.Username);

            流程类别
            List<Flow_FlowInfo> list = new List<Flow_FlowInfo>();
            List<Flow_FlowInfo> flowTypeList = ();
            foreach (DaTarow dr  dt.Rows)
            {
                if (!flowTypeList.Exists(a => a.FK_FlowSort == dr[FK_FlowSort].ToString()))
                {
                    Flow_FlowInfo flowType =  Flow_FlowInfo();
                    flowType.id = dr[].ToString();
                    flowType.level = ;
                    flowType.parent = -1;
                    flowType.isLeaf = false;
                    flowType.expanded = ;

                    flowType.FK_FlowSort = dr[].ToString();
                    flowType.No = ;
                    flowType.Type = dr[FK_FlowSortText].ToString();
                    flowType.Name = ;

                    flowTypeList.Add(flowType);
                }
            }

            foreach (Flow_FlowInfo flowType in flowTypeList)遍历流程类别
            {
                list.Add(flowType);

                流程 
                List<Flow_FlowInfo> flowList = ();
                 dt.Rows)
                {
                    if (dr["].ToString() == flowType.FK_FlowSort)
                    {
                        Flow_FlowInfo flow =  Flow_FlowInfo();
                        flow.id = level1" + dr[No].ToString();
                        flow.level = ;
                        flow.parent = dr[].ToString();
                        flow.isLeaf = ;
                        flow.expanded = ;

                        flow.No = dr[].ToString();
                        flow.Type = dr[].ToString();
                        flow.Name = dr[].ToString();

                        flowList.Add(flow);
                    }
                }

                list.AddRange(flowList);
            }

            list = list.FindAll(a => a.Type.IndexOf(con.Type) != -1 && a.Name.IndexOf(con.Name) != -);

            echoJson(list);
        }
        #region 待办
         待办
         DaiBan()
        {
             Flow_FlowInfo();

            BindDaiBanCon(con);
            BindDaiBanAction();
        }

         BindDaiBanAction()
        {
            GetDaiBanData BindDaiBanCon(Flow_FlowInfo con)
        {
             GetDaiBanData()
        {
            Flow_FlowInfo con = 数据
            DataTable dt = BP.WF.Dev2Interface.DB_GenerEmpWorksOfDataTable(LoginUser.Username,1)">流程
            List<Flow_WorkInfo> list = new List<Flow_WorkInfo>();
            List<Flow_WorkInfo> flowList = if (!flowList.Exists(a => a.FK_Flow == dr[].ToString()))
                {
                    Flow_WorkInfo flow =  Flow_WorkInfo();
                    flow.id = dr[].ToString();
                    flow.level = ;
                    flow.parent = ;
                    flow.isLeaf = ;
                    flow.expanded = ;

                    flow.FK_Flow = dr[].ToString();
                    flow.Title = dr[FlowName].ToString();
                    flow.FlowName = ;

                    flowList.Add(flow);
                }
            }

            foreach (Flow_WorkInfo flow in flowList)遍历流程
            {
                list.Add(flow);

                工作 
                List<Flow_WorkInfo> workList =  flow.FK_Flow)
                    {
                        Flow_WorkInfo work =  Flow_WorkInfo();
                        work.id = ].ToString();
                        work.level = ;
                        work.parent = dr[].ToString();
                        work.isLeaf = ;
                        work.expanded = ;

                        work.FK_Flow = dr[].ToString();
                        work.FK_Node = dr[].ToString();
                        work.WorkID = dr[].ToString();
                        work.FID = dr[].ToString();
                        work.AtPara = dr[AtPara].ToString();

                        work.Title = dr[Title].ToString();
                        work.FlowName = dr[].ToString();
                        work.NodeName = dr[NodeName].ToString();
                        work.StarterName = dr[StarterName].ToString();
                        work.RDT = dr[RDT].ToString();
                        work.ADT = dr[ADT].ToString();
                        work.SDT = dr[SDT].ToString();
                        work.WFState = 逾期;

                        if (!strUtil.IsNullOrEmpty(dr[].ToString()))
                        {
                            var d1 = DateTime.Now;
                            var d2 = DateTime.Parse(dr[].ToString());
                            if ((dr[Presstimes"].ToString() == 0") || (d1 <= d2))
                            {
                                work.WFState = 正常;
                            }
                        }

                        workList.Add(work);
                    }
                }

                list.AddRange(workList);
            }

            list = list.FindAll(a => a.FlowName.IndexOf(con.Name) != -#region 在途
         在途
         ZaiTu()
        {
             Flow_FlowInfo();

            BindZaiTuCon(con);
            BindZaiTuAction();
        }

         BindZaiTuAction()
        {
            GetZaiTuDataFlow_DoUnSendLinkCuiBanLink BindZaiTuCon(Flow_FlowInfo con)
        {
             数据
         GetZaiTuData()
        {
            Flow_FlowInfo con = 数据
            DataTable dt = BP.WF.Dev2Interface.DB_GenerRuning(LoginUser.Username,1)">].ToString();

                        workList.Add(work);
                    }
                }

                list.AddRange(workList);
            }

            list = list.FindAll(a => a.FlowName.IndexOf(con.Name) != -#region 查询
         ChaXun()
        {
             Flow_FlowInfo();

            BindChaXunCon(con);
            BindChaXunAction();
        }

         BindChaXunAction()
        {
            GetChaXunData BindChaXunCon(Flow_FlowInfo con)
        {
             GetChaXunData()
        {
            Flow_FlowInfo con = 获取有流程的流程类别
            DataTable dtFlowType = ccFlowService.GetFlowTypeList();

            List<Flow_FlowInfo> flowList = ();
            Flow_FlowInfo flow;
            foreach (DaTarow drFlowType in dtFlowType.Rows)            {
                flow =  Flow_FlowInfo();
                flow.id = drFlowType[].ToString();
                flow.level = ;
                flow.parent = ;
                flow.isLeaf = ;
                flow.expanded = ;

                flow.Type = drFlowType[].ToString();
                flow.No = ;
                flow.Name = ;

                flowList.Add(flow);

                获取类别下的流程
                DataTable dt = ccFlowService.GetFlowList(drFlowType[].ToString(),Employee);

                in dt.Rows)遍历类别下的流程集合
                {
                    flow =  Flow_FlowInfo();
                    flow.id = ;
                    flow.parent = dr[].ToString();
                    flow.isLeaf = ;

                    flow.No = dr[].ToString();
                    flow.Type = dr[].ToString();
                    flow.Name = dr[].ToString();

                    flowList.Add(flow);
                }
            }

            flowList = flowList.FindAll(a => a.Type.IndexOf(con.Type) != -);

            echoJson(flowList);
        }
        #region 抄送列表
         抄送列表
         cclist()
        {
            初始化查询条件
            Flow_CCInfo con =  Flow_CCInfo();

            BindcclistCon(con);
            BindcclistAction();
        }

         BindcclistAction()
        {
            GetcclistDatacclistData));
             BindcclistCon(Flow_CCInfo con)
        {

        }

         GetcclistData()
        {
            Flow_CCInfo con =  Flow_CCInfo();
            int searchType = ctx.GetInt(SearchType数据
            DataTable dt =  DataTable();

            switch (searchType)
            {
                case 1: 全部
                    dt = BP.WF.Dev2Interface.DB_cclist(LoginUser.Username);
                    break;
                2: 未读
                    dt = BP.WF.Dev2Interface.DB_cclist_UnRead(LoginUser.Username);
                    3: 已读
                    dt = BP.WF.Dev2Interface.DB_cclist_Read(LoginUser.Username);
                    4: 删除
                    dt = BP.WF.Dev2Interface.DB_cclist_Delete(LoginUser.Username);
                    default:
                    ;
            }

            流程
            List<Flow_CCInfo> list = new List<Flow_CCInfo>();
            List<Flow_CCInfo> flowList = ].ToString()))
                {
                    Flow_CCInfo flow =  Flow_CCInfo();
                    flow.id = dr[].ToString();

                    flowList.Add(flow);
                }
            }

            foreach (Flow_CCInfo flow 工作 
                List<Flow_CCInfo> workList =  flow.FK_Flow)
                    {
                        Flow_CCInfo work =  Flow_CCInfo();
                        work.id = ].ToString();
                        work.Sta = dr[Sta].ToString();
                        work.MyPK = dr[MyPK].ToString();
                        work.Doc = dr[Doc].ToString();
                        work.CCEmpName = dr[Rec].ToString();

                        workList.Add(work);
                    }
                }

                list.AddRange(workList);
            }

            echoJson(list);
        }
        #region 系统消息
         系统消息
         MsgList()
        {
            ReadSMSUrl初始化查询条件
            Flow_SMSInfo con =  Flow_SMSInfo();

            BindMsgListCon(con);
            BindMsgListAction();
        }

         BindMsgListAction()
        {
            GetMsgListData BindMsgListCon(Flow_SMSInfo con)
        {

        }

         GetMsgListData()
        {
            Flow_SMSInfo con =  Flow_SMSInfo();
             ccFlowService.GetSMS(LoginUser.Username,Constants.OptionAllVal);
                    未读
                    dt = ccFlowService.GetSMS(LoginUser.Username,1)">已读
                    dt = ccFlowService.GetSMS(LoginUser.Username,1)">流程
            List<Flow_SMSInfo> list = new List<Flow_SMSInfo>();
            List<Flow_SMSInfo> flowList = if (!flowList.Exists(a => a.Title == dr["].ToString().Substring(0,1)">10)))
                {
                    Flow_SMSInfo flow =  Flow_SMSInfo();
                    flow.id = dr[);
                    flow.level = ;

                    flow.Title = dr[);

                    flowList.Add(flow);
                }
            }

            按日期排序
            flowList.sort((a,b) =>
                {
                     Convert.ToDateTime(b.Title).Compareto(Convert.ToDateTime(a.Title));
                });

            foreach (Flow_SMSInfo flow 工作 
                List<Flow_SMSInfo> workList = 10) == flow.Title)
                    {
                        Flow_SMSInfo work =  Flow_SMSInfo();
                        work.id = );
                        work.isLeaf = ;

                        work.MyPK = dr[].ToString();
                        work.Sender = dr[Sender].ToString();

                        SID
                        string doc = dr[].ToString();
                        int sidPos = doc.IndexOf(SID=);
                        string subdoc = doc.Substring(sidPos + 4int blankPos = subdoc.IndexOf(" if (blankPos != -)
                        {
                            work.Para = subdoc.Substring(
                        {
                            work.Para = subdoc.Substring();
                        }

                        "].ToString().Split(string[] { " },StringSplitOptions.None).Length > 2)
                        {
                            work.Para = <a href='javascript:void(0);' onclick='openWork(\"" + work.MyPK + \",\""
                                + /WF/Do.aspx?DoType=OF&SID=" + work.Para + \")'>" + work.Title + </a>;
                        }
                        
                        {
                            work.Para = <a href='/WF/Do.aspx?SID="
                                + work.Para + ' target='_blank' onclick='read(\"}</a>;
                        }

                        workList.Add(work);
                    }
                }

                list.AddRange(workList);
            }

            if (list.Count > if (list[0].Title == DateTime.Now.ToString(Constants.FormatDate))
                {
                    list[0].Title = 今天;
                }
            }

            echoJson(list);
        }
        #region 结果页面
         结果页面
         SendResult()
        {
            DataTable dtGenerWorkerlist = ccFlowService.GetGenerWorkerlist(WorkID,LoginUser.Username);
            if (dtGenerWorkerlist.Rows.Count > msg1当前工作【<b>" + dtGenerWorkerlist.Rows[FK_NodeText"] + </b>】已经完成流程已经走到最后一个节点,流程成功结束);
            }

            DataTable dtWork = ccFlowService.GetWork(WorkID);
            if (dtWork.Rows.Count > msg2任务自动发送给如下处理人:【<b>" + dtWork.Rows[TodoEmps</b>】msg3下一步【<b></b>】工作成功启动流程已经结束#region 撤销发送
         撤销发送
         Flow_DoUnSend()
        {
            BP.WF.Dev2Interface.Flow_DoUnSend(FK_Flow,1)">long.Parse(WorkID));

            echoJsonOk();
        }
        #region 催办
         催办
         CuiBan()
        {
            DataTable dt =if (dt.Rows.Count > 催办:" + dt.Rows[].ToString());
            }
            获取信息出错);
            }

            绑定事件 
            target(to(DoCuiBan) + ?WorkID= WorkID);
        }

         执行催办
         DoCuiBan()
        {
            string msg = ctx.Post(Content);
            BP.WF.Dev2Interface.Flow_DoPress(long.Parse(WorkID),msg,1)">);

            echoJsonOk();
        }
        #region 退回
         退回
         ReturnWork()
        {
            NowTimeyyyy-MM-dd HH:mmMsg);

            DataTable dt = BP.WF.Dev2Interface.DB_GenerWillReturnNodes(int.Parse(FK_Node),1)">.Parse(FID));
            Dictionary<string> dict = string> dt.Rows)
            {
                dict.Add(dr["].ToString(),dr[RecName=>].ToString());
            }
            dropList(Nodes绑定事件
            target(to(SaveReturnWork) +  FID);
        }

         保存退回
         SaveReturnWork()
        {
            int returnNodeId = ctx.PostInt();

            BP.WF.Dev2Interface.Node_ReturnWork(FK_Flow,1)">long.Parse(FID),returnNodeId,1)">#region 移交
         移交
         Forward()
        {
            绑定事件
            target(to(SaveForward) +  WorkID);
            GetDeptTreeGetJobsGetEmps 保存移交
         SaveForward()
        {
            string emp = ctx.Post(emptry
            {
                BP.WF.Dev2Interface.Node_Shift(.Parse(WorkID),emp,msg);
            }
            catch (Exception ex)
            {
                echoJsonMsg(ex.Message,1)">;
            }

            echoJsonOk();
        }
        #region 抄送
         抄送
         CC()
        {
            );

            List<IMP_Employee> employeeList = employeeService.GetAllList();
            checkBoxList(EmpName=Id);

            DataTable dt = ccFlowService.GetWork(WorkID);  BP.WF.Dev2Interface.Flow_GetWorkerList(long.Parse(WorkID));
            绑定事件
            target(to(SaveCC) + GetEmployees 保存抄送
         SaveCC()
        {
            string employeeIds = ctx.Post(employeeIdsstring title = ctx.Post(处理ID
            List<string> employeeIdList = new List<string[] employeeIdArray = employeeIds.Split('foreach (string employeeId  employeeIdArray)
            {
                if (employeeId.IndexOf()
                {
                    employeeIdList.Add(employeeId);
                }
            }

            List<IMP_Employee> employeeList = employeeService.GetList( employeeList)
            {
                Sys_User user = userService.GetByEmployeeId(employee.Id);
                BP.WF.Dev2Interface.Node_CC(FK_Flow,title,msg);
            }

            echoJsonOk();
        }
         ReadSMS()
        {
            Sys_User loginUser = AdminUtil.GetLoginUser(ctx);
            string MyPK = ctx.Get();

            ccFlowService.ReadSMS(MyPK);

            RemindHelper.SubSysMsgCnt(loginUser.Id);

            echoJsonOk();
        }
        

    }
}
View Code

 七、审核界面通用JS

$(function () {
    退回、移交等信息
    var msginfo = $("input[name='Msginfo']").val();
    if (msginfo != "") {
        var adminMainContent = $(".adminMainContent");
        var html = "";
        html += "<div class='Box' style='margin-bottom:5px;'>";
        html += "    <div class='Box-title'>";
        html += "        提示信息";
        html += "    </div>";
        html += "    <div class='Box-content'>";
        html += "        <table cellpadding='0' cellspacing='0' class='detail' width='100%'>";
        html += "            <tr>";
        html += "                <td>";
        html += "                    " + msginfo;
        html += "                </td>";
        html += "            </tr>";
        html += "        </table>";
        html += "</div>";
        adminMainContent.prepend(html);
    }

    控制按钮显示
    var SID = $("input[name='SID']"if (SID == "none") {
        $(".btnContainer").remove();
        $(".tiao").remove();
    }
});
View Code

 八、具体流程业务数据的增删改查列表页

 九、具体流程业务的审核页面前台代码

<link href="~css/admin/admin.css?v=#{jsversion}" type="text/css" rel="stylesheet">
="~js/easyui/easyui.css"="stylesheet"="text/css" />
script src="~js/easyui/jquery.easyui.min.js?v=#{jsversion}"="text/javascript"></script="~js/FlowCommon.js"input name="Msginfo"="hidden" value="#{Msginfo}" ="SID"="#{SID}" form id="myForm" method="post" action="#{ActionLink}" enctype="multipart/form-data"
class="ajaxPostForm" callback="callback"div ="btnContainer tiao">
    type="button"="提交审核" id="btnSave" onclick="save()" class="SIMPO_Text_Red2" />
    ="移交"="Button3"="forward()"="SIMPO_Text_Blue" ="抄送"="Button4"="cc()"="退回"="Button5"="returnWork()"="submit"="保存提交"="btnSaveSubmit" style="display: none;" <!-- <input type="button" class="SIMPO_Text_Gray btnCancel" value="取消" />-->
</div="adminMainContent"iframe ="frmUpload"="display: none"iframe="Box">
        ="Box-title">
            请假申请信息
        ="Box-content">
            table cellpadding="0" cellspacing="detail" width="100%">
                tr>
                    td ="title"
                        请假人:
                    td
                        #{employee.Name}
                         name="askLeave.Employee"="#{employee.Id}" />
                    
                        请假人部门:
                    
                        #{employee.Dept.Name}
                    
                        开始时间:
                    
                        #{askLeave.StartTime}
                    
                        结束时间:
                    
                        #{askLeave.EndTime}
                    
                        请假时长:
                    
                        #{askLeave.PlanLeaveDays}
                    
                        请假日期:
                    
                        #{askLeave.ApplyDate}
                    
                        请假调休类型:
                    colspan="3"
                        #{askLeave.dispLeaveType} span ="spanLeaveType"span
                        请假事由:
                    
                        #{askLeave.LeaveReason}
                    table="Box"="margin-top: 5px;"
            审批意见
        >
                        ="mst">*审批意见:
                    textarea ="YiJian"="tipInput" tip="长度不得超过500"="width: 90%; height: 100px;">#{YiJian}textarea="valid" msg mode="border" rule="^(.|\n){0,500}$"是否通过:
                    
                        #{SFTG}
                    ="margin-bottom: 50px; margin-top: 5px;"
            审核列表
        ='0' cellspacing='detail' width='100%' style='margin-bottom: 2px;' BEGIN auditList -->
                rowspan='2' ='title' ='text-align: center;'b>#{audit.NodeName}='title'
                        审核人:
                    ='width: 15%;'
                        #{audit.Auditor}
                    
                        审核时间:
                    
                        #{audit.AuditTime}
                    
                        是否通过:
                    10%;'
                        #{audit.SFTG}
                    
                        审核意见:
                    ='5'
                        #{audit.YiJian}
                     END auditList -->
            form="text/javascript" src="~js/My97DatePicker/WdatePicker.js?v=#{jsversion}">
    _run(function () {

        //选择请假类型
        $.ajax({
            type: "POST#{CalRemainingLeaveTimeLink}LeaveType=#{askLeave.LeaveType} (data) {
                if (data) {
                    $(#spanLeaveType).html((" + data + ));
                }
            }
        });

    });

    保存
     save() {
        Simpo.ui.loading.show();

        var SFTG = $(input[name='SFTG']:checked).val();
         (!SFTG) {
            Simpo.ui.msg.error(请选择是否通过);
            Simpo.ui.loading.hide();
            return;
        }

        Simpo.ui.dovalid($(#btnSaveSubmit))) {
            Simpo.ui.msg.error(页面输入校验失败,请检查;
        }

        $(').click();
    }

    回调
     callback(thisForm,data) {
        Simpo.ui.loading.hide();

         (data.IsValid) {
             frameId  top.getTabFrameId(待办工作);
             frame  top.window.frames[frameId.replace(#"")];
             (frame) frame.search();
            setTimeout( () {
                window.location = #{SendResult};
            },1)">500);
        }
    }

    移交
     forward() {
        window.location.href #{ForwardLink};
    }

    抄送
     cc() {
        top.addTabReplace(抄送#{CCUrl});
    }

    退回
     returnWork() {
        window.location.href #{ReturnWorkLink};
    }

>
View Code

 十、具体流程业务的控制器代码

 System.IO;
 CQSD.Controller.Admin.CCFlow;
 CQSD.Helper;
 Demo.Domain.DB;
 Simpo.Web.Utils;

 CQSD.Controller.Admin.HR.AskLeave
{
     请假
     AskLeaveController : FlowControllerBase
    {
        #region 构造函数和字段
        private IAskLeaveService askLeaveService;
         FlowMenuController flowMenuController;
         IUploadFileService uploadFileService;
         ILeaveLongSerivce leaveLongSerivce;
         IWorkingTimeService workingTimeService;

         AskLeaveController()
        {
            askLeaveService =  AskLeaveService();
            flowMenuController =  FlowMenuController();
            uploadFileService =  UploadFileService();
            leaveLongSerivce =  LeaveLongService();
            workingTimeService =  WorkingTimeService();
        }
        #region 请假列表
         请假列表
         Index()
        {
             初始化检索条件
            IMP_AskLeave con =  IMP_AskLeave();
            DateTime Now = DateTime.Now;
            con.ApplyDateStart = new DateTime(Now.Year,Now.Month,1)">).ToString(Constants.FormatDate);
            con.ApplyDateEnd = Now.Month + 1,1)">1).AddDays(-).ToString(Constants.FormatDate);

            SetIndexVis();
            BindindexCon(con);
            BindindexAction();
        }

         BindindexCon(IMP_AskLeave con)
        {
            con.ApplyDateStartcon.ApplyDateEndcon.EmpName dictService.GetListByType(DictType.CD80_FlowStatus);
            dropList(con.StatusName=Code BindindexAction()
        {
            GetIndexDataAddLinkEditLinkViewLinkDeleteLinkBatchDeleteLinkStartWorkLinkInvalidLinkTerminateLink 页面权限
         SetIndexVis()
        {
        }

         查询数据
         GetIndexData()
        {
            CurrentRequest.setCurrentPage(ctx.GetInt(pageint pageSize = ctx.GetInt(rowsstring sidx = ctx.Get(sidxstring orderby = ctx.Get(") + " + ctx.Get(sord);

            IMP_AskLeave con =  IMP_AskLeave();
            con.EmpName = ctx.Get();
            con.ApplyDateStart = ctx.Get();
            con.ApplyDateEnd = ctx.Get();
            con.Status = ctx.Get();
            con.Comp = employeeService.GetCompByEmployeeId(Employee.Id);
            DataPage<IMP_AskLeave> askLeaveList = askLeaveService.GetPage(con,pageSize,1)">orderby);
            askLeaveList.Results.ForEach(a =>
            {
                a.dispPlanLeaveDays = MinutesToDays(a.PlanLeaveDays);
                a.dispActualLeaveDays = MinutesToDays(a.ActualLeaveDays);
            });

            string ret = askLeaveList.ToJqJson();
            echoJson(ret);
        }
        #region 请假列表(个人列表)
         请假列表(个人列表)
         PersonalIndex()
        {
            ).ToString(Constants.FormatDate);

            SetPersonalIndexVis();
            BindPersonalIndexCon(con);
            BindPersonalIndexAction();
        }

         BindPersonalIndexCon(IMP_AskLeave con)
        {
             BindPersonalIndexAction()
        {
            GetPersonalIndexData SetPersonalIndexVis()
        {
        }

         GetPersonalIndexData()
        {
            CurrentRequest.setCurrentPage(ctx.GetInt();
            con.createuser = LoginUser;
            DataPage<IMP_AskLeave> askLeaveList = askLeaveService.GetPage(con,1)">
                {
                    a.dispPlanLeaveDays = MinutesToDays(a.PlanLeaveDays);
                    a.dispActualLeaveDays = MinutesToDays(a.ActualLeaveDays);
                });

            #region 添加
         添加
         Add()
        {
            IMP_AskLeave askLeave =  IMP_AskLeave();
            bind(askLeaveaskLeave.ApplyDateNow.ToString(Constants.FormatDate));
            List<Sys_Dict> dictLeaveTypeList = dictService.GetListByType(DictType.CD49);
            dropList(askLeave.LeaveType获取当前登录用户关联的员工信息
            IMP_Employee employee = employeeService.findById<IMP_Employee>(LoginUser.RelationId);
            bind(employee工作时长
            IMP_WorkTimeSetting workTimeSetting = workingTimeService.Get(Employee.Dept);
            WorkLong 绑定事件
            target(Create);
            CalRemainingLeaveTimeLink 添加员工培训保存
                [HttpPost,DbTransaction]
         Create()
        {
            IMP_AskLeave askLeave =  IMP_AskLeave();
            askLeave = ctx.PostValue<IMP_AskLeave>();
            askLeave.createuser = LoginUser;
            askLeave.CreateTime = DateTime.Now;
            askLeave.Status = DictCodeConst.CD80_FlowStatus_CG;
            askLeave.ActualLeaveDays = askLeave.PlanLeaveDays;

            Result result = askLeaveService.insert(askLeave);
             (result.HasErrors)
            {
                ctx.errors.Errors = result.Errors;
                echoJsonMsg(ctx.errors.ErrorsText,1)"> 日志
            OperateLogHelper<Sys_OperateLog>.Add(LoginUser,OperateLogString.AskLeaveAddOk(),1)">{Id:" + askLeave.Id + }typeof(IMP_AskLeave).FullName,ctx.Ip);

            echoJsonOk();
        }
        #region 修改
         修改
         Edit()
        {
            int askLeaveId = ctx.GetInt(Id);
            IMP_AskLeave askLeave = askLeaveService.findById<IMP_AskLeave>(askLeaveId);
            bind(askLeave.StartTimeaskLeave.EndTime));
            List<Sys_Dict> dictLeaveTypeList =            target(Update,askLeaveId);
             修改员工培训保存
        void Update( askLeaveId)
        {
            IMP_AskLeave askLeave = askLeaveService.findById<IMP_AskLeave>(askLeaveId);
            askLeave = (IMP_AskLeave)ctx.PostValue(askLeave,1)">);
            askLeave.ActualLeaveDays = askLeave.PlanLeaveDays;
            askLeave.UpdateUser = LoginUser;
            askLeave.UpdateTime = DateTime.Now;

            Result result = askLeaveService.update(askLeave);
            #region 查看
         查看
         View()
        {
            ));
            Sys_Dict dictLeaveType = dictService.GetListByTypeAndCode(DictType.CD49,askLeave.LeaveType);
            askLeave.dispLeaveType : dictLeaveType.Name);
            askLeave.PlanLeaveDaysaskLeave.ActualLeaveDays获取当前登录用户关联的员工信息
            IMP_Employee employee = askLeave.Employee;
            bind(#region 删除
         删除
         Delete()
        {
            int askLeaveId = ctx.PostInt((askLeaveId);
            askLeave.DelFlg = ()Flag.Yes;

            Result result = 批量删除
         BatchDelete()
        {
            string choiceIds = ctx.PostIdList(FwCmdKey.choice.ToString());获取ID集合
            string action = ctx.Post(FwCmdKey.action.ToString());获取命令标识
            string[] idArray = choiceIds.Split(检查
            string id  idArray)
            {
                IMP_AskLeave askLeave = askLeaveService.findById<IMP_AskLeave>(.Parse(id));

                if (askLeave.Status != DictCodeConst.CD80_FlowStatus_CG)
                {
                    echoJsonMsg(删除失败!只能删除草稿状态的请假;
                }
            }

            if (FwCmdKey.deletetrue.ToString().Equals(action)) action 对应 页面中 cmd="deletetrue"
            {
                批量删除
                askLeaveService.updateBatch<IMP_AskLeave>(DelFlg={0})Flag.Yes),1)">Id in ({0})日志
            OperateLogHelper<Sys_OperateLog>{Ids:" + choiceIds + #region 发起工作(从草稿箱发起)
         发起工作(从草稿箱发起)
         StartWork()
        {
            string ids = ctx.Post(idsstring[] idArray = ids.Split(提交失败!请选择草稿状态的请假 处理ccflow的业务逻辑,仅把关键字段传递给ccflow的节点表单中去,用户判断方向。
                Hashtable ht =  Hashtable();

                string fk_Flow = IMP_FlowConfig.GetFK_Flow(Employee,1)">AskLeaveAuditlong workID = Dev2Interface.Node_CreateStartNodeWork(fk_Flow,ht,1)">null,LoginUser.Username,1)">请假申请: askLeave.Employee.Name);

                SendReturnObjs sendobj = BP.WF.Dev2Interface.Node_SendWork(fk_Flow,workID,ht);

                更新业务数据
                askLeave.FK_Flow = fk_Flow;
                askLeave.WorkID = ()workID;
                askLeave.Status = DictCodeConst.CD80_FlowStatus_SHZ;
                askLeaveService.update(askLeave,1)">Status });
            }

            echoJsonOk();
        }
        #region 结束流程
         结束流程
        void EndWork( status)
        {
            IMP_AskLeave askLeave = askLeaveService.Get(.Parse(WorkID));
            askLeave.Status = status;
            askLeaveService.update(askLeave,1)">);

            ccFlowService.EndFlowProcess(Employee,FK_Flow,WorkID);
            BP.WF.Dev2Interface.Flow_DoFlowOver(FK_Flow,1)">#region 审批
         审批
         Audit()
        {
            通用设置
            CommonSet(Employee);

            绑定请假
            IMP_AskLeave askLeave = askLeaveService.Get(.Parse(WorkID));
            bind(dioList(SFTGtypeof(Flag)),1)">YiJian审核列表
            List<Flow_Audit> auditList = flowAuditService.GetList(.Parse(WorkID));
            bindList(auditListaudit 绑定事件
            FlowMenuController flowMenuController = ActionLink" + FK_Node + (strUtil.IsNullOrEmpty(ctx.Get(last")) ? "" : &last=true 保存审批
         SaveAudit()
        {
            保存业务数据
            IMP_AskLeave askLeave = askLeaveService.Get(.Parse(WorkID));

            保存审核意见
            Flow_Audit audit =  Flow_Audit();
            audit.WorkID = .Parse(WorkID);
            audit.FK_Node = FK_Node;
            audit.YiJian = ctx.Post();
            audit.SFTG = ctx.PostInt();
            audit.Auditor = Employee.Name;
            audit.AuditTime = DateTime.Now;
            DataTable dtNode = ccFlowService.GetNode(.Parse(FK_Node));
            )
            {
                audit.NodeName = dtNode.Rows[].ToString();
            }
            Result result = flowAuditService.insert(audit);

            如果审核不通过,则结束流程
            if (audit.SFTG == ()Flag.No)
            {
                EndWork(FK_Flow,DictCodeConst.CD80_FlowStatus_BTG);
                echoJsonOk();
                if (!strUtil.IsNullOrEmpty(ctx.Get(")))如果是最后一步审核
            {
                askLeave.Status = DictCodeConst.CD80_FlowStatus_TG;
                askLeaveService.update(askLeave,1)"> 处理ccflow的业务逻辑,仅把关键字段传递给ccflow的节点表单中去,用户判断方向。
            Hashtable ht =  Hashtable();
            SendReturnObjs sendobj = BP.WF.Dev2Interface.Node_SendWork(FK_Flow,ht);

            echoJsonOk();
        }
        #region 绑定审核列表
         绑定审核列表
        void BindAudit(IBlock block,1)"> lbl,Object obj)
        {
            Flow_Audit audit = (Flow_Audit)obj;
            block.Set(audit.AuditTime));
            block.Set(audit.SFTG1 ? #region 退回修改
         退回修改
         ReEdit()
        {
                        CommonSet(Employee);

            IMP_AskLeave askLeave = askLeaveService.Get( 提出需求保存
         SaveReEdit()
        {
             处理业务数据保存
            IMP_AskLeave askLeave = askLeaveService.Get(.Parse(WorkID));
            askLeave = (IMP_AskLeave)ctx.PostValue(askLeave,1)">#region 作废
         作废
         Invalid()
        {
            (askLeaveId);
            askLeave.Status = DictCodeConst.CD80_FlowStatus_ZF;

            askLeaveService.update(askLeave,1)">#region 销假
         销假
         Terminate()
        {
            )DateTime.Now.Subtract(askLeave.StartTime).TotalMinutes);
            askLeave.LeaveTime            target(SaveTerminate,askLeaveId);
        }

        void SaveTerminate((askLeaveId);
            askLeave.LeaveTime = ctx.PostTime();
            askLeave.ActualLeaveDays = ctx.PostInt();

            askLeaveService.update(askLeave,1)">LeaveTimeActualLeaveDays });

            echoJsonOk();
        }
        #region 计算剩余假期
         计算剩余假期
        void CalRemainingLeaveTime( employeeId)
        {
            string leaveType = ctx.Post(LeaveType);

            IMP_Employee employee = employeeService.findById<IMP_Employee>(employeeId);
            IMP_LeaveLong leaveLong = leaveLongSerivce.Get(employee.Dept);
            IMP_WorkTimeSetting workTimeSetting = workingTimeService.Get(employee.Dept);
            int alreadyLeaveTime = askLeaveService.GetAlreadyLeaveTime(employee,leaveType);

            string result = string str = decimal _alreadyLeaveTime = (decimal)Math.Round(alreadyLeaveTime / 60.0,1)"> (leaveType)
            {
                case DictCodeConst.CD49_SHJ:
                    str = (leaveLong.Sangjia * workTimeSetting.WorkLong - _alreadyLeaveTime).ToString();
                    result = 剩余丧假:" + str + 小时;
                     DictCodeConst.CD49_CJ:
                    str = (leaveLong.Chanjia * workTimeSetting.WorkLong -剩余产假: DictCodeConst.CD49_HJ:
                    str = (leaveLong.Hunjia * workTimeSetting.WorkLong -剩余婚假: DictCodeConst.CD49_NXJ:
                    int year = employeeService.CalWorkAge(employee);
                    result = 没有年休if (year >= 1 && year <= 9)
                    {
                        str = (leaveLong.Nianxiu1 * workTimeSetting.WorkLong - _alreadyLeaveTime).ToString();
                        result = 剩余年休:;
                    }
                    10 && year <= 19)
                    {
                        str = (leaveLong.Nianxiu2 * workTimeSetting.WorkLong -20)
                    {
                        str = (leaveLong.Nianxiu3 * workTimeSetting.WorkLong -;
            }

            echoText(result);
        }
        #region 换算请假时长
         换算请假时长
        string MinutesToDays( minutes)
        {
            请假时长
            IMP_WorkTimeSetting workTimeSetting = workingTimeService.Get(Employee.Dept);

            int days = (int)(minutes / workTimeSetting.WorkLong / 60int hours = (int)((minutes - days * workTimeSetting.WorkLong * 60) / int minu = (int)(minutes - days * workTimeSetting.WorkLong * 60 - hours * {0}天{1}小时{2}分钟

    }
}
View Code

 十一、具体流程业务列表页前台代码

="~js/jqgrid/css/ui.jqgrid.css?v=#{jsversion}"="~css/ui/jquery-ui-1.9.2.custom.css?v=#{jsversion}"="~js/jqgrid/js/i18n/grid.locale-cn.js"="~js/jqgrid/js/jquery.jqgrid.min.js?v=#{jsversion}"="~js/easyui/jquery.easyui.min.js"style ="text/css"
    #t_list
    {
        border-left: 0;
        border-right;
    }
    a:hover
    
        text-decoration underline !important}
="tiao"="add()"="添加"
            查询条件
        ="myform"="get"="#{SearchLink}"="tableCon" cellpadding="100%"="detail"="con.EmpName"="#{con.EmpName}"="text"="SIMPO_Txt_150" 
                        审批状态:
                    
                        #{con.Status}
                    
                        请假时间:
                    ="border-right: 0;"="con.ApplyDateStart"="date SIMPO_Txt_100"="#{con.ApplyDateStart}"
                            onclick="WdatePicker({dateFmt:'yyyy-MM-dd'})" readonly="readonly" />="con.ApplyDateEnd"="#{con.ApplyDateEnd}"="2" align="right"="search()"="SIMPO_Text_Blue"="搜索" />
                        ="res();reset();"="SIMPO_Text_Gray"="重置" ="toolbar"="提交审批"="startWork()"/>
            ="btnCmd SIMPO_Text_Gray" cmd="deletetrue" data-action="#{BatchDeleteLink}"
                jqgridid="list"="删除" />
        ="list"="pager"列表
        $(#list).jqgrid({
            url: #{GetPersonalIndexData} (postData) {
                 Simpo.ui.jqgrid.serializeGridData(postData);
            },datatype: jsonIdStatusWorkID请假人请假人部门开始时间结束时间销假时间请假时长实际时长请假类型请假事由请假时间审批状态操作],colModel: [
                { name: true },{ name: EmpName80 (v,o,r) {
                       return <a href='javascript:void(0)' onclick='view(\" r[] \")' > v </a>;
                   }
                   },1)">DeptNamedispStartTimeStartTimedispEndTimeEndTimedispLeaveTimeLeaveTimedispPlanLeaveDaysPlanLeaveDaysdispActualLeaveDaysActualLeaveDaysdispLeaveTypeLeaveReasondispApplyDateApplyDatedispStatusoperatefalsecenter html ;
                     (r[!= 1) html += \")' > 查看</a>== <a href='javascript:void(0)' onclick='edit(\"\")' > 修改</a><a href='javascript:void(0)' onclick='del(\"\")' > | 删除 </a> html;
                }
                }
               ],rowNum: 102030#pagerdescauto.adminMainContent).width(),1)">caption: "员工培训",
            loadComplete:  (xhr) {
                Simpo.ui.jqgrid.loadComplete(list () {
                Simpo.ui.jqgrid.autoWidth();  自动宽度
            },loadError:  (xhr,status,error) {
                Simpo.ui.jqgrid.loadError(
            toolbar: [true,"top"]
        });
        jQuery().jqgrid(navGrid }).jqgrid(sortableRows);
         toolbar
        $("#t_list").append($("#toolbar"));

        $(window).resize( () {
            Simpo.ui.jqgrid.autoWidth();
        });
    });

     查询方法
     search() {
         postData  Simpo.ui.jqgrid.serializeGridData();
        jQuery(setGridParam }).trigger(reloadGrid重置
     res() {
         dept input[name='con.Dept']);
        dept.val();
        $(#job).find(option[value!='-1']).remove();
    }

    添加
     add() {
        Simpo.ui.showFrmBox({
            title: 添加请假申请#{AddLink}data-scrolling: 800
        });
    }

    编辑
     edit(id) {
        Simpo.ui.showFrmBox({
            title: 编辑请假申请#{EditLink}?Id='  id,1)">查看
     view(id) {
        Simpo.ui.showFrmBox({
            title: 查看请假申请#{ViewLink}?Id=删除
     del(id) {
         (confirm(确定删除)) {
            $.ajax({
                type: #{DeleteLink}Id= (data) {
                     (data.IsValid) {
                        Simpo.ui.msg.success(删除成功);

                        search();
                    } else {
                        Simpo.ui.msg.error(data.Msg);
                    }
                },error:  (data) {
                    Simpo.ui.msg.error(删除失败);
                }
            });
        }
    }

    提交审批
     startWork() {
        Simpo.ui.loading.show();

        获取jqgrid选择的ID集合
         indexArray  jQuery(getGridParamselarrrow ids ;
        for i 0; i < indexArray.length; i++) {
             rowDatas getRowData+= rowDatas[ (indexArray.length ) {
            Simpo.ui.loading.hide();
            Simpo.ui.msg.error(请选择招聘需求确定提交审批?)) {
            提交审批
            $.ajax({
                type: #{StartWorkLink}ids= ids.substr(- ),1)"> (data) {
                    Simpo.ui.loading.hide();

                    提交审批成功);
                        search();
                    }  (data) {
                    Simpo.ui.loading.hide();
                    Simpo.ui.msg.error(提交审批失败);
                }
            });
        }
         {
            Simpo.ui.loading.hide();
        }
    }

    作废
     invalid(id) {
        确定作废?#{InvalidLink}作废成功作废失败);
                }
            });
        }
    }

>
View Code

 十二、退回修改页面前台代码

="发送"<input type="button" value="移交" id="Button3" onclick="forward()" class="SIMPO_Text_Blue" />
        <input type="button" value="抄送" id="Button4" onclick="cc()" class="SIMPO_Text_Blue" />
        <input type="button" value="退回" id="Button5" onclick="returnWork()" class="SIMPO_Text_Blue" />-->
    ="margin-bottom: 5px; margin-bottom: 50px;"开始时间:
                    ="askLeave.StartTime"="#{askLeave.StartTime}"="date SIMPO_Txt_150"="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm'})"="readonly" onblur="calPlanLeaveDays()" ="必填"=""结束时间:
                    ="askLeave.EndTime"="#{askLeave.EndTime}"请假时长:
                    ="days"="calMinutes()"="SIMPO_Txt_100"="width: 40px;" /><span
                            ="必填,整数"="int"><>="hours">小时="minutes">分钟="askLeave.PlanLeaveDays"="#{askLeave.PlanLeaveDays}"
                            class="SIMPO_Txt_100 tipInput"="必填,整数" 请假日期:
                    ="askLeave.ApplyDate"="#{askLeave.ApplyDate}"请假调休类型:
                    
                        #{askLeave.LeaveType} ="^(?!-1$).+$"请假事由:
                    ="askLeave.LeaveReason"="长度不得超过1000"="width: 99.5%;
                            height: 100px;">#{askLeave.LeaveReason}

    _run(select[name='askLeave.LeaveType']).change( () {
             val thisoption:selected).val();
            $.ajax({
                type: LeaveType= val,1)">).html(data);
                }
            });
        });
        $().change();

        计算请假时长
         WorkLong  parseInt(#{WorkLong} minutes  parseInt($(input[name='askLeave.PlanLeaveDays']).val());
         days  parseInt(minutes // 60 hours  parseInt((minutes -** ) );
        minutes 60 ;
        $(#days).val(days);
        $(#hours).val(hours);
        $(#minutes).val(minutes);
        calMinutes();

    });

     (data.IsValid) {
            setTimeout(计算请假时长
     calPlanLeaveDays() {
         str1 input[name='askLeave.StartTime']).val().replace( str2 input[name='askLeave.EndTime'] ($.trim(str1) "" && $.trim(str2)  d1 new Date(str1);
             d2  Date(str2);
             (d2  d1) 60000;
            24 );
            minutes ;
            $().val(days);
            $().val(hours);
            $().val(minutes);
            calMinutes();
        }
    }

    计算请假分钟数
     calMinutes() {
        ).val());
        minutes  minutes;
        $().val(minutes);
    }

    >
View Code

 十三、消息弹出提醒效果

 十四、退回修改页面效果

 十五、审批界面效果

十六、流程查询列表及流程表单查看页面

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐