sunpengfei
2025-12-01 6396dac27ca99e84a2e3c772fb079bceddf67ff8
feat:开发
6个文件已修改
3个文件已添加
1338 ■■■■■ 已修改文件
ApiTools.Application/WxUtils/Commands/WxmpSubscribMessageCommandHandler.cs 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Core/ApiTools.Core.xml 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Core/Entities/LogRecords/WxmpSubscribMessageLog.cs 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Core/Models/WxmpUtils/Commands/WxmpSubscribMessageNotifyCommand.cs 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Database.Migrations/Migrations/20251201101428_CreateWxmpSubscribMessageLog.Designer.cs 1054 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Database.Migrations/Migrations/20251201101428_CreateWxmpSubscribMessageLog.cs 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Database.Migrations/REDEME.MD 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Web.Entry/Controllers/WxmpController.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Application/WxUtils/Commands/WxmpSubscribMessageCommandHandler.cs
@@ -1,6 +1,8 @@
using Aop.Api.Domain;
using ApiTools.Core;
using ApiTools.Core.Entities.LogRecords;
using Furion;
using Furion.DatabaseAccessor;
using Furion.HttpRemote;
using log4net.Core;
using MediatR;
@@ -15,13 +17,15 @@
namespace ApiTools.Application
{
    public class WxmpSubscribMessageCommandHandler(
            IRepository<WxmpSubscribMessageLog> repWxmpSubscribMessageLog,
            ILogger<WxmpSubscribMessageCommandHandler> logger,
            WxmpUtils utils,
            IHttpRemoteService httpRemoteService
        ) :
        IRequestHandler<SendWxmpSubscribMessageCommand, Guid>,
        IRequestHandler<WxmpSubscribMessageNotifyCommand, bool>
        IRequestHandler<WxmpSubscribMessageNotifyCommand, Guid>
    {
        private readonly IRepository<WxmpSubscribMessageLog> repWxmpSubscribMessageLog = repWxmpSubscribMessageLog;
        private readonly ILogger<WxmpSubscribMessageCommandHandler> logger = logger;
        private readonly WxmpUtils utils = utils;
        private readonly IHttpRemoteService httpRemoteService = httpRemoteService;
@@ -42,7 +46,17 @@
                WxmpCode = request.WxmpCode,
                Touser = request.Touser,
            });
            return Guid.Empty;
            var log = new WxmpSubscribMessageLog
            {
                Code = request.WxmpCode,
                OpenId = request.Touser,
                SubscribeStatusString = "send",
                TemplateId = request.TemplateId,
                Page = request.Page,
                Data = request.Data.ToJson()
            };
            await repWxmpSubscribMessageLog.InsertNowAsync(log);
            return log.Id;
        }
        /// <summary>
@@ -51,7 +65,7 @@
        /// <param name="request"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public async Task<bool> Handle(WxmpSubscribMessageNotifyCommand request, CancellationToken cancellationToken)
        public async Task<Guid> Handle(WxmpSubscribMessageNotifyCommand request, CancellationToken cancellationToken)
        {
            var env = App.GetConfig<string>("Environment");
            if (env == "Product")
@@ -67,7 +81,17 @@
                }
            }
            return true;
            var log = new WxmpSubscribMessageLog
            {
                Code = request.Code,
                OpenId = request.OpenId,
                PopupScene = request.Content.PopupScene,
                SubscribeStatusString = request.Content.SubscribeStatusString,
                TemplateId = request.Content.TemplateId
            };
            await repWxmpSubscribMessageLog.InsertNowAsync(log);
            return log.Id;
        }
    }
}
ApiTools.Core/ApiTools.Core.xml
@@ -249,6 +249,46 @@
            耗时毫秒数
            </summary>
        </member>
        <member name="T:ApiTools.Core.Entities.LogRecords.WxmpSubscribMessageLog">
            <summary>
            微信订阅消息日志
            </summary>
        </member>
        <member name="P:ApiTools.Core.Entities.LogRecords.WxmpSubscribMessageLog.Code">
            <summary>
            小程序代码
            </summary>
        </member>
        <member name="P:ApiTools.Core.Entities.LogRecords.WxmpSubscribMessageLog.OpenId">
            <summary>
            用户开放Id
            </summary>
        </member>
        <member name="P:ApiTools.Core.Entities.LogRecords.WxmpSubscribMessageLog.PopupScene">
            <summary>
            场景
            </summary>
        </member>
        <member name="P:ApiTools.Core.Entities.LogRecords.WxmpSubscribMessageLog.SubscribeStatusString">
            <summary>
            状态
            </summary>
        </member>
        <member name="P:ApiTools.Core.Entities.LogRecords.WxmpSubscribMessageLog.TemplateId">
            <summary>
            模板Id
            </summary>
        </member>
        <member name="P:ApiTools.Core.Entities.LogRecords.WxmpSubscribMessageLog.Page">
            <summary>
            点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转
            </summary>
        </member>
        <member name="P:ApiTools.Core.Entities.LogRecords.WxmpSubscribMessageLog.Data">
            <summary>
            模板内容,格式形如{ "phrase3": { "value": "审核通过" }, "name1": { "value": "订阅" }, "date2": { "value": "2019-12-25 09:42" } }
            </summary>
        </member>
        <member name="T:ApiTools.Core.ScheduleJobTriggerTimeline">
            <summary>
            定时任务-作业触发器运行记录
@@ -3333,6 +3373,16 @@
            用户开放Id
            </summary>
        </member>
        <member name="P:ApiTools.Core.WxmpSubscribMessageNotifyCommand.ToUserName">
            <summary>
            接收人
            </summary>
        </member>
        <member name="P:ApiTools.Core.WxmpSubscribMessageNotifyCommand.FromUserName">
            <summary>
            发送人
            </summary>
        </member>
        <member name="P:ApiTools.Core.WxmpSubscribMessageNotifyCommand.CreateTime">
            <summary>
            创建时间
@@ -3353,6 +3403,21 @@
            内容
            </summary>
        </member>
        <member name="P:ApiTools.Core.WxmpSubscribMessageNotifyCommandContent.PopupScene">
            <summary>
            场景
            </summary>
        </member>
        <member name="P:ApiTools.Core.WxmpSubscribMessageNotifyCommandContent.SubscribeStatusString">
            <summary>
            状态
            </summary>
        </member>
        <member name="P:ApiTools.Core.WxmpSubscribMessageNotifyCommandContent.TemplateId">
            <summary>
            模板Id
            </summary>
        </member>
        <member name="P:ApiTools.Core.WxmpSubscribMessageNotifyRequestQuery.signature">
            <summary>
            签名
ApiTools.Core/Entities/LogRecords/WxmpSubscribMessageLog.cs
New file
@@ -0,0 +1,51 @@
using Furion.DatabaseAccessor;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ApiTools.Core.Entities.LogRecords
{
    /// <summary>
    /// 微信订阅消息日志
    /// </summary>
    public class WxmpSubscribMessageLog : CommonEntity<MasterDbContextLocator>, IDbAuditLogIgnore
    {
        /// <summary>
        /// 小程序代码
        /// </summary>
        public string Code { get; set; }
        /// <summary>
        /// 用户开放Id
        /// </summary>
        public string OpenId { get; set; }
        /// <summary>
        /// 场景
        /// </summary>
        public string PopupScene { get; set; }
        /// <summary>
        /// 状态
        /// </summary>
        public string SubscribeStatusString { get; set; }
        /// <summary>
        /// 模板Id
        /// </summary>
        public string TemplateId { get; set; }
        /// <summary>
        /// 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转
        /// </summary>
        public string Page { get; set; }
        /// <summary>
        /// 模板内容,格式形如{ "phrase3": { "value": "审核通过" }, "name1": { "value": "订阅" }, "date2": { "value": "2019-12-25 09:42" } }
        /// </summary>
        public string Data { get; set; }
    }
}
ApiTools.Core/Models/WxmpUtils/Commands/WxmpSubscribMessageNotifyCommand.cs
@@ -12,7 +12,7 @@
    /// 微信小程序订阅消息通知
    /// </summary>
    [Resource([EnumResourceController.CommonServerWxmpUtils], AllowAnonymous = true)]
    public class WxmpSubscribMessageNotifyCommand : IRequest<bool>
    public class WxmpSubscribMessageNotifyCommand : IRequest<Guid>
    {
        /// <summary>
        /// 小程序代码
@@ -22,7 +22,13 @@
        /// 用户开放Id
        /// </summary>
        public string OpenId { get; set; }
        /// <summary>
        /// 接收人
        /// </summary>
        public string ToUserName { get; set; }
        /// <summary>
        /// 发送人
        /// </summary>
        public string FromUserName { get; set; }
        /// <summary>
        /// 创建时间
@@ -39,7 +45,23 @@
        /// <summary>
        /// 内容
        /// </summary>
        [JsonProperty("debug_str")]
        public string Content { get; set; }
        [JsonProperty("List")]
        public WxmpSubscribMessageNotifyCommandContent Content { get; set; }
    }
    public class WxmpSubscribMessageNotifyCommandContent
    {
        /// <summary>
        /// 场景
        /// </summary>
        public string PopupScene { get; set; }
        /// <summary>
        /// 状态
        /// </summary>
        public string SubscribeStatusString { get; set; }
        /// <summary>
        /// 模板Id
        /// </summary>
        public string TemplateId { get; set; }
    }
}
ApiTools.Database.Migrations/Migrations/20251201101428_CreateWxmpSubscribMessageLog.Designer.cs
New file
@@ -0,0 +1,1054 @@
// <auto-generated />
using System;
using ApiTools.EntityFramework.Core;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace ApiTools.Database.Migrations.Migrations
{
    [DbContext(typeof(DefaultDbContext))]
    [Migration("20251201101428_CreateWxmpSubscribMessageLog")]
    partial class CreateWxmpSubscribMessageLog
    {
        /// <inheritdoc />
        protected override void BuildTargetModel(ModelBuilder modelBuilder)
        {
#pragma warning disable 612, 618
            modelBuilder
                .HasAnnotation("ProductVersion", "9.0.2")
                .HasAnnotation("Relational:MaxIdentifierLength", 128);
            SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
            modelBuilder.Entity("ApiTools.Core.Channel", b =>
                {
                    b.Property<Guid>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("uniqueidentifier");
                    b.Property<string>("Code")
                        .HasColumnType("nvarchar(max)");
                    b.Property<Guid?>("CreatedChannelId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<DateTimeOffset>("CreatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("CreatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<bool>("IsDeleted")
                        .HasColumnType("bit");
                    b.Property<bool>("IsDisabled")
                        .HasColumnType("bit");
                    b.Property<string>("Name")
                        .HasColumnType("nvarchar(max)");
                    b.Property<int>("Sort")
                        .HasColumnType("int");
                    b.Property<string>("TraceId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<DateTimeOffset?>("UpdatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("UpdatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.HasKey("Id");
                    b.ToTable("Channel");
                });
            modelBuilder.Entity("ApiTools.Core.ChannelWallet", b =>
                {
                    b.Property<Guid>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("uniqueidentifier");
                    b.Property<int>("Access")
                        .HasColumnType("int");
                    b.Property<decimal>("Balance")
                        .HasColumnType("decimal(18,2)");
                    b.Property<string>("Bank")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("BankBranch")
                        .HasColumnType("nvarchar(max)");
                    b.Property<Guid?>("ChannelId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<string>("Code")
                        .HasColumnType("nvarchar(max)");
                    b.Property<Guid?>("CreatedChannelId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<DateTimeOffset>("CreatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("CreatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<string>("ErrorCode")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("FailReason")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("Identity")
                        .HasColumnType("nvarchar(max)");
                    b.Property<bool>("IsDeleted")
                        .HasColumnType("bit");
                    b.Property<string>("Name")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("OutWalletId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<int>("SignStatus")
                        .HasColumnType("int");
                    b.Property<int>("Sort")
                        .HasColumnType("int");
                    b.Property<string>("TraceId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<DateTimeOffset?>("UpdatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("UpdatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.HasKey("Id");
                    b.HasIndex("ChannelId");
                    b.ToTable("ChannelWallet");
                });
            modelBuilder.Entity("ApiTools.Core.ChannelWalletTransaction", b =>
                {
                    b.Property<Guid>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("uniqueidentifier");
                    b.Property<decimal>("AfterBalance")
                        .HasColumnType("decimal(18,2)");
                    b.Property<decimal>("Amount")
                        .HasColumnType("decimal(18,2)");
                    b.Property<decimal>("Balance")
                        .HasColumnType("decimal(18,2)");
                    b.Property<string>("Code")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("ConcurrencyLock")
                        .HasColumnType("nvarchar(450)");
                    b.Property<Guid?>("CreatedChannelId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<DateTimeOffset>("CreatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("CreatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<string>("Currency")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("EreceiptDownloadOssUrl")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("EreceiptDownloadUrl")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("EreceiptErrorMessage")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("EreceiptFileId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<int?>("EreceiptStatus")
                        .HasColumnType("int");
                    b.Property<string>("ErrorCode")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("FailReason")
                        .HasColumnType("nvarchar(max)");
                    b.Property<bool>("IsDeleted")
                        .HasColumnType("bit");
                    b.Property<DateTime?>("OperatorTime")
                        .HasColumnType("datetime2");
                    b.Property<decimal?>("OrderFee")
                        .HasColumnType("decimal(18,2)");
                    b.Property<string>("OutCode")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("OutOperatorId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("OutReceiveId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("PayerAccount")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("PayerBank")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("PayerBankBranch")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("PayerName")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("Purpose")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("ReceiveAccount")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("ReceiveBank")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("ReceiveBankBranch")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("ReceiveIdentity")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("ReceiveName")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("Remark")
                        .HasColumnType("nvarchar(max)");
                    b.Property<int>("Sort")
                        .HasColumnType("int");
                    b.Property<string>("TraceId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<DateTime?>("TransDate")
                        .HasColumnType("datetime2");
                    b.Property<int>("TransactionStatus")
                        .HasColumnType("int");
                    b.Property<int>("Type")
                        .HasColumnType("int");
                    b.Property<DateTimeOffset?>("UpdatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("UpdatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<Guid>("WalletId")
                        .HasColumnType("uniqueidentifier");
                    b.HasKey("Id");
                    b.HasIndex("ConcurrencyLock")
                        .IsUnique()
                        .HasFilter("[ConcurrencyLock] IS NOT NULL");
                    b.HasIndex("WalletId");
                    b.ToTable("ChannelWalletTransaction");
                });
            modelBuilder.Entity("ApiTools.Core.ChannelWalletTransactionPingAnPay", b =>
                {
                    b.Property<Guid>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("uniqueidentifier");
                    b.Property<string>("AccountDate")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("BackRem")
                        .HasColumnType("nvarchar(max)");
                    b.Property<Guid?>("CreatedChannelId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<DateTimeOffset>("CreatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("CreatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<string>("CstInnerFlowNo")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("Fee")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("FreezeNo")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("FrontLogNo")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("HostErrorCode")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("HostFlowNo")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("IsBack")
                        .HasColumnType("nvarchar(max)");
                    b.Property<bool>("IsDeleted")
                        .HasColumnType("bit");
                    b.Property<string>("ProxyPayAcc")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("ProxyPayBankName")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("ProxyPayName")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("RemoveStopFailReason")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("RemoveStopStt")
                        .HasColumnType("nvarchar(max)");
                    b.Property<int>("Sort")
                        .HasColumnType("int");
                    b.Property<string>("StopFailReason")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("StopStt")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("SubmitTime")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("SysFlag")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("ThirdVoucher")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("TraceId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("TransBsn")
                        .HasColumnType("nvarchar(max)");
                    b.Property<DateTimeOffset?>("UpdatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("UpdatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<string>("Yhcljg")
                        .HasColumnType("nvarchar(max)");
                    b.HasKey("Id");
                    b.ToTable("ChannelWalletTransactionPingAnPay");
                });
            modelBuilder.Entity("ApiTools.Core.Entities.LogRecords.WxmpSubscribMessageLog", b =>
                {
                    b.Property<Guid>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("uniqueidentifier");
                    b.Property<string>("Code")
                        .HasColumnType("nvarchar(max)");
                    b.Property<Guid?>("CreatedChannelId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<DateTimeOffset>("CreatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("CreatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<string>("Data")
                        .HasColumnType("nvarchar(max)");
                    b.Property<bool>("IsDeleted")
                        .HasColumnType("bit");
                    b.Property<string>("OpenId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("Page")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("PopupScene")
                        .HasColumnType("nvarchar(max)");
                    b.Property<int>("Sort")
                        .HasColumnType("int");
                    b.Property<string>("SubscribeStatusString")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("TemplateId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("TraceId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<DateTimeOffset?>("UpdatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("UpdatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.HasKey("Id");
                    b.ToTable("WxmpSubscribMessageLog");
                });
            modelBuilder.Entity("ApiTools.Core.Resource", b =>
                {
                    b.Property<Guid>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("uniqueidentifier");
                    b.Property<string>("ActionName")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("ActionSummary")
                        .HasColumnType("nvarchar(max)");
                    b.Property<bool>("AllowAnonymous")
                        .HasColumnType("bit");
                    b.Property<string>("ApplicationName")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("Code")
                        .IsRequired()
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("ControllerName")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("ControllerSummary")
                        .HasColumnType("nvarchar(max)");
                    b.Property<Guid?>("CreatedChannelId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<DateTimeOffset>("CreatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("CreatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<bool>("CustomResponse")
                        .HasColumnType("bit");
                    b.Property<string>("DynamicAssemblyName")
                        .HasColumnType("nvarchar(max)");
                    b.Property<bool>("FileUpload")
                        .HasColumnType("bit");
                    b.Property<bool>("IsDeleted")
                        .HasColumnType("bit");
                    b.Property<bool>("IsExpired")
                        .HasColumnType("bit");
                    b.Property<bool>("IsFromForm")
                        .HasColumnType("bit");
                    b.Property<int>("Method")
                        .HasColumnType("int");
                    b.Property<string>("Name")
                        .IsRequired()
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("RequestTypeFullName")
                        .IsRequired()
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("RequestTypeName")
                        .IsRequired()
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("ResponseTypeFullName")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("ResponseTypeName")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("Route")
                        .IsRequired()
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("RouteArea")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("ServiceName")
                        .HasColumnType("nvarchar(max)");
                    b.Property<int>("Sort")
                        .HasColumnType("int");
                    b.Property<string>("TraceId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<DateTimeOffset?>("UpdatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("UpdatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.HasKey("Id");
                    b.ToTable("Resource");
                });
            modelBuilder.Entity("ApiTools.Core.ScheduleJobDetail", b =>
                {
                    b.Property<Guid>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("uniqueidentifier");
                    b.Property<string>("AssemblyName")
                        .HasColumnType("nvarchar(max)");
                    b.Property<bool>("Concurrent")
                        .HasColumnType("bit");
                    b.Property<Guid?>("CreatedChannelId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<DateTimeOffset>("CreatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("CreatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<string>("Description")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("GroupName")
                        .HasColumnType("nvarchar(max)");
                    b.Property<bool>("IncludeAnnotations")
                        .HasColumnType("bit");
                    b.Property<bool>("IsDeleted")
                        .HasColumnType("bit");
                    b.Property<string>("JobId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("JobType")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("Properties")
                        .HasColumnType("nvarchar(max)");
                    b.Property<int>("Sort")
                        .HasColumnType("int");
                    b.Property<string>("TraceId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<DateTimeOffset?>("UpdatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("UpdatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.HasKey("Id");
                    b.ToTable("ScheduleJobDetail");
                });
            modelBuilder.Entity("ApiTools.Core.ScheduleJobTrigger", b =>
                {
                    b.Property<Guid>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("uniqueidentifier");
                    b.Property<string>("Args")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("AssemblyName")
                        .HasColumnType("nvarchar(max)");
                    b.Property<Guid?>("CreatedChannelId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<DateTimeOffset>("CreatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("CreatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<string>("Description")
                        .HasColumnType("nvarchar(max)");
                    b.Property<long>("ElapsedTime")
                        .HasColumnType("bigint");
                    b.Property<DateTime?>("EndTime")
                        .HasColumnType("datetime2");
                    b.Property<bool>("IsDeleted")
                        .HasColumnType("bit");
                    b.Property<string>("JobId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<DateTime?>("LastRunTime")
                        .HasColumnType("datetime2");
                    b.Property<long>("MaxNumberOfErrors")
                        .HasColumnType("bigint");
                    b.Property<long>("MaxNumberOfRuns")
                        .HasColumnType("bigint");
                    b.Property<DateTime?>("NextRunTime")
                        .HasColumnType("datetime2");
                    b.Property<long>("NumRetries")
                        .HasColumnType("bigint");
                    b.Property<long>("NumberOfErrors")
                        .HasColumnType("bigint");
                    b.Property<long>("NumberOfRuns")
                        .HasColumnType("bigint");
                    b.Property<bool>("ResetOnlyOnce")
                        .HasColumnType("bit");
                    b.Property<string>("Result")
                        .HasColumnType("nvarchar(max)");
                    b.Property<int>("RetryTimeout")
                        .HasColumnType("int");
                    b.Property<bool>("RunOnStart")
                        .HasColumnType("bit");
                    b.Property<int>("Sort")
                        .HasColumnType("int");
                    b.Property<bool>("StartNow")
                        .HasColumnType("bit");
                    b.Property<DateTime?>("StartTime")
                        .HasColumnType("datetime2");
                    b.Property<long>("Status")
                        .HasColumnType("bigint");
                    b.Property<string>("TraceId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("TriggerId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("TriggerType")
                        .HasColumnType("nvarchar(max)");
                    b.Property<DateTimeOffset?>("UpdatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("UpdatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.HasKey("Id");
                    b.ToTable("ScheduleJobTrigger");
                });
            modelBuilder.Entity("ApiTools.Core.SmsLog", b =>
                {
                    b.Property<Guid>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("uniqueidentifier");
                    b.Property<int>("Access")
                        .HasColumnType("int");
                    b.Property<Guid?>("ChannelCreatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<Guid?>("ChannelId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<string>("Code")
                        .HasColumnType("nvarchar(max)");
                    b.Property<Guid?>("CreatedChannelId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<DateTimeOffset>("CreatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("CreatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<DateTime?>("Expiry")
                        .HasColumnType("datetime2");
                    b.Property<bool>("IsDeleted")
                        .HasColumnType("bit");
                    b.Property<bool>("IsUsed")
                        .HasColumnType("bit");
                    b.Property<string>("Message")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("PhoneNumber")
                        .IsRequired()
                        .HasMaxLength(11)
                        .HasColumnType("nvarchar(11)");
                    b.Property<string>("RequestId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<int>("Sort")
                        .HasColumnType("int");
                    b.Property<int>("Status")
                        .HasColumnType("int");
                    b.Property<string>("TemplateCode")
                        .IsRequired()
                        .HasMaxLength(128)
                        .HasColumnType("nvarchar(128)");
                    b.Property<string>("TemplateParam")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("TraceId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<DateTimeOffset?>("UpdatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("UpdatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.HasKey("Id");
                    b.HasIndex("ChannelId");
                    b.ToTable("SmsLog");
                });
            modelBuilder.Entity("ApiTools.Core.SmsSetting", b =>
                {
                    b.Property<Guid>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("uniqueidentifier");
                    b.Property<Guid?>("ChannelId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<Guid?>("CreatedChannelId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<DateTimeOffset>("CreatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("CreatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<int>("DailyMaxCount")
                        .HasColumnType("int");
                    b.Property<int>("HourlyMaxCount")
                        .HasColumnType("int");
                    b.Property<bool>("IsDeleted")
                        .HasColumnType("bit");
                    b.Property<bool>("IsDisabled")
                        .HasColumnType("bit");
                    b.Property<int>("MinutelyMaxCount")
                        .HasColumnType("int");
                    b.Property<int>("Sort")
                        .HasColumnType("int");
                    b.Property<string>("TraceId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<DateTimeOffset?>("UpdatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("UpdatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<bool>("WithoutParams")
                        .HasColumnType("bit");
                    b.HasKey("Id");
                    b.HasIndex("ChannelId");
                    b.ToTable("SmsSetting");
                });
            modelBuilder.Entity("ApiTools.Core.SmsSettingAccess", b =>
                {
                    b.Property<Guid>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("uniqueidentifier");
                    b.Property<int>("Access")
                        .HasColumnType("int");
                    b.Property<Guid?>("CreatedChannelId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<DateTimeOffset>("CreatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("CreatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<bool>("IsDeleted")
                        .HasColumnType("bit");
                    b.Property<bool>("IsDisabled")
                        .HasColumnType("bit");
                    b.Property<Guid>("SettingId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<string>("SignName")
                        .HasColumnType("nvarchar(max)");
                    b.Property<int>("Sort")
                        .HasColumnType("int");
                    b.Property<string>("TraceId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<DateTimeOffset?>("UpdatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("UpdatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.HasKey("Id");
                    b.HasIndex("SettingId");
                    b.ToTable("SmsSettingAccess");
                });
            modelBuilder.Entity("ApiTools.Core.User", b =>
                {
                    b.Property<Guid>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("uniqueidentifier");
                    b.Property<string>("Avatar")
                        .HasColumnType("nvarchar(max)");
                    b.Property<Guid?>("ChannelId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<Guid?>("CreatedChannelId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<DateTimeOffset>("CreatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("CreatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<bool>("IsCheckPhoneNumber")
                        .HasColumnType("bit");
                    b.Property<bool>("IsDeleted")
                        .HasColumnType("bit");
                    b.Property<int>("Level")
                        .HasColumnType("int");
                    b.Property<string>("Name")
                        .HasMaxLength(32)
                        .HasColumnType("nvarchar(32)");
                    b.Property<string>("Password")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("PhoneNumber")
                        .HasMaxLength(11)
                        .HasColumnType("nvarchar(11)");
                    b.Property<string>("Remark")
                        .HasColumnType("nvarchar(max)");
                    b.Property<int>("Sort")
                        .HasColumnType("int");
                    b.Property<int>("Status")
                        .HasColumnType("int");
                    b.Property<string>("TraceId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<int>("Type")
                        .HasColumnType("int");
                    b.Property<DateTimeOffset?>("UpdatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("UpdatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<string>("UserName")
                        .IsRequired()
                        .HasMaxLength(32)
                        .HasColumnType("nvarchar(32)");
                    b.HasKey("Id");
                    b.HasIndex("ChannelId");
                    b.ToTable("User");
                    b.HasData(
                        new
                        {
                            Id = new Guid("11111111-1111-1111-1111-111111111111"),
                            CreatedTime = new DateTimeOffset(new DateTime(2000, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 8, 0, 0, 0)),
                            IsCheckPhoneNumber = false,
                            IsDeleted = false,
                            Level = 999,
                            Name = "管理员",
                            Password = "iEYggKrMhQ3ASUGLobra1w==:fn/DsMJUbD9FGpvBvR3moMpMPptdxzZlourPVhU479I=",
                            Sort = 0,
                            Status = 10,
                            Type = 100,
                            UserName = "system"
                        });
                });
            modelBuilder.Entity("ApiTools.Core.ChannelWallet", b =>
                {
                    b.HasOne("ApiTools.Core.Channel", "Channel")
                        .WithMany()
                        .HasForeignKey("ChannelId");
                    b.Navigation("Channel");
                });
            modelBuilder.Entity("ApiTools.Core.ChannelWalletTransaction", b =>
                {
                    b.HasOne("ApiTools.Core.ChannelWallet", "Wallet")
                        .WithMany()
                        .HasForeignKey("WalletId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();
                    b.Navigation("Wallet");
                });
            modelBuilder.Entity("ApiTools.Core.ChannelWalletTransactionPingAnPay", b =>
                {
                    b.HasOne("ApiTools.Core.ChannelWalletTransaction", "Transaction")
                        .WithOne("PingAnPay")
                        .HasForeignKey("ApiTools.Core.ChannelWalletTransactionPingAnPay", "Id")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();
                    b.Navigation("Transaction");
                });
            modelBuilder.Entity("ApiTools.Core.SmsLog", b =>
                {
                    b.HasOne("ApiTools.Core.Channel", "Channel")
                        .WithMany()
                        .HasForeignKey("ChannelId");
                    b.Navigation("Channel");
                });
            modelBuilder.Entity("ApiTools.Core.SmsSetting", b =>
                {
                    b.HasOne("ApiTools.Core.Channel", "Channel")
                        .WithMany()
                        .HasForeignKey("ChannelId");
                    b.Navigation("Channel");
                });
            modelBuilder.Entity("ApiTools.Core.SmsSettingAccess", b =>
                {
                    b.HasOne("ApiTools.Core.SmsSetting", "Setting")
                        .WithMany("Accesses")
                        .HasForeignKey("SettingId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();
                    b.Navigation("Setting");
                });
            modelBuilder.Entity("ApiTools.Core.User", b =>
                {
                    b.HasOne("ApiTools.Core.Channel", "Channel")
                        .WithMany()
                        .HasForeignKey("ChannelId");
                    b.Navigation("Channel");
                });
            modelBuilder.Entity("ApiTools.Core.ChannelWalletTransaction", b =>
                {
                    b.Navigation("PingAnPay");
                });
            modelBuilder.Entity("ApiTools.Core.SmsSetting", b =>
                {
                    b.Navigation("Accesses");
                });
#pragma warning restore 612, 618
        }
    }
}
ApiTools.Database.Migrations/Migrations/20251201101428_CreateWxmpSubscribMessageLog.cs
New file
@@ -0,0 +1,48 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace ApiTools.Database.Migrations.Migrations
{
    /// <inheritdoc />
    public partial class CreateWxmpSubscribMessageLog : Migration
    {
        /// <inheritdoc />
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "WxmpSubscribMessageLog",
                columns: table => new
                {
                    Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
                    Code = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    OpenId = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    PopupScene = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    SubscribeStatusString = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    TemplateId = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    Page = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    Data = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    Sort = table.Column<int>(type: "int", nullable: false),
                    TraceId = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    CreatedTime = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: false),
                    CreatedUserId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
                    CreatedChannelId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
                    UpdatedTime = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: true),
                    UpdatedUserId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
                    IsDeleted = table.Column<bool>(type: "bit", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_WxmpSubscribMessageLog", x => x.Id);
                });
        }
        /// <inheritdoc />
        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable(
                name: "WxmpSubscribMessageLog");
        }
    }
}
ApiTools.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs
@@ -377,6 +377,62 @@
                    b.ToTable("ChannelWalletTransactionPingAnPay");
                });
            modelBuilder.Entity("ApiTools.Core.Entities.LogRecords.WxmpSubscribMessageLog", b =>
                {
                    b.Property<Guid>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("uniqueidentifier");
                    b.Property<string>("Code")
                        .HasColumnType("nvarchar(max)");
                    b.Property<Guid?>("CreatedChannelId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<DateTimeOffset>("CreatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("CreatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.Property<string>("Data")
                        .HasColumnType("nvarchar(max)");
                    b.Property<bool>("IsDeleted")
                        .HasColumnType("bit");
                    b.Property<string>("OpenId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("Page")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("PopupScene")
                        .HasColumnType("nvarchar(max)");
                    b.Property<int>("Sort")
                        .HasColumnType("int");
                    b.Property<string>("SubscribeStatusString")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("TemplateId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<string>("TraceId")
                        .HasColumnType("nvarchar(max)");
                    b.Property<DateTimeOffset?>("UpdatedTime")
                        .HasColumnType("datetimeoffset");
                    b.Property<Guid?>("UpdatedUserId")
                        .HasColumnType("uniqueidentifier");
                    b.HasKey("Id");
                    b.ToTable("WxmpSubscribMessageLog");
                });
            modelBuilder.Entity("ApiTools.Core.Resource", b =>
                {
                    b.Property<Guid>("Id")
ApiTools.Database.Migrations/REDEME.MD
@@ -1,7 +1,7 @@
-------------------------------主数据库---------------------------------------
新增迁移文件
dotnet ef migrations add UpdateChannelWallet1119 -s "../ApiTools.Web.Entry" -c DefaultDbContext
dotnet ef migrations add CreateWxmpSubscribMessageLog -s "../ApiTools.Web.Entry" -c DefaultDbContext
删除迁移文件
dotnet ef migrations remove -s "../ApiTools.Web.Entry" -c DefaultDbContext
ApiTools.Web.Entry/Controllers/WxmpController.cs
@@ -66,7 +66,7 @@
            command.Code = code;
            command.OpenId = query.openid;
            await mediator.Send(command);
            return Content(query.echostr);
            return Content("success");
        }
    }
}