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);
}
}
}
}