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

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
四、操作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} 退回人:{1} {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} {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 } }
五、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(); } } } } }
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(); } } }
七、审核界面通用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(); } });
八、具体流程业务数据的增删改查列表页面

<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}; } >
十、具体流程业务的控制器代码
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}分钟 } }
="~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: },{ 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}作废成功作废失败); } }); } } >
="发送"<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); } >
十三、消息弹出提醒效果
十五、审批界面效果
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。