SharePoint自定义计时器例子

 

using System;
using System.Runtime.InteropServices;
using System.Security.Permissions;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;

namespace SP2013DzkqSys.Features.Feature1
{
    /// <summary>
    /// 此类用于处理在激活、停用、安装、卸载和升级功能的过程中引发的事件。
    /// </summary>
    /// <remarks>
    /// 附加到此类的 GUID 可能会在打包期间使用,不应进行修改。
    /// </remarks>

    [Guid("fcc7c199-c2a8-4272-80ca-0873d0907c55")]
    public class Feature1EventReceiver : SPFeatureReceiver
    {
        // 取消对以下方法的注释,以便处理激活某个功能后引发的事件。
        const string TimerJobName = "考勤系统累计时间计算分数";//SPJfkqSys
        public override void FeatureActivated(SPFeatureReceiverProperties properties)
        {
            SPSite site;
            if (properties.Feature.Parent is SPWeb)
            {
                site = ((SPWeb)properties.Feature.Parent).Site;
            }
            else
            {
                site = (SPSite)properties.Feature.Parent;

            }
            foreach (SPJobDefinition job in site.WebApplication.JobDefinitions)
            {
                if (job.Title == TimerJobName)
                {
                    job.Delete();
                }
            }

            CustomTimerJob UpdateTitle = new CustomTimerJob(TimerJobName, site.WebApplication);

            SPDailySchedule dailySchedule = new SPDailySchedule();
            dailySchedule.BeginHour = 22;
            dailySchedule.EndHour = 23;

            //SPMinuteSchedule minuteSchedule = new SPMinuteSchedule();
            //minuteSchedule.BeginSecond = 0;
            //minuteSchedule.EndSecond = 59;
            //minuteSchedule.Interval = 50;
            //UpdateTitle.Schedule = minuteSchedule;
            UpdateTitle.Schedule = dailySchedule;
            UpdateTitle.Update();
        }


        // 取消对以下方法的注释,以便处理在停用某个功能前引发的事件。

        public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
        {
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                SPSite site;
                if (properties.Feature.Parent is SPWeb)
                {
                    site = ((SPWeb)properties.Feature.Parent).Site;
                }
                else
                {
                    site = (SPSite)properties.Feature.Parent;
                }
                // SPSite site = properties.Feature.Parent as SPSite;
                foreach (SPJobDefinition job in site.WebApplication.JobDefinitions)
                {
                    if (job.Title == TimerJobName)
                    {
                        job.Delete();
                    }
                }
            });
        }


        // 取消对以下方法的注释,以便处理在安装某个功能后引发的事件。

        //public override void FeatureInstalled(SPFeatureReceiverProperties properties)
        //{
        //}


        // 取消对以下方法的注释,以便处理在卸载某个功能前引发的事件。

        public override void FeatureUninstalling(SPFeatureReceiverProperties properties)
        {
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                SPSite site;
                if (properties.Feature.Parent is SPWeb)
                {
                    site = ((SPWeb)properties.Feature.Parent).Site;
                }
                else
                {
                    site = (SPSite)properties.Feature.Parent;
                }
                foreach (SPJobDefinition job in site.WebApplication.JobDefinitions)
                {
                    if (job.Title == TimerJobName)
                    {
                        job.Delete();
                    }
                }
            });
        }
    }
}

 

using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SP2013DzkqSys
{
    public class CustomTimerJob : SPJobDefinition
    {
        public CustomTimerJob() : base() { }

        public CustomTimerJob(string TimerName, SPWebApplication webapp)
            : base(TimerName, webapp, null, SPJobLockType.ContentDatabase)
        {
            this.Title = "考勤系统累计时间计算分数";
        }
        protected override bool HasAdditionalUpdateAccess()
        {
            return true;
        }
        public override void Execute(Guid targetInstanceId)/*进馆阅览计分*/
        {
            SPWebApplication webapp = this.Parent as SPWebApplication;
            SPContentDatabase contentDB = webapp.ContentDatabases[targetInstanceId];
            try
            {
                using (SPSite site = contentDB.Sites[SpList.Other.strSiteName])
                {
                    using (SPWeb web = site.OpenWeb(SpList.Other.strWebUrl))
                    {
                        bool unsafeUpdates = web.AllowUnsafeUpdates;
                        web.AllowUnsafeUpdates = true;
                        //考勤表
                        SPList lstKq = Help.Instance.getSPList(web, SpList.Dzkq.strListStatistic);//web.Lists.Cast<SPList>().FirstOrDefault(k => k.RootFolder.Name.Equals(Info.strListStatistic));
                        if (lstKq == null)
                        {
                            web.AllowUnsafeUpdates = unsafeUpdates;
                            return;
                        }
                        UpdateLeftTime(lstKq);
                        //积分内部系统
                        SPList lstNbxtjfsyb = Help.Instance.getSPList(web, SpList.Nbxtjfsyb.strListNbxtjfsyb);
                        if (lstNbxtjfsyb == null)
                        {
                            return;
                        };
                        AddScore(web, lstNbxtjfsyb, lstKq);
                        web.AllowUnsafeUpdates = unsafeUpdates;
                    }
                }
            }
            catch (Exception ex)
            {
                Help.Instance.WriteEvent("考勤系统累计时间统计分数计时器", ex.Message, System.Diagnostics.EventLogEntryType.Error);
            }
        }
        public void AddScore(SPWeb web, SPList lstNbxtjfsyb, SPList lstKq)
        {
            SPQuery query = new SPQuery()//不等于活动考勤的记录
            {
                Query = "<Where><And>" +
                    "<And><Geq><FieldRef Name='" + SpList.Dzkq.strFieldStartTime + "'/><Value Type='DateTime'>" + DateTime.Now.Date.ToString(@"yyyy-MM-dd\THH:mm:ss\Z") + "</Value></Geq>" +
                    "<Eq><FieldRef Name='" + SpList.Dzkq.strFieldisExistUser + "'/><Value Type='Boolean'>1</Value></Eq>" +
                    "</And><Neq><FieldRef Name='" + SpList.Dzkq.strFieldKqlx + "'/><Value Type='Text'>" + SpList.Dzkq.strFieldValueCFkqlx2 + "</Value></Neq>" +
                    "</And></Where><OrderBy><FieldRef Name='" + SpList.Dzkq.strFieldJfkm + "' Ascending='TRUE'/></OrderBy>",
                ViewFields = "<FieldRef Name='" + SpList.Dzkq.strFieldTitle + "'/><FieldRef Name='" + SpList.Dzkq.strFieldStartTime + "'/>" +
                    "<FieldRef Name='" + SpList.Dzkq.strFieldEndTime + "'/><FieldRef Name='" + SpList.Dzkq.strFieldJfkm + "'/><FieldRef Name='" + SpList.Dzkq.strFieldLocation + "'/>"

            };
            SPListItemCollection cols = lstKq.GetItems(query);
            //第一种方式:遍历积分科目表的科目;第二种方式:计算当天考勤所用到的科目
            var jfkmInfos = from a in cols.Cast<SPListItem>() group a by a[SpList.Dzkq.strFieldJfkm] into b select new { jfkeName = b.Key };
            foreach (var jfkmInfo in jfkmInfos)
            {
                SPListItem itemJfkm = JfkmListItem(web, cols, jfkmInfo.jfkeName.ToString());
                //规则类型  是否为 按累计时间 计分
                if (itemJfkm == null || SpList.Jfkmb.strCount.Equals(itemJfkm[SpList.Jfkmb.strFieldRuleType].ToString()))
                {
                    continue;
                }
                //筛选当天数据,并且存在该用户,并且积分科目的类型为“按累计时间计算”;根据用户名分组,计算该用户名当天累计时常(离馆时间+进场时间)
                //返回匿名类型 {用户名 累计时间}
                int hours = 1;//累计时间
                int hoursPre;//管理员可设置每小时,还是每两小时。。。
                hoursPre = int.TryParse(itemJfkm[SpList.Jfkmb.strFieldTime] + "", out hoursPre) == true ? hoursPre : 1;
                int jfNum = int.TryParse(itemJfkm[SpList.Jfkmb.strFieldJfNum] + "", out jfNum) == true ? jfNum : 0;
                if (SpList.Jfkmb.strTotalTime.Equals(itemJfkm[SpList.Jfkmb.strFieldRuleType].ToString()))
                {
                    var resultUsersKq = (from r in cols.Cast<SPListItem>()
                                         where (r[SpList.Dzkq.strFieldJfkm] + "").Equals(jfkmInfo.jfkeName)
                                         group r by r[SpList.Dzkq.strFieldTitle] into kq
                                         select new { userName = kq.Key, time = kq.Sum(k => Convert.ToDateTime(k[SpList.Dzkq.strFieldEndTime]).Subtract(Convert.ToDateTime(k[SpList.Dzkq.strFieldStartTime])).TotalHours) }).ToList();
                    foreach (var user in resultUsersKq)//遍历每个用户
                    {
                        hours = (int)user.time;//2小时30分,算2小时
                        hours = hours > 1 ? hours : 1;// 不足1小时以1小时计分。
                        Help.Instance.AddScore(web, lstNbxtjfsyb, user.userName.ToString(), itemJfkm, hours / hoursPre * jfNum);
                    }
                }
                if (SpList.Jfkmb.strTimeQuantum.Equals(itemJfkm[SpList.Jfkmb.strFieldRuleType].ToString()))
                {
                    //按时间段,不分组
                    var resultUsersKq = (from r in cols.Cast<SPListItem>()
                                         where (r[SpList.Dzkq.strFieldJfkm] + "").Equals(jfkmInfo.jfkeName)
                                         select new { userName = r[SpList.Dzkq.strFieldTitle], time = Convert.ToDateTime(r[SpList.Dzkq.strFieldEndTime]).Subtract(Convert.ToDateTime(r[SpList.Dzkq.strFieldStartTime])).TotalHours }).ToList();
                    foreach (var user in resultUsersKq)//遍历每个用户
                    {
                        hours = (int)user.time;//2小时30分,算2小时
                        hours = hours > 1 ? hours : 1;// 不足1小时以1小时计分。
                        Help.Instance.AddScore(web, lstNbxtjfsyb, user.userName.ToString(), itemJfkm, hours / hoursPre * jfNum);
                    }
                }

            }

        }
        /// <summary>
        /// 根据积分科目 查询积分科目表 的数据行
        /// </summary>
        /// <param name="web"></param>
        /// <param name="cols"></param>
        /// <param name="jfkm"></param>
        /// <returns></returns>
        public SPListItem JfkmListItem(SPWeb web, SPListItemCollection cols, string jfkm)
        {
            SPListItem itemJfkm = null;
            try
            {
                itemJfkm = Help.Instance.GetListItem(web, SpList.Jfkmb.strListJfkmb, SpList.Jfkmb.strFieldTitle, jfkm);
                //积分科目名当前项 
                if (itemJfkm == null)//考勤表的“积分科目”只是为了便于分组统计,并不是查阅项字段,一旦管理员改了积分科目名称,可能就无法给读者积分了
                {
                    //按场室查询积分科目
                    var place = cols.Cast<SPListItem>().Select(r => r[SpList.Dzkq.strFieldLocation]).FirstOrDefault();
                    var jfkm2 = Help.Instance.GetJfkmName(web, SpList.Place.strListLibrary, SpList.Place.strFieldTitle, place.ToString(), SpList.Place.strFieldJfkm);
                    itemJfkm = Help.Instance.GetListItem(web, SpList.Jfkmb.strListJfkmb, SpList.Jfkmb.strFieldTitle, jfkm2.ToString());
                }

            }
            catch (Exception ex)
            {
                Help.Instance.WriteEvent("考勤系统自定义计时器,查询积分科目时出错isAddScore()", ex.Message, System.Diagnostics.EventLogEntryType.Error);
            }
            return itemJfkm;
        }
        /// <summary>
        /// 更新离馆时间
        /// </summary>
        /// <param name="lstKq"></param>
        public void UpdateLeftTime(SPList lstKq)
        {
            try
            {
                //查询当天的读者考勤并且离馆时间为空
                var itemCollectionKq = (from l in lstKq.Items.Cast<SPListItem>() where Convert.ToDateTime(l[SpList.Dzkq.strFieldStartTime]).Date.Equals(DateTime.Now.Date) && l[SpList.Dzkq.strFieldEndTime] == null select l);
                foreach (var item in itemCollectionKq)
                {
                    item[SpList.Dzkq.strFieldEndTime] = Convert.ToDateTime(item[SpList.Dzkq.strFieldStartTime]).AddHours(0.5);
                    item.Update();
                }
            }
            catch (Exception ex)
            {
                Help.Instance.WriteEvent("考勤系统自定义计时器,更像离馆时间异常", ex.Message, System.Diagnostics.EventLogEntryType.Error);
            }

        }

    }
}

 

posted on 2015-09-04 22:35  !无名之辈  阅读(201)  评论(0)    收藏  举报