CCFlow SDK模式开发

CCFlow SDK模式开发,第1张

概述需求: 1、业务数据要保存在我们自己的数据库里 2、CCFlow有保存草稿的功能,但是领导要求每个业务都要有草稿箱,流程从草稿箱发起,每个业务单独查询,而不要在CCFlow的统一界面查询,所以每个业务

需求:

    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_DeptTypeFROM         CQSD_Dev.dbo.IMP_Dept AS dept INNER JOIN                      CQSD_Dev.dbo.IMP_Dept AS comp ON comp.ID = dept.CIDWHERE     (dept.DelFlg = 0)ORDER BY comp.PID,comp.ID岗位:PERCENT job.ID 3 AS StaGrade,1)">AS DutyReq,1)">AS Makings,1)"> FK_StationTypeFROM         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)"> NumOfDeptFROM         CQSD_Dev.dbo.IMP_Employee AS e                       CQSD_Dev.dbo.Sys_User AS u ON u.RelationID  e.IDWHERE     (e.DelFlg )部门人员:AS FK_Emp,1)"> FK_Dept0) 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,IsReadFROM         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.RelationIDUNIONSELECT     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  isreadFROM         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.IDWHERE     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.dbaccess.RunsqlReturntable(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}'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.dbaccess.RunsqlReturntable(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}(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))            {                流程移交信息            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()        {            登录TimeKeyyyyyMMddHHmmss));            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()        {            GetCCListData 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"  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 = 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.ApplyDate 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(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()"  />        <input type="button" value="抄送" ID="button4" onclick="cc()"  />        <input type="button" value="退回" ID="button5" onclick="returnWork()"  />-->    ="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

 十三、消息d出提醒效果

 十四、退回修改页面效果

 十五、审批界面效果

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

 

总结

以上是内存溢出为你收集整理的CCFlow SDK模式开发全部内容,希望文章能够帮你解决CCFlow SDK模式开发所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1212621.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存