增加初始化类文件
xiyunfei authored at 2026-02-27 00:31:51
8.35 KiB
NewLife.WeChat
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
}