/// <summary> /// 在维修确认环节可以转移给其他维修工 /// </summary> /// <param name="formJson"></param> public void ShouldTransferToOther(string formJson) { o = JObject.Parse(formJson); string sysNo = (string)o["sys_no"]; string transferToRepairer = (string)o["transfer_to_repairer"]; if (!string.IsNullOrEmpty(transferToRepairer)) { try { var applyEntry = db.flow_applyEntry.Where(a => a.flow_apply.sys_no == sysNo && a.step_name.Contains("维修处理")).OrderByDescending(a => a.step).First(); var toAddEntry = new flow_applyEntryQueue(); toAddEntry.auditors = transferToRepairer; toAddEntry.countersign = false; toAddEntry.flow_template_entry_id = applyEntry.flow_template_entry_id; toAddEntry.step = applyEntry.step + 1; toAddEntry.step_name = "转移->维修处理"; toAddEntry.sys_no = sysNo; db.flow_applyEntryQueue.InsertOnSubmit(toAddEntry); db.SubmitChanges(); } catch (Exception ex) { throw new Exception("转移给其他维修人员失败:" + ex.Message); } } }
/// <summary> /// 获取当前部门的审核人 /// </summary> /// <param name="dep">部门</param> /// <param name="processName">流程名称</param> /// <returns></returns> protected flow_applyEntryQueue GetGivenDepAuditor(ei_department dep, string processName, bool canBeNull = false) { var auditNodes = db.ei_departmentAuditNode.Where(a => a.ei_department == dep && a.FProcessName == processName && a.ei_department.FIsAuditNode == true).ToList(); ei_departmentAuditNode node = null; if (auditNodes.Count() > 0) { if (auditNodes.First().ei_departmentAuditUser.Where(u => u.FBeginTime <= DateTime.Now && u.FEndTime >= DateTime.Now && (u.isDeleted == false || u.isDeleted == null)).Count() > 0) { node = auditNodes.First(); } } else { if (canBeNull) { return(null); } throw new Exception("部门(" + dep.FNumber + ":" + dep.FName + ")没有启用审批节点"); } if (node != null) { flow_applyEntryQueue queue = new flow_applyEntryQueue(); queue.countersign = node.FIsCounterSign; queue.step_name = node.FAuditNodeName; queue.auditors = string.Join(";", node.ei_departmentAuditUser.Where(u => u.FBeginTime <= DateTime.Now && u.FEndTime >= DateTime.Now && (u.isDeleted == false || u.isDeleted == null)).Select(u => u.FAuditorNumber).ToArray()); return(queue); } throw new Exception("部门(" + dep.FNumber + ":" + dep.FName + ")【" + auditNodes.First().FAuditNodeName + "】审核人没有设置"); }
/// <summary> /// 获取上级部门审核人 /// </summary> /// <param name="depNo">申请人部门</param> /// <param name="skipNum">跳过的部门审核人数量</param> /// <param name="processName">流程名称</param> /// <returns></returns> protected flow_applyEntryQueue GetParentDepAuditor(string depNo, string processName, int skipNum = 0, bool canBeNull = true) { ei_department dep; try { dep = db.ei_department.Single(d => d.FNumber == depNo); } catch { throw new Exception("部门不存在,编码:" + depNo); } string[] spNode = new string[] { "AH审批", "行政审批" }; var auditNodes = db.ei_departmentAuditNode.Where(a => a.ei_department == dep && a.FProcessName == processName && a.ei_department.FIsAuditNode == true && !spNode.Contains(a.FAuditNodeName)).ToList(); ei_departmentAuditNode node = null; int currentNum = 0; while (node == null && dep != null) { if (auditNodes.Count() > 0) { if (auditNodes.First().ei_departmentAuditUser.Where(u => u.FBeginTime <= DateTime.Now && u.FEndTime >= DateTime.Now && (u.isDeleted == false || u.isDeleted == null)).Count() > 0) { currentNum++; if (currentNum > skipNum) { node = auditNodes.First(); break; } } } if (dep.FParent != null) { dep = db.ei_department.Single(d => d.FNumber == dep.FParent); auditNodes = db.ei_departmentAuditNode.Where(a => a.ei_department == dep && a.FProcessName == processName && a.ei_department.FIsAuditNode == true && !spNode.Contains(a.FAuditNodeName)).ToList(); } else { dep = null; } } if (node != null) { flow_applyEntryQueue queue = new flow_applyEntryQueue(); queue.countersign = node.FIsCounterSign; queue.step_name = node.FAuditNodeName; queue.auditors = string.Join(";", node.ei_departmentAuditUser.Where(u => u.FBeginTime <= DateTime.Now && u.FEndTime >= DateTime.Now && (u.isDeleted == false || u.isDeleted == null)).Select(u => u.FAuditorNumber).ToArray()); return(queue); } if (!canBeNull) { throw new Exception("上级部门审核人没有设置,错误代码:" + depNo + "-" + skipNum); } else { return(null); } }
private List <flow_applyEntryQueue> GetALAuditQueue(string formObj) { List <flow_applyEntryQueue> list = new List <flow_applyEntryQueue>(); o = JObject.Parse(formObj); string sysNo = (string)o["sys_no"]; string cardNo = (string)o["applier_num"]; string depNo = (string)o["dep_no"]; int empLevel = (int)o["emp_level"]; bool isDirectCharge = ((bool?)o["is_direct_charge"]) ?? false; string leaveType = (string)o["leave_type"]; int workDays = (int)o["work_days"]; decimal workHours = (decimal)o["work_hours"]; bool isContinue = ((bool?)o["is_continue"]) ?? false; //走集团流程的部门 bool isCopFlow = false; string[] copDepNames = new string[] { "信利工业有限公司", "信利仪器有限公司" }; foreach (var d in db.ei_department.Where(d => copDepNames.Contains(d.FName)).ToList()) { if (depNo.StartsWith(d.FNumber)) { isCopFlow = true; break; } } ei_department AHDep = GetNearestParentDepByNodeName(depNo, "AH审批", PROCESSNAME); //最近的AH审批节点 int stepNum = 1; if (isCopFlow) { //集团流程 string presidentNo; try { presidentNo = db.ei_department.Where(d => d.FName == "总裁办").First().FNumber; //总裁办 } catch { throw new Exception("[总裁办]部门不存在"); } if (empLevel < 1) { //组长以下,至少需要本部门和上一级部门负责人审批 var n0 = GetParentDepAuditor(depNo, PROCESSNAME, 0, false); n0.sys_no = sysNo; n0.step = stepNum++; list.Add(n0); var n1 = GetParentDepAuditor(depNo, PROCESSNAME, 1); if (n1 != null) { n1.sys_no = sysNo; n1.step = stepNum++; list.Add(n1); } if (workDays >= 2) { //大于2天,AH,上上级部门审批 if (AHDep != null) { var n2 = GetGivenDepAuditor(AHDep, PROCESSNAME); n2.sys_no = sysNo; n2.step = stepNum++; list.Add(n2); } var n3 = GetParentDepAuditor(depNo, PROCESSNAME, 2); if (n3 != null) { n3.sys_no = sysNo; n3.step = stepNum++; list.Add(n3); } } } else if (empLevel < 7) { //组长以上,经理/主管以下,至少需要本部门负责人和行政/HR审批 var n0 = GetParentDepAuditor(depNo, PROCESSNAME, 0, false); if (n0.step_name.Contains("组长")) { n0 = GetParentDepAuditor(depNo, PROCESSNAME, 1, false); //如果当前选择的部门是组长审批的,此职位级别要上级部门审批 } n0.sys_no = sysNo; n0.step = stepNum++; list.Add(n0); if (AHDep != null) { var n1 = GetGivenDepAuditor(AHDep, PROCESSNAME); n1.sys_no = sysNo; n1.step = stepNum++; list.Add(n1); } if (workDays >= 0) { //需要上上级部门负责人审批 var n2 = GetParentDepAuditor(depNo, PROCESSNAME, 1); if (n2 != null) { n2.step = stepNum++; n2.sys_no = sysNo; list.Add(n2); } } } else { //经理/主管以上,总裁办审批 var n0 = GetGivenDepAuditor(presidentNo, PROCESSNAME); n0.sys_no = sysNo; n0.step = stepNum++; list.Add(n0); } } else { //光电和半导体的请假流程 var ceoDep = GetNearestDep(depNo, "董事办公室"); if (ceoDep == null) { ceoDep = GetNearestDep(depNo, "总经理办公室"); //没有董事办公室,看有没有总经理办公室 } if (empLevel < 1) { //组长以下,必须本部门和上级部门审批 var n0 = GetParentDepAuditor(depNo, PROCESSNAME, 0, false); n0.sys_no = sysNo; n0.step = stepNum++; list.Add(n0); var n1 = GetParentDepAuditor(depNo, PROCESSNAME, 1); if (n1 != null) { if (list.Where(l => l.auditors.Contains(n1.auditors)).Count() < 1) //如果此节点审核人不存在已之前步骤的审批人中,即加入 { n1.sys_no = sysNo; n1.step = stepNum++; list.Add(n1); } } if (workDays >= 10) { //10天以上需要上上级审批 var n2 = GetParentDepAuditor(depNo, PROCESSNAME, 2); if (n2 != null) { if (list.Where(l => l.auditors.Contains(n2.auditors)).Count() < 1) //如果此节点审核人不存在已之前步骤的审批人中,即加入 { n2.sys_no = sysNo; n2.step = stepNum++; list.Add(n2); } } } if (workDays >= 15) { //15天以上需要AH部审批 if (AHDep != null) { var n3 = GetGivenDepAuditor(AHDep, PROCESSNAME); n3.sys_no = sysNo; n3.step = stepNum++; list.Add(n3); } } } else if (empLevel < 7) { //组长以上,经理/主管以下,至少需要本部门负责人审批 int skipNum = 0; var n0 = GetParentDepAuditor(depNo, PROCESSNAME, skipNum, false); if (n0.step_name.Contains("组长")) { n0 = GetParentDepAuditor(depNo, PROCESSNAME, ++skipNum, false); //如果当前选择的部门是组长审批的,此职位级别要上级部门审批 } n0.sys_no = sysNo; n0.step = stepNum++; list.Add(n0); if (workDays >= 3) { //3天以上需要上一级负责人审批 var n1 = GetParentDepAuditor(depNo, PROCESSNAME, ++skipNum); if (n1 != null) { if (list.Where(l => l.auditors.Contains(n1.auditors)).Count() < 1) //如果此节点审核人不存在已之前步骤的审批人中,即加入 { n1.sys_no = sysNo; n1.step = stepNum++; list.Add(n1); } } } if (workDays >= 10) { //10天以上需要AH部审批 if (AHDep != null) { var n2 = GetGivenDepAuditor(AHDep, PROCESSNAME); n2.sys_no = sysNo; n2.step = stepNum++; list.Add(n2); } } } else { //经理/主管以上 if (isDirectCharge) { //直管 if (ceoDep == null) { throw new Exception("[董事办公室]审核人未设置"); } var n0 = GetGivenDepAuditor(ceoDep, PROCESSNAME); n0.sys_no = sysNo; n0.step = stepNum++; list.Add(n0); } else { //不是直管,都要上一级部门负责人审批 var n0 = GetParentDepAuditor(depNo, PROCESSNAME, 1, false); n0.step = stepNum++; n0.sys_no = sysNo; list.Add(n0); if (workDays > 3) { //3天以上需要AH部审批 if (AHDep != null) { var n1 = GetGivenDepAuditor(AHDep, PROCESSNAME); n1.sys_no = sysNo; n1.step = stepNum++; list.Add(n1); } } if (workDays >= 10) { //10天以上需要董事总经理审批 if (ceoDep != null) { var n2 = GetGivenDepAuditor(ceoDep, PROCESSNAME, true); if (n2 != null) { n2.sys_no = sysNo; n2.step = stepNum++; list.Add(n2); } } } } } } //病假60天内累计请假大于30天,或除了产假、病假之外,其它假60天内累计大于15天,需要行政部审批 DateTime twoMonthsAgo = DateTime.Now.AddMonths(-2); string administrationNo = ""; //集团,行政审批 //惠州的由惠州那边行政负责 if (depNo.StartsWith("106")) { administrationNo = "106"; } else if (depNo.StartsWith("4")) { administrationNo = "4"; } else { administrationNo = "1"; } //else if (workDays <= 20) { //最近1年没有请过假的,在过年的月份里,请假少于20天的不需要经过行政部 // if (DateTime.Now.Month == 1 || DateTime.Now.Month == 2) { // var lastYear = DateTime.Parse(DateTime.Now.AddYears(-1).ToString("yyyy-02-01")); // if (db.flow_apply.Where(f => f.create_user == cardNo && f.start_date >= lastYear && f.sys_no!=sysNo).Count() == 0) { // return list; // } // } //} if ("产假延期".Equals(leaveType)) { //选择了产假延期,不管多少天,都要经过行政部审批 var ad = GetGivenDepAuditor(administrationNo, PROCESSNAME); ad.sys_no = sysNo; ad.step = stepNum++; list.Add(ad); } else if ("病假".Equals(leaveType)) { //2019-10-17起,只要病假请假天数大于10天,就需要行政部审批 if (workDays >= 10) { var ad = GetGivenDepAuditor(administrationNo, PROCESSNAME); ad.sys_no = sysNo; ad.step = stepNum++; list.Add(ad); } } else if ("工伤".Equals(leaveType)) { //2020-08-17 增加工伤假审批,光电仁寿到袁大军,其它的到锡标 string copName; if (depNo.StartsWith("4")) { copName = "光电仁寿"; } else { copName = "集团"; } string auditors = string.Join(";", db.flow_auditorRelation.Where(f => f.bill_type == "AL" && f.relate_name == "工伤假审批" && f.relate_text == copName).Select(f => f.relate_value).ToList()); var ad = new flow_applyEntryQueue(); ad.auditors = auditors; ad.countersign = false; ad.step = stepNum++; ad.step_name = "行政部确认"; ad.sys_no = sysNo; list.Add(ad); } else if (!"产假".Equals(leaveType) && !"年假".Equals(leaveType)) { if (workDays >= 15) { //单次请假大于15天的,需要到行政审批 var ad = GetGivenDepAuditor(administrationNo, PROCESSNAME); ad.sys_no = sysNo; ad.step = stepNum++; list.Add(ad); } else { string[] otherLeaveType = new string[] { "病假", "产假", "年假" }; //以下判断两个月累计是否超过30天的 var leaveRecord = db.vw_leaving_days.Where(v => v.applier_num == cardNo && !otherLeaveType.Contains(v.leave_type) && v.to_date > twoMonthsAgo).ToList(); int leaveDaysInTwoMonths = workDays; decimal leaveHoursInTwoMonths = workHours; foreach (var lr in leaveRecord.OrderByDescending(l => l.from_date)) { if (db.ei_leaveDayExceedPushLog.Where(e => e.sys_no == lr.sys_no).Count() > 0) { break; //行政约谈过的不用到行政部 } if (lr.from_date > twoMonthsAgo) { leaveDaysInTwoMonths += lr.work_days ?? 0; } else { leaveDaysInTwoMonths += ((DateTime)lr.to_date - twoMonthsAgo).Days; } leaveHoursInTwoMonths += lr.work_hours ?? 0; } leaveDaysInTwoMonths += (int)Math.Floor(leaveHoursInTwoMonths / 8); if (leaveDaysInTwoMonths >= 30) { var ad = GetGivenDepAuditor(administrationNo, PROCESSNAME); ad.sys_no = sysNo; ad.step = stepNum++; list.Add(ad); } else { //延假 2018-07-10 //以下判断是否连续请假15天,行政约谈过的就不用计算 if (leaveRecord.Count() > 0 && isContinue) { int totalDays = workDays; decimal totalHours = workHours; var lastRecord = leaveRecord.OrderByDescending(l => l.to_date).First(); var hasPush = db.ei_leaveDayExceedPushLog.Where(e => e.sys_no == lastRecord.sys_no).Count() > 0; if (!hasPush) { totalDays += lastRecord.work_days ?? 0; totalHours += lastRecord.work_hours ?? 0; } int skipNum = 0; while (lastRecord.is_continue) { if (leaveRecord.Count() > (++skipNum)) { lastRecord = leaveRecord.OrderByDescending(l => l.to_date).Skip(skipNum).First(); hasPush = db.ei_leaveDayExceedPushLog.Where(e => e.sys_no == lastRecord.sys_no).Count() > 0; if (!hasPush) { //为行政约谈的 totalDays += lastRecord.work_days ?? 0; totalHours += lastRecord.work_hours ?? 0; } else { //已行政约谈的,跳出循环 break; } } else { //请假条数不足,跳出循环 break; } } totalDays += (int)Math.Floor(totalHours / 8); if (totalDays >= 15) { var ad = GetGivenDepAuditor(administrationNo, PROCESSNAME); ad.sys_no = sysNo; ad.step = stepNum++; list.Add(ad); } } } } } return(list); }
public virtual List <flow_applyEntryQueue> GetFlowQueue(string formObj) { List <flow_applyEntryQueue> list = new List <flow_applyEntryQueue>(); var o = JObject.Parse(formObj); string sysNo = (string)o["sys_no"]; string cardNo = (string)o["applier_num"]; string depNo = (string)o["dep_no"]; string processName = "请假"; string[] spNode = new string[] { "AH审批", "行政审批" }; bool isDirectCharge = ((bool?)o["is_direct_charge"]) ?? false; int step = 1; var dep = db.ei_department.Where(d => d.FNumber == depNo).FirstOrDefault(); if (dep == null) { throw new Exception("部门不存在"); } if (isDirectCharge) { //直管 var ceoDep = GetNearestDep(depNo, "董事办公室"); if (ceoDep == null) { ceoDep = GetNearestDep(depNo, "总经理办公室"); //没有董事办公室,看有没有总经理办公室 } if (ceoDep == null) { throw new Exception("[董事办公室/总经理办公室]审核人未设置"); } var n0 = GetGivenDepAuditor(ceoDep, "请假"); n0.sys_no = sysNo; n0.step = step++; list.Add(n0); } else { //一级节点 var node = dep.ei_departmentAuditNode.Where(d => d.FProcessName == processName && !spNode.Contains(d.FAuditNodeName) && dep.FIsAuditNode == true).FirstOrDefault(); if (node != null) { var auditUser = node.ei_departmentAuditUser.Where(u => u.FBeginTime <= DateTime.Now && u.FEndTime >= DateTime.Now && (u.isDeleted == false || u.isDeleted == null)).ToList(); if (auditUser.Count() > 0) { flow_applyEntryQueue queue = new flow_applyEntryQueue(); queue.countersign = node.FIsCounterSign; queue.step_name = node.FAuditNodeName; queue.auditors = string.Join(";", auditUser.Select(u => u.FAuditorNumber).ToArray()); queue.step = step++; queue.sys_no = sysNo; list.Add(queue); } } //二级节点 if (dep.FParent != null) { dep = db.ei_department.Single(d => d.FNumber == dep.FParent); node = dep.ei_departmentAuditNode.Where(d => d.FProcessName == processName && !spNode.Contains(d.FAuditNodeName) && dep.FIsAuditNode == true).FirstOrDefault(); if (node != null) { var auditUser = node.ei_departmentAuditUser.Where(u => u.FBeginTime <= DateTime.Now && u.FEndTime >= DateTime.Now && (u.isDeleted == false || u.isDeleted == null)).ToList(); if (auditUser.Count() > 0) { flow_applyEntryQueue queue = new flow_applyEntryQueue(); queue.countersign = node.FIsCounterSign; queue.step_name = node.FAuditNodeName; queue.auditors = string.Join(";", auditUser.Select(u => u.FAuditorNumber).ToArray()); queue.step = step++; queue.sys_no = sysNo; if (list.Where(l => l.auditors == queue.auditors).Count() == 0) { list.Add(queue); } } } } } return(list); }