增加初始化类文件
xiyunfei authored at 2026-02-27 00:31:51
5.67 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 XCode;
using XCode.Cache;
using XCode.Membership;

namespace NewLife.WeChat.Entities;

/// <summary>微信用户。存储微信用户的OpenId、UnionId基本信息</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] & _.OpenId == arr[1]);
            return null;
        };
        sc.GetSlaveKeyMethod = e => $"{e.AppId},{e.OpenId}";
    }

    /// <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 (OpenId.IsNullOrEmpty()) throw new ArgumentNullException(nameof(OpenId), "OpenId不能为空");
    }

    /// <summary>已重载。显示友好的名称</summary>
    /// <returns></returns>
    public override String ToString() => OpenId;
    #endregion

    #region 扩展属性
    #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和OpenId查找</summary>
    /// <param name="appid">AppId</param>
    /// <param name="openid">OpenId</param>
    /// <returns>实体对象</returns>
    public static 微信用户 FindByOpenId(String appid, String openid)
    {
        if (appid.IsNullOrEmpty() || openid.IsNullOrEmpty()) return null;

        // 单对象缓存
        return Meta.SingleCache.GetItemWithSlaveKey($"{appid},{openid}") as 微信用户;
    }

    /// <summary>根据UnionId查找所有用户</summary>
    /// <param name="unionid">UnionId</param>
    /// <returns>实体列表</returns>
    public static IList<微信用户> FindAllByUnionId(String unionid)
    {
        if (unionid.IsNullOrEmpty()) return new List<微信用户>();

        return FindAll(_.UnionId == unionid);
    }

    /// <summary>根据AppId查找所有用户</summary>
    /// <param name="appid">AppId</param>
    /// <returns>实体列表</returns>
    public static IList<微信用户> FindAllByAppId(String appid)
    {
        if (appid.IsNullOrEmpty()) return new List<微信用户>();

        return FindAll(_.AppId == appid);
    }
    #endregion

    #region 高级查询
    /// <summary>高级查询</summary>
    /// <param name="appid">微信AppId</param>
    /// <param name="openid">用户OpenId</param>
    /// <param name="unionid">用户UnionId</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 openid, String unionid, DateTime start, DateTime end, String key, PageParameter page)
    {
        var exp = new WhereExpression();

        if (!appid.IsNullOrEmpty()) exp &= _.AppId == appid;
        if (!openid.IsNullOrEmpty()) exp &= _.OpenId == openid;
        if (!unionid.IsNullOrEmpty()) exp &= _.UnionId == unionid;
        exp &= _.CreateTime.Between(start, end);
        if (!key.IsNullOrEmpty()) exp &= _.OpenId.Contains(key) | _.UnionId.Contains(key) | _.Remark.Contains(key);

        return FindAll(exp, page);
    }
    #endregion

    #region 业务操作
    /// <summary>同步用户信息(从微信API获取后更新)</summary>
    /// <param name="appid">AppId</param>
    /// <param name="openid">OpenId</param>
    /// <param name="unionid">UnionId</param>
    /// <returns></returns>
    public static 微信用户 Sync(String appid, String openid, String unionid = null)
    {
        var user = FindByOpenId(appid, openid) ?? new 微信用户
        {
            AppId = appid,
            OpenId = openid
        };

        // æ›´æ–° UnionId
        if (!unionid.IsNullOrEmpty())
            user.UnionId = unionid;

        user.Save();

        return user;
    }
    #endregion
}

/// <summary>微信用户接口</summary>
public partial interface I微信用户
{
    #region 属性
    /// <summary>编号</summary>
    Int32 Id { get; set; }

    /// <summary>微信AppId</summary>
    String AppId { get; set; }

    /// <summary>用户OpenId</summary>
    String OpenId { get; set; }

    /// <summary>用户UnionId。同一微信开放平台下的不同应用,用户的UnionId是相同的</summary>
    String UnionId { get; set; }

    /// <summary>创建时间</summary>
    DateTime CreateTime { get; set; }

    /// <summary>æ›´æ–°æ—¶é—´</summary>
    DateTime UpdateTime { get; set; }

    /// <summary>备注</summary>
    String Remark { get; set; }
    #endregion
}