Beispiel #1
0
        /// <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);
                }
            }
        }
Beispiel #2
0
        /// <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 + "】审核人没有设置");
        }
Beispiel #3
0
        /// <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);
            }
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
        }