AntJob/AntJob.Data/Entity/应用消息.Biz.cs

148 lines
4.7 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Xml.Serialization;
using NewLife;
using NewLife.Data;
using XCode;
using XCode.Membership;
namespace AntJob.Data.Entity
{
/// <summary>应用消息。消息调度,某些作业负责生产消息,供其它作业进行消费处理</summary>
public partial class AppMessage : EntityBase<AppMessage>
{
#region
static AppMessage()
{
// 过滤器 UserModule、TimeModule、IPModule
Meta.Modules.Add<TimeModule>();
}
#endregion
#region
/// <summary>应用</summary>
[XmlIgnore]
//[ScriptIgnore]
public App App => Extends.Get(nameof(App), k => App.FindByID(AppID));
/// <summary>应用</summary>
[XmlIgnore]
//[ScriptIgnore]
[DisplayName("应用")]
[Map(__.AppID)]
public String AppName => App?.Name;
/// <summary>作业</summary>
[XmlIgnore]
//[ScriptIgnore]
public Job Job => Extends.Get(nameof(Job), k => Job.FindByID(JobID));
/// <summary>作业</summary>
[XmlIgnore]
//[ScriptIgnore]
[DisplayName("作业")]
[Map(__.JobID)]
public String JobName => Job?.Name;
#endregion
#region
/// <summary>根据编号查找</summary>
/// <param name="id">编号</param>
/// <returns>实体对象</returns>
public static AppMessage FindByID(Int64 id)
{
if (id <= 0) return null;
return Find(_.ID == id);
}
/// <summary>
/// 查询当前应用的消息数
/// </summary>
/// <param name="appid"></param>
/// <returns></returns>
public static Int32 FindCountByAppID(Int32 appid)
{
if (appid == 0) return 0;
return (Int32)FindCount(_.AppID == appid);
}
/// <summary>
/// 查询当前作业的消息数
/// </summary>
/// <param name="appid"></param>
/// <param name="topic"></param>
/// <returns></returns>
public static Int32 FindCountByAppIDAndTopic(Int32 appid, String topic)
{
if (appid == 0) return 0;
return (Int32)FindCount(_.AppID == appid & _.Topic == topic);
}
#endregion
#region
/// <summary>高级查询</summary>
/// <param name="appid"></param>
/// <param name="jobid"></param>
/// <param name="start"></param>
/// <param name="end"></param>
/// <param name="key"></param>
/// <param name="p"></param>
/// <returns></returns>
public static IEnumerable<AppMessage> Search(Int32 appid, Int32 jobid, DateTime start, DateTime end, String key, PageParameter p)
{
var exp = new WhereExpression();
if (appid > 0) exp &= _.AppID == appid;
if (jobid > 0) exp &= _.JobID == jobid;
if (!key.IsNullOrEmpty()) exp &= _.Topic.Contains(key) | _.Data.Contains(key);
exp &= _.UpdateTime.Between(start, end);
return FindAll(exp, p);
}
#endregion
#region
/// <summary>根据应用、主题、以及时间查找一定数量消息</summary>
/// <param name="appid"></param>
/// <param name="topic"></param>
/// <param name="endTime"></param>
/// <param name="count"></param>
/// <returns></returns>
public static IList<AppMessage> GetTopic(Int32 appid, String topic, DateTime endTime, Int32 count)
{
return FindAll(_.AppID == appid & _.Topic == topic & _.UpdateTime <= endTime, _.UpdateTime.Asc(), null, 0, count);
}
/// <summary>去重过滤</summary>
/// <param name="appid"></param>
/// <param name="topic"></param>
/// <param name="messages"></param>
/// <returns></returns>
public static String[] Filter(Int32 appid, String topic, String[] messages)
{
var list = new List<String>();
// 分批核查是否存在
for (var i = 0; i < messages.Length; i += 100)
{
var batch = messages.Skip(i).Take(100).ToList();
var ms = FindAll(_.AppID == appid & _.Topic == topic & _.Data.In(batch));
// 去掉找到的项
foreach (var item in ms)
{
batch.Remove(item.Data);
}
// 剩下的加入结果
if (batch.Count > 0) list.AddRange(batch);
}
return list.ToArray();
}
#endregion
}
}