using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.Serialization;
using System.Xml.Serialization;
using NewLife;
using NewLife.Data;
using NewLife.Log;
using NewLife.Serialization;
using XCode;
using XCode.Cache;
using XCode.Membership;
namespace NewLife.WeChat.Entities;
/// <summary>微信模板消息配置。存储模板消息的配置信息</summary>
public partial class 微信模板消息配置 : Entity<微信模板消息配置>
{
#region 对象操作
static 微信模板消息配置()
{
// 过滤器
Meta.Modules.Add<TimeModule>();
Meta.Modules.Add<IPModule>();
// 单对象缓存
var sc = Meta.SingleCache;
sc.FindSlaveKeyMethod = k =>
{
var arr = k.Split(',');
if (arr.Length == 2)
return Find(_.AppId == arr[0] & _.TemplateId == arr[1]);
return null;
};
sc.GetSlaveKeyMethod = e => $"{e.AppId},{e.TemplateId}";
}
/// <summary>验证数据,通过抛出异常的方式提示验证失败。</summary>
/// <param name="isNew">是否插入</param>
public override void Valid(Boolean isNew)
{
// 如果没有脏数据,则不需要进行任何处理
if (!HasDirty) return;
// 建议先调用基类方法,基类方法会做一些统一处理
base.Valid(isNew);
// 在新插入数据或者修改了指定字段时进行修正
if (AppId.IsNullOrEmpty()) throw new ArgumentNullException(nameof(AppId), "AppId不能为空");
if (TemplateId.IsNullOrEmpty()) throw new ArgumentNullException(nameof(TemplateId), "模板ID不能为空");
// 默认启用
if (isNew && !Dirtys[nameof(IsEnabled)]) IsEnabled = true;
// 默认模板类型
if (isNew && TemplateType == 0) TemplateType = 1;
}
/// <summary>已重载。显示友好的名称</summary>
/// <returns></returns>
public override String ToString() => TemplateName.IsNullOrEmpty() ? TemplateId : TemplateName;
#endregion
#region 扩展属性
/// <summary>模板类型文本</summary>
[XmlIgnore, IgnoreDataMember]
public String TemplateTypeText => TemplateType switch
{
1 => "公众号模板消息",
2 => "小程序订阅消息",
_ => "未知"
};
/// <summary>字段配置对象</summary>
[XmlIgnore, IgnoreDataMember]
public IDictionary<String, String> FieldsObject
{
get => Fields.IsNullOrEmpty() ? new Dictionary<String, String>() : Fields.ToJsonEntity<IDictionary<String, String>>();
set => Fields = value?.ToJson();
}
/// <summary>字段说明对象</summary>
[XmlIgnore, IgnoreDataMember]
public IDictionary<String, String> FieldsDescObject
{
get => FieldsDesc.IsNullOrEmpty() ? new Dictionary<String, String>() : FieldsDesc.ToJsonEntity<IDictionary<String, String>>();
set => FieldsDesc = value?.ToJson();
}
#endregion
#region 扩展查询
/// <summary>根据编号查找</summary>
/// <param name="id">编号</param>
/// <returns>实体对象</returns>
public static 微信模板消息配置 FindById(Int32 id)
{
if (id <= 0) return null;
// 单对象缓存
return Meta.SingleCache[id];
}
/// <summary>根据AppId和TemplateId查找</summary>
/// <param name="appid">AppId</param>
/// <param name="templateid">模板ID</param>
/// <returns>实体对象</returns>
public static 微信模板消息配置 FindByTemplateId(String appid, String templateid)
{
if (appid.IsNullOrEmpty() || templateid.IsNullOrEmpty()) return null;
// 单对象缓存
return Meta.SingleCache.GetItemWithSlaveKey($"{appid},{templateid}") as 微信模板消息配置;
}
/// <summary>根据AppId查找所有模板</summary>
/// <param name="appid">AppId</param>
/// <param name="enabledOnly">仅查询启用的模板</param>
/// <returns>实体列表</returns>
public static IList<微信模板消息配置> FindAllByAppId(String appid, Boolean enabledOnly = false)
{
if (appid.IsNullOrEmpty()) return new List<微信模板消息配置>();
var exp = _.AppId == appid;
if (enabledOnly) exp &= _.IsEnabled == true;
return FindAll(exp);
}
/// <summary>查询所有启用的模板</summary>
/// <returns>实体列表</returns>
public static IList<微信模板消息配置> FindAllEnabled()
{
return FindAll(_.IsEnabled == true);
}
/// <summary>根据模板类型查找</summary>
/// <param name="templateType">模板类型</param>
/// <returns>实体列表</returns>
public static IList<微信模板消息配置> FindAllByType(Int32 templateType)
{
return FindAll(_.TemplateType == templateType);
}
#endregion
#region 高级查询
/// <summary>高级查询</summary>
/// <param name="appid">微信AppId</param>
/// <param name="templateid">模板消息编号</param>
/// <param name="templatename">模板名称</param>
/// <param name="templatetype">模板类型</param>
/// <param name="enabled">是否启用</param>
/// <param name="start">创建时间开始</param>
/// <param name="end">创建时间结束</param>
/// <param name="key">关键字</param>
/// <param name="page">分页参数信息。可携带统计和数据权限扩展查询等信息</param>
/// <returns>实体列表</returns>
public static IList<微信模板消息配置> Search(String appid, String templateid, String templatename, Int32? templatetype, Boolean? enabled, DateTime start, DateTime end, String key, PageParameter page)
{
var exp = new WhereExpression();
if (!appid.IsNullOrEmpty()) exp &= _.AppId == appid;
if (!templateid.IsNullOrEmpty()) exp &= _.TemplateId == templateid;
if (!templatename.IsNullOrEmpty()) exp &= _.TemplateName.Contains(templatename);
if (templatetype != null) exp &= _.TemplateType == templatetype;
if (enabled != null) exp &= _.IsEnabled == enabled;
exp &= _.CreateTime.Between(start, end);
if (!key.IsNullOrEmpty()) exp &= _.TemplateId.Contains(key) | _.TemplateName.Contains(key) | _.Remark.Contains(key);
return FindAll(exp, page);
}
#endregion
#region 业务操作
/// <summary>验证字段配置</summary>
/// <param name="data">要发送的数据</param>
/// <returns></returns>
public Boolean ValidateFields(Object data)
{
if (data == null) return false;
if (Fields.IsNullOrEmpty()) return true;
var fieldsConfig = FieldsObject;
if (fieldsConfig.Count == 0) return true;
// 简单验证:检查数据是否包含必要字段
var dataDict = data.ToDictionary();
foreach (var field in fieldsConfig.Keys)
{
if (!dataDict.ContainsKey(field))
{
WriteLog($"缺少必填字段: {field}");
return false;
}
}
return true;
}
#endregion
#region 日志
/// <summary>日志</summary>
public NewLife.Log.ILog Log { get; set; }
/// <summary>写日志</summary>
/// <param name="message">日志信息</param>
public void WriteLog(String message)
{
Log?.Info($"[{TemplateName}] {message}");
}
#endregion
}
/// <summary>微信模板消息配置接口</summary>
public partial interface I微信模板消息配置
{
#region 属性
/// <summary>编号</summary>
Int32 Id { get; set; }
/// <summary>微信AppId</summary>
String AppId { get; set; }
/// <summary>模板消息编号</summary>
String TemplateId { get; set; }
/// <summary>模板名称</summary>
String TemplateName { get; set; }
/// <summary>模板类型。1=公众号模板消息,2=小程序订阅消息</summary>
Int32 TemplateType { get; set; }
/// <summary>字段配置。JSON格式</summary>
String Fields { get; set; }
/// <summary>字段说明。JSON格式</summary>
String FieldsDesc { get; set; }
/// <summary>是否启用</summary>
Boolean IsEnabled { get; set; }
/// <summary>创建时间</summary>
DateTime CreateTime { get; set; }
/// <summary>更新时间</summary>
DateTime UpdateTime { get; set; }
/// <summary>备注</summary>
String Remark { get; set; }
#endregion
}
|