qinchaoyue 4 сар өмнө
parent
commit
00e1b4ec87

+ 8 - 0
src/Hotline.Application/Snapshot/ISnapshotApplication.cs

@@ -206,4 +206,12 @@ public interface ISnapshotApplication
     /// <param name="cancellationToken"></param>
     /// <returns></returns>
     Task SyncCommunityInfoAsync(CommunityInfo community, CancellationToken cancellationToken);
+
+    /// <summary>
+    /// 生成用户红包审核数据
+    /// </summary>
+    /// <param name="id"></param>
+    /// <param name="cancellationToken"></param>
+    /// <returns></returns>
+    Task<string> AddRedPardAsync(string id, CancellationToken cancellationToken);
 }

+ 39 - 24
src/Hotline.Application/Snapshot/Notifications/SnapshotHandler.cs

@@ -2,9 +2,11 @@
 using Hotline.Caching.Interfaces;
 using Hotline.Orders;
 using Hotline.Settings;
+using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.Snapshot;
 using Hotline.Share.Mq;
 using Hotline.Share.Tools;
+using Hotline.Snapshot;
 using Hotline.Snapshot.Interfaces;
 using Hotline.Snapshot.Notifications;
 using MediatR;
@@ -16,61 +18,74 @@ using System.Threading.Tasks;
 using XF.Domain.Dependency;
 
 namespace Hotline.Application.Snapshot.Notifications;
-/// <summary>
-/// 推送网格员系统
-/// </summary>
-public class SnapshotPushNotificationHandler : INotificationHandler<PostGuiderSystemNotification>
+
+public class SnapshotHandler : ICapSubscribe, IScopeDependency
 {
     private readonly ISnapshotApplication _snapshotApplication;
 
-    public SnapshotPushNotificationHandler(ISnapshotApplication snapshotApplication)
+    public SnapshotHandler(ISnapshotApplication snapshotApplication)
     {
         _snapshotApplication = snapshotApplication;
     }
 
-    public async Task Handle(PostGuiderSystemNotification notification, CancellationToken cancellationToken)
+    /// <summary>
+    /// 推送成功后发送的延迟消息;
+    /// 延迟检查网格员是否回复了工单;
+    /// <param name="message"></param>
+    /// <param name="cancellationToken"></param>
+    /// <returns></returns>
+    [CapSubscribe(EventNames.GuiderSystemReplyDelay)]
+    public async Task PostGuiderSystemDelayedNotificationHandler(PostGuiderSystemDelayed message, CancellationToken cancellationToken)
     {
-        await _snapshotApplication.PostOrderGuiderSystemAsync(notification.OrderId, cancellationToken);
+        await _snapshotApplication.GuiderSystemReplyDelayAsync(message.OrderId, cancellationToken);
+    }
+
+    /// <summary>
+    /// 工单归档后生成红包数据
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <param name="cancellationToken"></param>
+    [CapSubscribe(EventNames.HotlineOrderFiled)]
+    public async void SnapshotOrderEndAsync(OrderFlowDto dto, CancellationToken cancellationToken)
+    {
+        await _snapshotApplication.AddRedPardAsync(dto.Order.Id, cancellationToken);
     }
 }
 
 /// <summary>
-/// 推送成功后发送的延迟消息;
-/// 延迟检查网格员是否回复了工单;
+/// 网格员办结事件处理
+/// 把网格员信息回填到系统中, 和小程序账号绑定
 /// </summary>
-/// <param name="orderId"></param>
-public class PostGuiderSystemDelayedNotificationHandler : ICapSubscribe, IScopeDependency
+public class GuiderSystemFieldNotificationHandler : INotificationHandler<GuiderSystemFieldNotification>
 {
     private readonly ISnapshotApplication _snapshotApplication;
 
-    public PostGuiderSystemDelayedNotificationHandler(ISnapshotApplication snapshotApplication)
+    public GuiderSystemFieldNotificationHandler(ISnapshotApplication snapshotApplication1)
     {
-        _snapshotApplication = snapshotApplication;
+        _snapshotApplication = snapshotApplication1;
     }
 
-    [CapSubscribe(EventNames.GuiderSystemReplyDelay)]
-    public async Task Handle(PostGuiderSystemDelayed message, CancellationToken cancellationToken)
+    public async Task Handle(GuiderSystemFieldNotification notification, CancellationToken cancellationToken)
     {
-        await _snapshotApplication.GuiderSystemReplyDelayAsync(message.OrderId, cancellationToken);
+        await _snapshotApplication.SyncGuiderInfoAsync(notification.OrderId, cancellationToken);
+        await _snapshotApplication.SyncCommunityInfoAsync(notification.CommunityInfo, cancellationToken);
     }
 }
 
 /// <summary>
-/// 网格员办结事件处理
-/// 把网格员信息回填到系统中, 和小程序账号绑定
+/// 推送网格员系统
 /// </summary>
-public class GuiderSystemFieldNotificationHandler : INotificationHandler<GuiderSystemFieldNotification>
+public class SnapshotPushNotificationHandler : INotificationHandler<PostGuiderSystemNotification>
 {
     private readonly ISnapshotApplication _snapshotApplication;
 
-    public GuiderSystemFieldNotificationHandler(ISnapshotApplication snapshotApplication1)
+    public SnapshotPushNotificationHandler(ISnapshotApplication snapshotApplication)
     {
-        _snapshotApplication = snapshotApplication1;
+        _snapshotApplication = snapshotApplication;
     }
 
-    public async Task Handle(GuiderSystemFieldNotification notification, CancellationToken cancellationToken)
+    public async Task Handle(PostGuiderSystemNotification notification, CancellationToken cancellationToken)
     {
-        await _snapshotApplication.SyncGuiderInfoAsync(notification.OrderId, cancellationToken);
-        await _snapshotApplication.SyncCommunityInfoAsync(notification.CommunityInfo, cancellationToken);
+        await _snapshotApplication.PostOrderGuiderSystemAsync(notification.OrderId, cancellationToken);
     }
 }

+ 101 - 57
src/Hotline.Application/Snapshot/SnapshotApplicationBase.cs

@@ -72,8 +72,9 @@ public abstract class SnapshotApplicationBase
     private readonly IGuiderInfoRepository _guiderInfoRepository;
     private readonly IFileDomainService _fileDomainService;
     private readonly ICommunityInfoRepository _communityInfoRepository;
+    private readonly IRedPackAuditRepository _redPackAuditRepository;
 
-    public SnapshotApplicationBase(IThirdIdentiyService thirdLoginService, IRepository<Industry> industryRepository, ISnapshotBulletinRepository bulletinRepository, ISessionContext sessionContext, IRepository<RedPackRecord> redPackRecordRepository, IRepository<Order> orderRepository, IThirdAccountRepository thirdAccountRepository, IOrderSnapshotRepository orderSnapshotRepository, ISystemSettingCacheManager systemSettingCacheManager, ISystemAreaDomainService systemAreaDomainService, IFileRepository fileRepository, ISystemDicDataCacheManager systemDicDataCacheManager, ISnapshotOrderPublishRepository snapshotOrderPublishRepository, IRepository<WorkflowTrace> workflowTraceRepository, IPractitionerRepository practitionerRepository, IRepository<SystemArea> systemAreaRepository, IVolunteerRepository volunteerRepository, IVolunteerReportRepository volunteerReportRepository, ISystemLogRepository systemLog, IGuiderSystemService guiderSystemService, ICapPublisher capPublisher, Publisher publisher, IGuiderInfoRepository guiderInfoRepository, IFileDomainService fileDomainService, ICommunityInfoRepository communityInfoRepository)
+    public SnapshotApplicationBase(IThirdIdentiyService thirdLoginService, IRepository<Industry> industryRepository, ISnapshotBulletinRepository bulletinRepository, ISessionContext sessionContext, IRepository<RedPackRecord> redPackRecordRepository, IRepository<Order> orderRepository, IThirdAccountRepository thirdAccountRepository, IOrderSnapshotRepository orderSnapshotRepository, ISystemSettingCacheManager systemSettingCacheManager, ISystemAreaDomainService systemAreaDomainService, IFileRepository fileRepository, ISystemDicDataCacheManager systemDicDataCacheManager, ISnapshotOrderPublishRepository snapshotOrderPublishRepository, IRepository<WorkflowTrace> workflowTraceRepository, IPractitionerRepository practitionerRepository, IRepository<SystemArea> systemAreaRepository, IVolunteerRepository volunteerRepository, IVolunteerReportRepository volunteerReportRepository, ISystemLogRepository systemLog, IGuiderSystemService guiderSystemService, ICapPublisher capPublisher, Publisher publisher, IGuiderInfoRepository guiderInfoRepository, IFileDomainService fileDomainService, ICommunityInfoRepository communityInfoRepository, IRedPackAuditRepository redPackAuditRepository)
     {
         _thirdLoginService = thirdLoginService;
         _industryRepository = industryRepository;
@@ -100,8 +101,10 @@ public abstract class SnapshotApplicationBase
         _guiderInfoRepository = guiderInfoRepository;
         _fileDomainService = fileDomainService;
         _communityInfoRepository = communityInfoRepository;
+        _redPackAuditRepository = redPackAuditRepository;
     }
 
+    #region 小程序
     /// <summary>
     /// 获取随手拍小程序首页数据
     /// </summary>
@@ -198,23 +201,6 @@ public abstract class SnapshotApplicationBase
         return outDto;
     }
 
-    public async Task AddOrderPublishAsync(AddSnapshotOrderPublishInDto dto, CancellationToken cancellation)
-    {
-        dto.ValidateObject();
-        var snapshotOrder = await _orderSnapshotRepository.GetAsync(dto.OrderId)
-            ?? throw UserFriendlyException.SameMessage("工单不存在");
-        var order = await _orderRepository.Queryable()
-            .Where(m => m.Id == dto.OrderId)
-            .Select(m => new { m.Id, m.No })
-            .FirstAsync(cancellation)
-            ?? throw UserFriendlyException.SameMessage("工单不存在");
-        var entity = dto.Adapt<SnapshotOrderPublish>();
-        entity.Id = order.Id;
-        entity.IndustryId = snapshotOrder.IndustryId;
-        entity.IndustryName = snapshotOrder.IndustryName;
-        entity.No = order.No;
-        await _snapshotOrderPublishRepository.AddAsync(entity);
-    }
 
     /// <summary>
     /// 获取公开工单集合
@@ -457,45 +443,6 @@ public abstract class SnapshotApplicationBase
         return detail;
     }
 
-    /// <summary>
-    /// 添加随手拍公告
-    /// </summary>
-    /// <returns></returns>
-    public async Task<string> AddBulletinAsync(AddSnapshotBulletinInDto dto)
-    {
-        dto.ValidateObject();
-        var entity = dto.Adapt<SnapshotBulletin>();
-        entity.BulletinState = EBulletinState.InReview;
-        entity.Id = await _bulletinRepository.AddAsync(entity);
-        return entity.Id;
-    }
-
-    /// <summary>
-    /// 审核公告
-    /// </summary>
-    /// <param name="examineBulletinDto"></param>
-    /// <returns></returns>
-    public async Task AuditBulletinAsync(ExamineBulletinDto dto)
-    {
-        var bulletin = await _bulletinRepository.GetAsync(dto.Id)
-            ?? throw UserFriendlyException.SameMessage("无效数据");
-        if (bulletin.BulletinState != EBulletinState.InReview)
-            throw UserFriendlyException.SameMessage("当前状态不能审核");
-
-        bulletin.ExaminOpinion = dto.Reason;
-        bulletin.ExaminTime = DateTime.Now;
-        bulletin.ExaminManId = _sessionContext.RequiredUserId;
-        if (dto.IsPass)
-        {
-            bulletin.BulletinState = EBulletinState.ReviewPass;
-        }
-        else
-        {
-            bulletin.BulletinState = EBulletinState.ReviewNoPass;
-        }
-        await _bulletinRepository.UpdateAsync(bulletin);
-    }
-
     /// <summary>
     /// 保存用户自己的邀请码
     /// </summary>
@@ -510,6 +457,9 @@ public abstract class SnapshotApplicationBase
         await _thirdAccountRepository.UpdateAsync(third);
     }
 
+    #endregion
+
+    #region 网格员
     /// <summary>
     /// 推送工单到网格员系统
     /// </summary>
@@ -651,6 +601,7 @@ public abstract class SnapshotApplicationBase
             await _communityInfoRepository.UpdateAsync(community, cancellationToken);
         }
     }
+    #endregion
 
     #region 从业人员
 
@@ -726,6 +677,12 @@ public abstract class SnapshotApplicationBase
 
     #region 志愿者
 
+    /// <summary>
+    /// 添加志愿者
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <param name="cancellationToken"></param>
+    /// <returns></returns>
     public async Task<string> AddVolunteerAsync(AddVolunteerInDto dto, CancellationToken cancellationToken)
     {
         var entity = dto.Adapt<Volunteer>();
@@ -755,4 +712,91 @@ public abstract class SnapshotApplicationBase
     #endregion
 
 
+    #region 红包
+    /// <summary>
+    /// 生成用户红包审核数据
+    /// </summary>
+    /// <param name="id"></param>
+    /// <param name="cancellationToken"></param>
+    /// <returns></returns>
+    [LogToData]
+    public async Task<string> AddRedPardAsync(string orderId, CancellationToken cancellationToken)
+    {
+        var order = await _orderRepository.Queryable()
+            .Where(m => m.Id == orderId)
+            .Select(m => new {m.Id, m.Status , m.No})
+            .FirstAsync(cancellationToken) ?? throw new UserFriendlyException($"{orderId} 工单不存在");
+        if (order.Status != EOrderStatus.Filed) return $"{order.No} 工单状态非 {EOrderStatus.Filed} 不处理;";
+        var redPack = await _redPackAuditRepository.GetByOrderIdAsync(orderId, cancellationToken);
+        if (redPack != null) return $"{order.No} 工单已存在红包信息,不处理;";
+        var entity = new RedPackAudit
+        {
+            OrderId = order.Id,
+            Status = ERedPackAuditStatus.Pending,
+
+        };
+    }
+    #endregion
+
+    #region 公开工单
+
+    public async Task AddOrderPublishAsync(AddSnapshotOrderPublishInDto dto, CancellationToken cancellation)
+    {
+        dto.ValidateObject();
+        var snapshotOrder = await _orderSnapshotRepository.GetAsync(dto.OrderId)
+            ?? throw UserFriendlyException.SameMessage("工单不存在");
+        var order = await _orderRepository.Queryable()
+            .Where(m => m.Id == dto.OrderId)
+            .Select(m => new { m.Id, m.No })
+            .FirstAsync(cancellation)
+            ?? throw UserFriendlyException.SameMessage("工单不存在");
+        var entity = dto.Adapt<SnapshotOrderPublish>();
+        entity.Id = order.Id;
+        entity.IndustryId = snapshotOrder.IndustryId;
+        entity.IndustryName = snapshotOrder.IndustryName;
+        entity.No = order.No;
+        await _snapshotOrderPublishRepository.AddAsync(entity);
+    }
+    #endregion
+
+    #region 随手拍公告
+    /// <summary>
+    /// 添加随手拍公告
+    /// </summary>
+    /// <returns></returns>
+    public async Task<string> AddBulletinAsync(AddSnapshotBulletinInDto dto)
+    {
+        dto.ValidateObject();
+        var entity = dto.Adapt<SnapshotBulletin>();
+        entity.BulletinState = EBulletinState.InReview;
+        entity.Id = await _bulletinRepository.AddAsync(entity);
+        return entity.Id;
+    }
+
+    /// <summary>
+    /// 审核公告
+    /// </summary>
+    /// <param name="examineBulletinDto"></param>
+    /// <returns></returns>
+    public async Task AuditBulletinAsync(ExamineBulletinDto dto)
+    {
+        var bulletin = await _bulletinRepository.GetAsync(dto.Id)
+            ?? throw UserFriendlyException.SameMessage("无效数据");
+        if (bulletin.BulletinState != EBulletinState.InReview)
+            throw UserFriendlyException.SameMessage("当前状态不能审核");
+
+        bulletin.ExaminOpinion = dto.Reason;
+        bulletin.ExaminTime = DateTime.Now;
+        bulletin.ExaminManId = _sessionContext.RequiredUserId;
+        if (dto.IsPass)
+        {
+            bulletin.BulletinState = EBulletinState.ReviewPass;
+        }
+        else
+        {
+            bulletin.BulletinState = EBulletinState.ReviewNoPass;
+        }
+        await _bulletinRepository.UpdateAsync(bulletin);
+    }
+    #endregion
 }

+ 24 - 0
src/Hotline.Repository.SqlSugar/Snapshot/RedPackAuditRepository.cs

@@ -0,0 +1,24 @@
+using Hotline.Repository.SqlSugar.DataPermissions;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
+using Hotline.Snapshot;
+using Hotline.Snapshot.Interfaces;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Dependency;
+
+namespace Hotline.Repository.SqlSugar.Snapshot;
+public class RedPackAuditRepository : BaseRepository<RedPackAudit>, IRedPackAuditRepository, IScopeDependency
+{
+    public RedPackAuditRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
+    {
+    }
+
+    public async Task<RedPackAudit> GetByOrderIdAsync(string orderId, CancellationToken cancellationToken)
+    {
+        return await base.Queryable().Where(m => m.OrderId == orderId).FirstAsync(cancellationToken);
+    }
+}

+ 18 - 0
src/Hotline/Snapshot/Interfaces/IRedPackAuditRepository.cs

@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Repository;
+
+namespace Hotline.Snapshot.Interfaces;
+public interface IRedPackAuditRepository : IRepository<RedPackAudit>
+{
+    /// <summary>
+    /// 根据OrderId获取红包审核信息
+    /// </summary>
+    /// <param name="orderId"></param>
+    /// <param name="cancellationToken"></param>
+    /// <returns></returns>
+    Task<RedPackAudit> GetByOrderIdAsync(string orderId, CancellationToken cancellationToken);
+}

+ 1 - 0
src/Hotline/Snapshot/RedPackAudit.cs

@@ -13,6 +13,7 @@ namespace Hotline.Snapshot;
 
 /// <summary>
 /// 市民红包审核
+/// 先生成审核, 再生成红包发放记录
 /// </summary>
 [Description("市民红包审核")]
 public class RedPackAudit : CreationSoftDeleteEntity