瀏覽代碼

Merge branch 'feature/snapshot' into dev

qinchaoyue 4 月之前
父節點
當前提交
e41adcdf2f
共有 32 個文件被更改,包括 707 次插入66 次删除
  1. 3 0
      src/Hotline.Api/Controllers/OrderController.cs
  2. 37 0
      src/Hotline.Api/Controllers/Snapshot/InviteCodeController.cs
  3. 25 0
      src/Hotline.Api/Controllers/Snapshot/RedPackController.cs
  4. 28 4
      src/Hotline.Api/Controllers/Snapshot/SnapshotOrderController.cs
  5. 43 0
      src/Hotline.Application.Tests/Application/InviteCodeApplicationTest.cs
  6. 4 0
      src/Hotline.Application.Tests/Application/OrderSnapshotApplicationTest.cs
  7. 13 0
      src/Hotline.Application.Tests/Application/RedPackApplicationTest.cs
  8. 2 2
      src/Hotline.Application.Tests/Application/SnapshotApplicationMockTest.cs
  9. 2 1
      src/Hotline.Application.Tests/appsettings.Development.json
  10. 16 6
      src/Hotline.Application/Orders/Handles/SnapshotHandler/GuiderSystemTimeoutHandler.cs
  11. 1 1
      src/Hotline.Application/Snapshot/DefaultSnapshotApplication.cs
  12. 15 0
      src/Hotline.Application/Snapshot/IInviteCodeApplication.cs
  13. 7 0
      src/Hotline.Application/Snapshot/IOrderSnapshotApplication.cs
  14. 6 0
      src/Hotline.Application/Snapshot/IRedPackApplication.cs
  15. 38 0
      src/Hotline.Application/Snapshot/InviteCodeApplication.cs
  16. 33 0
      src/Hotline.Application/Snapshot/OrderSnapshotApplication.cs
  17. 26 0
      src/Hotline.Application/Snapshot/RedPackApplication.cs
  18. 5 3
      src/Hotline.Application/Snapshot/SnapshotApplicationBase.cs
  19. 1 1
      src/Hotline.Application/Snapshot/ZiGongSnapshotApplication.cs
  20. 8 0
      src/Hotline.Repository.SqlSugar/Snapshot/IndustryRepository.cs
  21. 18 0
      src/Hotline.Repository.SqlSugar/Snapshot/InviteCodeRepository.cs
  22. 2 1
      src/Hotline.Repository.SqlSugar/System/SystemLogRepository.cs
  23. 47 0
      src/Hotline.Share/Dtos/Snapshot/InviteCodeDto.cs
  24. 119 2
      src/Hotline.Share/Dtos/Snapshot/OrderDto.cs
  25. 141 0
      src/Hotline.Share/Dtos/Snapshot/RedPackRecordDto.cs
  26. 1 1
      src/Hotline/Caching/Interfaces/ISystemSettingCacheManager.cs
  27. 2 2
      src/Hotline/Caching/Services/SystemSettingCacheManager.cs
  28. 1 1
      src/Hotline/Settings/ISystemLogRepository.cs
  29. 1 0
      src/Hotline/Snapshot/Interfaces/IIndustryRepository.cs
  30. 13 0
      src/Hotline/Snapshot/Interfaces/IInviteCodeRepository.cs
  31. 31 31
      src/Hotline/Snapshot/InviteCode.cs
  32. 18 10
      src/TianQue.Sdk/TiqnQueService.cs

+ 3 - 0
src/Hotline.Api/Controllers/OrderController.cs

@@ -3653,6 +3653,9 @@ public class OrderController : BaseController
                 IndustryName = dto.IndustryName
             };
             await _orderSnapshotRepository.AddAsync(snapshot, HttpContext.RequestAborted);
+            order.Latitude = 29.33924;
+            order.Longitude = 104.779307;
+            await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
         }
 
         //订阅此事件的内部处理工单数据只能更新各自业务的字段,不能全部更新

+ 37 - 0
src/Hotline.Api/Controllers/Snapshot/InviteCodeController.cs

@@ -0,0 +1,37 @@
+using Hotline.Application.Snapshot;
+using Hotline.Repository.SqlSugar.Extensions;
+using Hotline.Share.Dtos;
+using Hotline.Share.Dtos.Snapshot;
+using Hotline.Share.Tools;
+using Hotline.Snapshot;
+using Hotline.Snapshot.Interfaces;
+using Microsoft.AspNetCore.Mvc;
+using System.ComponentModel;
+
+namespace Hotline.Api.Controllers.Snapshot;
+
+/// <summary>
+/// 邀请码管理
+/// </summary>
+[Description("邀请码管理")]
+public class InviteCodeController : BaseController
+{
+    private readonly IInviteCodeApplication _inviteCodeApplication;
+
+    public InviteCodeController(IInviteCodeApplication inviteCodeApplication)
+    {
+        _inviteCodeApplication = inviteCodeApplication;
+    }
+
+    /// <summary>
+    /// 获取邀请码集合
+    /// </summary>
+    /// <returns></returns>
+    [HttpGet]
+    public async Task<PagedDto<InviteCode>> GetInviteCodeItemsAsync([FromQuery]GetInviteCodeItemsInDto dto)
+        => (await _inviteCodeApplication.GetInviteCodeItemsAsync().ToPagedListAsync(dto)).ToPaged();
+
+    [HttpPost]
+    public async Task AddInviteCodeAsync([FromBody] AddInviteCodeInDto dto)
+        => await _inviteCodeApplication.AddInviteCodeAsync(dto);
+}

+ 25 - 0
src/Hotline.Api/Controllers/Snapshot/RedPackController.cs

@@ -188,6 +188,31 @@ public class RedPackController : BaseController
     public async Task<PagedDto<SnapshotRedPackRecordItemsGuiderOutDto>> GetRedPackRecordGuiderItemsAsync([FromQuery] SnapshotRedPackRecordItemsGuiderInDto dto)
         => (await _redPackApplication.GetRedPackRecordGuiderItemsAsync(dto).ToPagedListAsync(dto)).ToPaged();
 
+    /// <summary>
+    /// 红包发放明细基础数据
+    /// </summary>
+    /// <returns></returns>
+    [HttpGet("record/send/database")]
+    public async Task<Dictionary<string, object>> GetRedPackRecordSendBaseDataAsync()
+    {
+        return new Dictionary<string, object>()
+        {
+            { "industry", await _industryRepository.Queryable()
+            .Select(m => new { m.Id, m.Name })
+            .ToListAsync()},
+            { "sendStatus", EnumExts.GetDescriptions<EReadPackSendStatus>().Where(m => m.Key != 2).ToList() },
+            { "userType", EnumExts.GetDescriptions<EReadPackUserType>() }
+        };
+    }
+
+    /// <summary>
+    /// 红包发放明细
+    /// </summary>
+    /// <returns></returns>
+    [HttpGet("record/send")]
+    public async Task<PagedDto<SnapshotRedPackRecordSendOutDto>> GetRedPackRecordDetailAsync([FromQuery] SnapshotRedPackRecordSendInDto dto)
+        => (await _redPackApplication.GetRedPackRecordDetailAsync(dto).ToPagedListAsync(dto)).ToPaged();
+
     /// <summary>
     /// 批量发送红包
     /// </summary>

+ 28 - 4
src/Hotline.Api/Controllers/Snapshot/SnapshotOrderController.cs

@@ -1,5 +1,6 @@
 using Amazon.Runtime.Internal.Transform;
 using Hotline.Application.FlowEngine;
+using Hotline.Application.Orders;
 using Hotline.Application.Snapshot;
 using Hotline.Caching.Interfaces;
 using Hotline.Caching.Services;
@@ -15,6 +16,7 @@ using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Snapshot;
 using Hotline.Share.Tools;
+using Hotline.Snapshot;
 using Hotline.Snapshot.Interfaces;
 using Mapster;
 using Microsoft.AspNetCore.Mvc;
@@ -43,8 +45,9 @@ public class SnapshotOrderController : BaseController
     private readonly IOrderRepository _orderRepository;
     private readonly IWorkflowApplication _workflowApplication;
     private readonly IRepository<WorkflowDefinition> _workflowDefinitionRepository;
+    private readonly IOrderApplication _orderApplication;
 
-    public SnapshotOrderController(IOrderSnapshotRepository orderSnapshotRepository, IOrderSnapshotApplication orderSnapshotApplication, ISystemAreaDomainService systemAreaDomainService, ISystemDicDataCacheManager systemDicDataCacheManager, IIndustryRepository industryRepository, ISessionContext sessionContext, IWorkflowDomainService workflowDomainService, IOrderRepository orderRepository, IWorkflowApplication workflowApplication, IRepository<WorkflowDefinition> workflowDefinitionRepository)
+    public SnapshotOrderController(IOrderSnapshotRepository orderSnapshotRepository, IOrderSnapshotApplication orderSnapshotApplication, ISystemAreaDomainService systemAreaDomainService, ISystemDicDataCacheManager systemDicDataCacheManager, IIndustryRepository industryRepository, ISessionContext sessionContext, IWorkflowDomainService workflowDomainService, IOrderRepository orderRepository, IWorkflowApplication workflowApplication, IRepository<WorkflowDefinition> workflowDefinitionRepository, IOrderApplication orderApplication)
     {
         _orderSnapshotRepository = orderSnapshotRepository;
         _orderSnapshotApplication = orderSnapshotApplication;
@@ -56,6 +59,7 @@ public class SnapshotOrderController : BaseController
         _orderRepository = orderRepository;
         _workflowApplication = workflowApplication;
         _workflowDefinitionRepository = workflowDefinitionRepository;
+        _orderApplication = orderApplication;
     }
 
     /// <summary>
@@ -116,6 +120,15 @@ public class SnapshotOrderController : BaseController
     public async Task<PagedDto<SignOrderSnapshotItemsOutDto>> GetSignOrderSnapshotItemsAsync([FromQuery] SignOrderSnapshotItemsInDto dto)
         => (await _orderSnapshotApplication.GetSignOrderSnapshotItemsAsync(dto).ToPagedListAsync(dto)).ToPaged();
 
+    /// <summary>
+    /// 获取工单已经标记集合
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpGet("signed")]
+    public async Task<PagedDto<SignedOrderSnapshotItemsOutDto>> GetSignedOrderSnapshotItemsAsync([FromQuery] SignedOrderSnapshotItemsInDto dto)
+        => (await _orderSnapshotApplication.GetSignedOrderSnapshotItemsAsync(dto).ToPagedListAsync(dto)).ToPaged();
+
     /// <summary>
     /// 标记详情
     /// </summary>
@@ -125,10 +138,11 @@ public class SnapshotOrderController : BaseController
     public async Task<SignOrderSnapshotDetailOutDto> GetSignOrderSnapshotDetailAsync(string id)
     { 
         var order = await _orderRepository.Queryable()
-            .Where(m => m.Id == id)
-            .Select(m => new SignOrderSnapshotDetailOutDto { Id = m.Id, Title = m.Title})
+            .LeftJoin<OrderSnapshot>((order, snapshot) => order.Id == snapshot.Id)
+            .Where((order, snapshot) => order.Id == id)
+            .Select((order, snapshot) => new SignOrderSnapshotDetailOutDto { Id = order.Id, Title = order.Title, Lables =snapshot.Labels })
             .FirstAsync();
-        order.Lables = _systemDicDataCacheManager.SnapshotOrderLabel;
+        order.LabelsBaseData = _systemDicDataCacheManager.SnapshotOrderLabel;
         return order;
     }
 
@@ -230,4 +244,14 @@ public class SnapshotOrderController : BaseController
         };
     }
 
+    /// <summary>
+    /// 网格员超时未回复, 处理工单
+    /// </summary>
+    /// <param name="id">工单Id</param>
+    /// <returns></returns>
+    [HttpPut("guider/timeout/{id}")]
+    public async Task HandleFromWanggeyuanToMaskAsync(string id)
+    {
+        await _orderApplication.HandleFromWanggeyuanToMaskAsync(id, HttpContext.RequestAborted);
+    }
 }

+ 43 - 0
src/Hotline.Application.Tests/Application/InviteCodeApplicationTest.cs

@@ -0,0 +1,43 @@
+using Hotline.Api.Controllers;
+using Hotline.Application.Snapshot;
+using Hotline.Identity.Accounts;
+using Hotline.Identity.Roles;
+using Hotline.Share.Dtos.Snapshot;
+using Hotline.Snapshot.Interfaces;
+using Hotline.Users;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.DependencyInjection;
+using Shouldly;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Repository;
+
+namespace Hotline.Application.Tests.Application;
+public class InviteCodeApplicationTest : TestBase
+{
+    private readonly IInviteCodeApplication _inviteCodeApplication;
+
+    public InviteCodeApplicationTest(IAccountRepository accountRepository, IRepository<Role> roleRepository, UserController userController, IServiceScopeFactory scopeFactory, IRepository<User> userRepository, IHttpContextAccessor httpContextAccessor, IThirdIdentiyService thirdIdentiyService, IThirdAccountRepository thirdAccountRepository, IInviteCodeApplication inviteCodeApplication) : base(accountRepository, roleRepository, userController, scopeFactory, userRepository, httpContextAccessor, thirdIdentiyService, thirdAccountRepository)
+    {
+        _inviteCodeApplication = inviteCodeApplication;
+    }
+
+    [Fact]
+    public async Task InviteCode_Test()
+    {
+        var inDto = new AddInviteCodeInDto
+        {
+            OrgName = "测试部门",
+            BeginCode = 1000,
+            EndCode = 2000,
+        };
+
+        await _inviteCodeApplication.AddInviteCodeAsync(inDto);
+
+        var items = _inviteCodeApplication.GetInviteCodeItemsAsync().ToList();
+        items.Count.ShouldNotBe(0);
+    }
+}

+ 4 - 0
src/Hotline.Application.Tests/Application/OrderSnapshotApplicationTest.cs

@@ -39,6 +39,7 @@ public class OrderSnapshotApplicationTest : TestBase
     /// <summary>
     /// 随手拍办理流程
     /// 工单标注 : 验证数据是否保存正确
+    /// 获取已标注集合: 验证是否有已标注的数据
     /// </summary>
     /// <returns></returns>
     [Fact]
@@ -67,6 +68,9 @@ public class OrderSnapshotApplicationTest : TestBase
         var labelLog = await _orderSnapshotApplication.GetSignOrderSnapshotLogItemsAsync(new SignOrderSnapshotLogItemsInDto()).ToPagedListAsync(new PagedRequest());
         labelLog.Items.Any(m => m.Title.IsNullOrEmpty()).ShouldBe(false);
         labelLog.Items.Any(m => m.SourceChannel.IsNullOrEmpty()).ShouldBe(false);
+
+        var sigedItems = await _orderSnapshotApplication.GetSignedOrderSnapshotItemsAsync(new SignedOrderSnapshotItemsInDto()).ToListAsync();
+        sigedItems.Any(m => m.OrderId == order.Id).ShouldBe(true);
     }
 }
 

+ 13 - 0
src/Hotline.Application.Tests/Application/RedPackApplicationTest.cs

@@ -60,5 +60,18 @@ public class RedPackApplicationTest : TestBase
         record.ShouldNotBeNull();
         var recordItems = await _redPackApplication.GetRedPackRecordItemsAsync(new SnapshotRedPackRecordItemsInDto { Status =2}).ToListAsync();
         recordItems.Count.ShouldNotBe(0);
+
+        var redPackRecord = recordItems.First();
+        var redPackRecordEntity = await _redPackRecordRepository.GetAsync(redPackRecord.Id);
+        redPackRecordEntity.PickupStatus = ERedPackPickupStatus.Received;
+        redPackRecordEntity.DistributionState = EReadPackSendStatus.Successful;
+        redPackRecordEntity.ReceiveTime = DateTime.Now;
+        await _redPackRecordRepository.UpdateAsync(redPackRecordEntity);
+
+        var sendRecordItems = await _redPackApplication.GetRedPackRecordDetailAsync(new SnapshotRedPackRecordSendInDto
+        {
+            IsReceive = true,
+        }).ToListAsync();
+        sendRecordItems.Count.ShouldNotBe(0);
     }
 }

+ 2 - 2
src/Hotline.Application.Tests/Application/SnapshotApplicationMockTest.cs

@@ -26,7 +26,7 @@ namespace Hotline.Application.Tests.Snapshot
     public class SnapshotApplicationTest
     {
         private readonly Mock<IThirdIdentiyService> _thirdLoginServiceMock;
-        private readonly Mock<IRepository<Industry>> _industryRepositoryMock;
+        private readonly Mock<IIndustryRepository> _industryRepositoryMock;
         private readonly Mock<ISnapshotBulletinRepository> _bulletinRepositoryMock;
         private readonly Mock<ISessionContext> _sessionContextMock;
         private readonly Mock<IRepository<RedPackRecord>> _redPackRecordRepositoryMock;
@@ -55,7 +55,7 @@ namespace Hotline.Application.Tests.Snapshot
         public SnapshotApplicationTest()
         {
             _thirdLoginServiceMock = new Mock<IThirdIdentiyService>();
-            _industryRepositoryMock = new Mock<IRepository<Industry>>();
+            _industryRepositoryMock = new Mock<IIndustryRepository>();
             _bulletinRepositoryMock = new Mock<ISnapshotBulletinRepository>();
             _sessionContextMock = new Mock<ISessionContext>();
             _redPackRecordRepositoryMock = new Mock<IRepository<RedPackRecord>>();

+ 2 - 1
src/Hotline.Application.Tests/appsettings.Development.json

@@ -68,7 +68,8 @@
         }
     },
     "ConnectionStrings": {
-        "Hotline": "PORT=5432;DATABASE=hotline_dev;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;",
+         "Hotline": "PORT=5432;DATABASE=hotline_dev;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;",
+        //"Hotline": "PORT=5432;DATABASE=hotline;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;",
         "CAP": "PORT=5432;DATABASE=fwmq;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;Search Path=cap"
         //"Hotline": "PORT=5432;DATABASE=hotline;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;"
     },

+ 16 - 6
src/Hotline.Application/Orders/Handles/SnapshotHandler/GuiderSystemTimeoutHandler.cs

@@ -13,6 +13,7 @@ using Hotline.Orders;
 using Hotline.Settings;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Enums.FlowEngine;
+using Hotline.Share.Tools;
 using Hotline.Snapshot.Notifications;
 using MediatR;
 using XF.Domain.Exceptions;
@@ -26,14 +27,17 @@ namespace Hotline.Application.Orders.Handles.Snapshot
     {
         private readonly ISystemSettingCacheManager _systemSettingCacheManager;
         private readonly IOrderApplication _orderApplication;
+        private readonly ISystemLogRepository _systemLogRepository;
 
         public GuiderSystemTimeoutHandler(
             ISystemSettingCacheManager systemSettingCacheManager,
             IOrderApplication orderApplication
-            )
+,
+            ISystemLogRepository systemLogRepository)
         {
             _systemSettingCacheManager = systemSettingCacheManager;
             _orderApplication = orderApplication;
+            _systemLogRepository = systemLogRepository;
         }
 
         /// <summary>Handles a notification</summary>
@@ -41,13 +45,19 @@ namespace Hotline.Application.Orders.Handles.Snapshot
         /// <param name="cancellationToken">Cancellation token</param>
         public async Task Handle(GuiderSystemTimeOutBackNotification notification, CancellationToken cancellationToken)
         {
-            bool.TryParse(
-                _systemSettingCacheManager.GetSetting(SettingConstants.Snapshot)?.SettingValue[0],
-                out bool isSnapshotEnable);
-            if (isSnapshotEnable)
+            try
             {
-                await _orderApplication.HandleFromWanggeyuanToMaskAsync(notification.OrderId, cancellationToken);
+                if (_systemSettingCacheManager.Snapshot)
+                {
+                    await _orderApplication.HandleFromWanggeyuanToMaskAsync(notification.OrderId, cancellationToken);
+                }
             }
+            catch (Exception e)
+            {
+                _systemLogRepository.Add("网格员超时未回复", notification.OrderId, "方法异常", status: 0, executeResult: e.ToJson());
+                throw;
+            }
+            _systemLogRepository.Add("网格员超时未回复", notification.OrderId, "收到事件", "", 1);
         }
     }
 }

+ 1 - 1
src/Hotline.Application/Snapshot/DefaultSnapshotApplication.cs

@@ -25,7 +25,7 @@ namespace Hotline.Application.Snapshot;
 public class DefaultSnapshotApplication : SnapshotApplicationBase
     , ISnapshotApplication, IScopeDependency
 {
-    public DefaultSnapshotApplication(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, IOrderVisitRepository orderVisitRepository, IOrderVisitDetailRepository orderVisitDetailRepository, IRedPackGuiderAuditRepository redPackGuiderAuditRepository) : base(thirdLoginService, industryRepository, bulletinRepository, sessionContext, redPackRecordRepository, orderRepository, thirdAccountRepository, orderSnapshotRepository, systemSettingCacheManager, systemAreaDomainService, fileRepository, systemDicDataCacheManager, snapshotOrderPublishRepository, workflowTraceRepository, practitionerRepository, systemAreaRepository, volunteerRepository, volunteerReportRepository, systemLog, guiderSystemService, capPublisher, publisher, guiderInfoRepository, fileDomainService, communityInfoRepository, redPackAuditRepository, orderVisitRepository, orderVisitDetailRepository, redPackGuiderAuditRepository)
+    public DefaultSnapshotApplication(IThirdIdentiyService thirdLoginService, IIndustryRepository 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, IOrderVisitRepository orderVisitRepository, IOrderVisitDetailRepository orderVisitDetailRepository, IRedPackGuiderAuditRepository redPackGuiderAuditRepository) : base(thirdLoginService, industryRepository, bulletinRepository, sessionContext, redPackRecordRepository, orderRepository, thirdAccountRepository, orderSnapshotRepository, systemSettingCacheManager, systemAreaDomainService, fileRepository, systemDicDataCacheManager, snapshotOrderPublishRepository, workflowTraceRepository, practitionerRepository, systemAreaRepository, volunteerRepository, volunteerReportRepository, systemLog, guiderSystemService, capPublisher, publisher, guiderInfoRepository, fileDomainService, communityInfoRepository, redPackAuditRepository, orderVisitRepository, orderVisitDetailRepository, redPackGuiderAuditRepository)
     {
     }
 }

+ 15 - 0
src/Hotline.Application/Snapshot/IInviteCodeApplication.cs

@@ -0,0 +1,15 @@
+using Hotline.Share.Dtos.Snapshot;
+using Hotline.Snapshot;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Application.Snapshot;
+public interface IInviteCodeApplication
+{
+    Task AddInviteCodeAsync(AddInviteCodeInDto dto);
+    ISugarQueryable<InviteCode> GetInviteCodeItemsAsync();
+}

+ 7 - 0
src/Hotline.Application/Snapshot/IOrderSnapshotApplication.cs

@@ -110,4 +110,11 @@ public interface IOrderSnapshotApplication
     /// <param name="dto"></param>
     /// <returns></returns>
     ISugarQueryable<OrderSnapshotItemsOutDto> GetOrderSnapshotItemsAsync(OrderSnapshotItemsInDto dto);
+
+    /// <summary>
+    /// 获取工单已经标记集合
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    ISugarQueryable<SignedOrderSnapshotItemsOutDto> GetSignedOrderSnapshotItemsAsync(SignedOrderSnapshotItemsInDto dto);
 }

+ 6 - 0
src/Hotline.Application/Snapshot/IRedPackApplication.cs

@@ -64,6 +64,12 @@ public interface IRedPackApplication
     /// <returns></returns>
     ISugarQueryable<SnapshotOrderGuiderAuditItemsOutDto> GetRedPackGuiderAuditItemsAsync(SnapshotOrderGuiderAuditItemsInDto dto);
 
+    /// <summary>
+    /// 红包发放明细
+    /// </summary>
+    /// <returns></returns>
+    ISugarQueryable<SnapshotRedPackRecordSendOutDto> GetRedPackRecordDetailAsync(SnapshotRedPackRecordSendInDto dto);
+
     /// <summary>
     /// 网格员红包发放记录
     /// </summary>

+ 38 - 0
src/Hotline.Application/Snapshot/InviteCodeApplication.cs

@@ -0,0 +1,38 @@
+using Hotline.Share.Dtos.Snapshot;
+using Hotline.Snapshot;
+using Hotline.Snapshot.Interfaces;
+using Mapster;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Dependency;
+using XF.Domain.Exceptions;
+
+namespace Hotline.Application.Snapshot;
+public class InviteCodeApplication : IInviteCodeApplication, IScopeDependency
+{
+    private readonly IInviteCodeRepository _inviteCodeRepository;
+
+    public InviteCodeApplication(IInviteCodeRepository inviteCodeRepository)
+    {
+        _inviteCodeRepository = inviteCodeRepository;
+    }
+
+    public async Task AddInviteCodeAsync(AddInviteCodeInDto dto)
+    {
+        var entity = dto.Adapt<InviteCode>();
+        if (dto.BeginCode >= dto.EndCode)
+        {
+            throw UserFriendlyException.SameMessage("开始邀请码不能大于结束邀请码");
+        }
+        await _inviteCodeRepository.AddAsync(entity);
+    }
+
+    public ISugarQueryable<InviteCode> GetInviteCodeItemsAsync()
+    {
+        return _inviteCodeRepository.Queryable();
+    }
+}

+ 33 - 0
src/Hotline.Application/Snapshot/OrderSnapshotApplication.cs

@@ -422,6 +422,9 @@ public class OrderSnapshotApplication : IOrderSnapshotApplication, IScopeDepende
     {
         var query = _orderSnapshotRepository.Queryable()
             .LeftJoin<Order>((snapshot, order) => snapshot.Id == order.Id)
+            .WhereIF(dto.No.NotNullOrEmpty(), (snapshot, order) => order.No.Contains(dto.No))
+            .WhereIF(dto.Title.NotNullOrEmpty(), (snapshot, order) => order.Title.Contains(dto.Title))
+            .WhereIF(dto.ActualHandleOrgName.NotNullOrEmpty(), (snapshot, order) => order.ActualHandleOrgName.Contains(dto.ActualHandleOrgName))
             .Select((snapshot, order) => new OrderSnapshotItemsOutDto 
             {
                 CreationTime = order.CreationTime
@@ -429,4 +432,34 @@ public class OrderSnapshotApplication : IOrderSnapshotApplication, IScopeDepende
              , true);
         return query;
     }
+
+    /// <summary>
+    /// 获取工单已经标记集合
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public ISugarQueryable<SignedOrderSnapshotItemsOutDto> GetSignedOrderSnapshotItemsAsync(SignedOrderSnapshotItemsInDto dto)
+    {
+        var query = _orderSnapshotRepository.Queryable()
+            .LeftJoin<Order>((snapshot, order) => order.Id == snapshot.Id)
+            .Where((snapshot, order) => order.Status >= EOrderStatus.Published)
+            .WhereIF(dto.No.NotNullOrEmpty(), (snapshot, order) => order.No.Contains(dto.No))
+            .WhereIF(dto.Title.NotNullOrEmpty(), (snapshot, order) => order.Title.Contains(dto.Title))
+            .WhereIF(dto.FromName.NotNullOrEmpty(), (snapshot, order) => order.FromName.Contains(dto.FromName))
+            .WhereIF(dto.FromPhone.NotNullOrEmpty(), (snapshot, order) => order.FromPhone.Contains(dto.FromPhone))
+            .WhereIF(dto.Label.NotNullOrEmpty(), (snapshot, order) => snapshot.LabelName.Contains(dto.Label))
+            .WhereIF(dto.BeginSignTime.HasValue && dto.EndSignTime.HasValue, (snapshot, order) => snapshot.SignTime >= dto.BeginSignTime && snapshot.SignTime <= dto.EndSignTime)
+            .OrderByDescending((snapshot, order) => snapshot.CreationTime)
+            .Select((snapshot, order) => new SignedOrderSnapshotItemsOutDto
+            { 
+                LabelName = snapshot.LabelName,
+                OrderId = order.Id,
+                SignTime = snapshot.SignTime,
+                SignUserName = snapshot.SignUserName,
+                SourceChannel = order.SourceChannel,
+            }, true);
+
+        return query;
+    }
+
 }

+ 26 - 0
src/Hotline.Application/Snapshot/RedPackApplication.cs

@@ -464,6 +464,32 @@ public class RedPackApplication : IRedPackApplication, IScopeDependency
         return query;
     }
 
+    public ISugarQueryable<SnapshotRedPackRecordSendOutDto> GetRedPackRecordDetailAsync(SnapshotRedPackRecordSendInDto dto)
+    {
+        var query = _redPackRecordRepository.Queryable()
+            .LeftJoin<OrderSnapshot>((m , snapshot) => m.OrderId == snapshot.Id)
+            .LeftJoin<Order>((m , snapshot, order) => m.OrderId == order.Id)
+            .Where(m => m.DistributionState != EReadPackSendStatus.Unsend)
+            .WhereIF(dto.Status == 1, m => m.PickupStatus == ERedPackPickupStatus.Received)
+            .WhereIF(dto.Status == 2, m => m.PickupStatus == ERedPackPickupStatus.Back)
+            .WhereIF(dto.Status == 3, m => m.DistributionState == EReadPackSendStatus.Fail)
+            .WhereIF(dto.Status == 4, m => m.PickupStatus == ERedPackPickupStatus.Unreceived)
+            .WhereIF(dto.IndustryId.NotNullOrEmpty(), (m, snapshot) => snapshot.IndustryId == dto.IndustryId)
+            .WhereIF(dto.No.NotNullOrEmpty(), order => order.No.Contains(dto.No))
+            .WhereIF(dto.UserType.HasValue, m => m.PeopleType == dto.UserType)
+            .WhereIF(dto.OpenId.NotNullOrEmpty(), m => m.WXOpenId == dto.OpenId)
+            .WhereIF(dto.SendStatus.HasValue, m => m.DistributionState == dto.SendStatus)
+            .WhereIF(dto.IsReceive.HasValue && dto.IsReceive == true, m => m.PickupStatus == ERedPackPickupStatus.Received)
+            .WhereIF(dto.IsReceive.HasValue && dto.IsReceive == false, m => m.PickupStatus == ERedPackPickupStatus.Unreceived)
+            .WhereIF(dto.BeginCreationTime.HasValue && dto.EndCreationTime.HasValue, m => m.CreationTime >= dto.BeginCreationTime && m.CreationTime <= dto.EndCreationTime)
+            .Select(m => new SnapshotRedPackRecordSendOutDto
+            { 
+                OrderId = m.OrderId,
+                UserType = m.PeopleType
+            }, true);
+        return query;
+    }
+
 
     #endregion
 }

+ 5 - 3
src/Hotline.Application/Snapshot/SnapshotApplicationBase.cs

@@ -51,7 +51,7 @@ public abstract class SnapshotApplicationBase
     /// <summary>
     /// 行业
     /// </summary>
-    private readonly IRepository<Industry> _industryRepository;
+    private readonly IIndustryRepository _industryRepository;
     private readonly IThirdIdentiyService _thirdLoginService;
     private readonly ISessionContext _sessionContext;
     private readonly IRepository<RedPackRecord> _redPackRecordRepository;
@@ -78,7 +78,7 @@ public abstract class SnapshotApplicationBase
     private readonly IOrderVisitRepository _orderVisitRepository;
     private readonly IOrderVisitDetailRepository _orderVisitDetailRepository;
 
-    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, IOrderVisitRepository orderVisitRepository, IOrderVisitDetailRepository orderVisitDetailRepository, IRedPackGuiderAuditRepository redPackGuiderAuditRepository)
+    public SnapshotApplicationBase(IThirdIdentiyService thirdLoginService, IIndustryRepository 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, IOrderVisitRepository orderVisitRepository, IOrderVisitDetailRepository orderVisitDetailRepository, IRedPackGuiderAuditRepository redPackGuiderAuditRepository)
     {
         _thirdLoginService = thirdLoginService;
         _industryRepository = industryRepository;
@@ -564,7 +564,9 @@ public abstract class SnapshotApplicationBase
         _systemLog.Add(LogName, $"OrderNo: {order.No}", status: 1);
         if (result.Code == 0)
         {
-            await _capPublisher.PublishAsync(EventNames.GuiderSystemReplyDelay, new PostGuiderSystemDelayed(order.Id));
+            double intervalTime = await _industryRepository.GetIntervalTimeAsync(orderSnapshot.IndustryId, _sysSetting.OvertimeBack, cancellationToken);
+            _systemLog.Add(LogName, $"OrderNo: {order.No}", $"intervalTime: {intervalTime} overtimeBack: {_sysSetting.OvertimeBack}");
+            await _capPublisher.PublishDelayAsync(TimeSpan.FromHours(intervalTime), EventNames.GuiderSystemReplyDelay, new PostGuiderSystemDelayed(order.Id), cancellationToken: cancellationToken);
         }
     }
 

+ 1 - 1
src/Hotline.Application/Snapshot/ZiGongSnapshotApplication.cs

@@ -24,7 +24,7 @@ namespace Hotline.Application.Snapshot;
 [Injection(AppScopes = EAppScope.ZiGong)]
 public class ZiGongSnapshotApplication : SnapshotApplicationBase, ISnapshotApplication, IScopeDependency
 {
-    public ZiGongSnapshotApplication(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, IOrderVisitRepository orderVisitRepository, IOrderVisitDetailRepository orderVisitDetailRepository, IRedPackGuiderAuditRepository redPackGuiderAuditRepository) : base(thirdLoginService, industryRepository, bulletinRepository, sessionContext, redPackRecordRepository, orderRepository, thirdAccountRepository, orderSnapshotRepository, systemSettingCacheManager, systemAreaDomainService, fileRepository, systemDicDataCacheManager, snapshotOrderPublishRepository, workflowTraceRepository, practitionerRepository, systemAreaRepository, volunteerRepository, volunteerReportRepository, systemLog, guiderSystemService, capPublisher, publisher, guiderInfoRepository, fileDomainService, communityInfoRepository, redPackAuditRepository, orderVisitRepository, orderVisitDetailRepository, redPackGuiderAuditRepository)
+    public ZiGongSnapshotApplication(IThirdIdentiyService thirdLoginService, IIndustryRepository 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, IOrderVisitRepository orderVisitRepository, IOrderVisitDetailRepository orderVisitDetailRepository, IRedPackGuiderAuditRepository redPackGuiderAuditRepository) : base(thirdLoginService, industryRepository, bulletinRepository, sessionContext, redPackRecordRepository, orderRepository, thirdAccountRepository, orderSnapshotRepository, systemSettingCacheManager, systemAreaDomainService, fileRepository, systemDicDataCacheManager, snapshotOrderPublishRepository, workflowTraceRepository, practitionerRepository, systemAreaRepository, volunteerRepository, volunteerReportRepository, systemLog, guiderSystemService, capPublisher, publisher, guiderInfoRepository, fileDomainService, communityInfoRepository, redPackAuditRepository, orderVisitRepository, orderVisitDetailRepository, redPackGuiderAuditRepository)
     {
     }
 }

+ 8 - 0
src/Hotline.Repository.SqlSugar/Snapshot/IndustryRepository.cs

@@ -16,4 +16,12 @@ public class IndustryRepository : BaseRepository<Industry>, IIndustryRepository,
     public IndustryRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
     {
     }
+
+    public async Task<double> GetIntervalTimeAsync(string industryId, double defaultValue,  CancellationToken cancellationToken)
+    {
+        var time = await Queryable().Where(m => m.Id == industryId).Select(m => m.IntervalTime).FirstAsync(cancellationToken);
+        if (time <= 0)
+            return defaultValue;
+        return time;
+    }
 }

+ 18 - 0
src/Hotline.Repository.SqlSugar/Snapshot/InviteCodeRepository.cs

@@ -0,0 +1,18 @@
+using Hotline.Snapshot.Interfaces;
+using Hotline.Snapshot;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Dependency;
+using SqlSugar;
+using Hotline.Repository.SqlSugar.DataPermissions;
+
+namespace Hotline.Repository.SqlSugar.Snapshot;
+public class InviteCodeRepository : BaseRepository<InviteCode>, IInviteCodeRepository, IScopeDependency
+{
+    public InviteCodeRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
+    {
+    }
+}

+ 2 - 1
src/Hotline.Repository.SqlSugar/System/SystemLogRepository.cs

@@ -18,7 +18,7 @@ public class SystemLogRepository : BaseRepository<SystemLog>, ISystemLogReposito
     {
     }
 
-    public void Add(string name, string executeParam = "", string remark = "", [CallerMemberName]string executeUrl = "", int status = 0, string ipUrl = "")
+    public void Add(string name, string executeParam = "", string remark = "", [CallerMemberName]string executeUrl = "", int status = 0, string ipUrl = "", string executeResult = "")
     {
         try
         {
@@ -26,6 +26,7 @@ public class SystemLogRepository : BaseRepository<SystemLog>, ISystemLogReposito
             {
                 Name = name,
                 ExecuteParam = executeParam,
+                ExecuteResult = executeResult,
                 ExecuteUrl = executeUrl,
                 Remark = remark,
                 Status = status,

+ 47 - 0
src/Hotline.Share/Dtos/Snapshot/InviteCodeDto.cs

@@ -0,0 +1,47 @@
+using Hotline.Share.Requests;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Dtos.Snapshot;
+public class InviteCodeDto
+{
+}
+
+public record GetInviteCodeItemsInDto : PagedRequest;
+
+public class AddInviteCodeInDto
+{
+    /// <summary>
+    /// 邀请码开始
+    /// 邀请码开始 -> 结束 范围内的邀请码都有效
+    /// </summary>
+    [Required]
+    public int BeginCode { get; set; }
+
+    /// <summary>
+    /// 邀请码结束
+    /// 邀请码开始 -> 结束 范围内的邀请码都有效
+    /// </summary>
+    [Required]
+    public int EndCode { get; set; }
+
+    /// <summary>
+    /// 部门名称
+    /// </summary>
+    [Required]
+    public string OrgName { get; set; }
+
+    /// <summary>
+    /// 上级部门ID
+    /// </summary>
+    public string ParentOrgId { get; set; }
+
+    /// <summary>
+    /// 邀请码Url
+    /// </summary>
+    public string QRCodeUrl { get; set; }
+}

+ 119 - 2
src/Hotline.Share/Dtos/Snapshot/OrderDto.cs

@@ -981,6 +981,118 @@ public class GuiderReplyItemsOutDto
     public string? NetworkENumber { get; set; }
 }
 
+public record SignedOrderSnapshotItemsInDto : PagedRequest
+{
+    /// <summary>
+    /// 受理编号
+    /// </summary>
+    public string? No { get; set; }
+
+    /// <summary>
+    /// 标题
+    /// </summary>
+    public string? Title { get; set; }
+
+    /// <summary>
+    /// 来电人
+    /// </summary>
+    public string? FromName { get; set; }
+
+    /// <summary>
+    /// 来电人电话
+    /// </summary>
+    public string? FromPhone { get; set; }
+
+    /// <summary>
+    /// 标注类型
+    /// </summary>
+    public string? Label { get; set; }
+
+    /// <summary>
+    /// 标注开始时间
+    /// </summary>
+    public DateTime? BeginSignTime { get; set; }
+
+    /// <summary>
+    /// 标注结束时间
+    /// </summary>
+    public DateTime? EndSignTime { get; set; }
+}
+
+
+public class SignedOrderSnapshotItemsOutDto
+{
+    /// <summary>
+    /// Id
+    /// </summary>
+    public string OrderId { get; set; }
+
+    /// <summary>
+    /// 受理编号
+    /// </summary>
+    public string No { get; set; }
+
+    /// <summary>
+    /// 信件状态
+    /// </summary>
+    public EOrderStatus Status { get; set; }
+
+    /// <summary>
+    /// 信件状态
+    /// </summary>
+    public string StatusTxt => Status.GetDescription();
+
+    /// <summary>
+    /// 来源
+    /// </summary>
+    public string SourceChannel { get; set; }
+
+    /// <summary>
+    /// 标题
+    /// </summary>
+    public string Title { get; set; }
+
+    /// <summary>
+    /// 来电人姓名
+    /// </summary>
+    public string FromName { get; set; }
+
+    /// <summary>
+    /// 来电人电话
+    /// </summary>
+    public string FromPhone { get; set; }
+
+    /// <summary>
+    /// 区域
+    /// </summary>
+    public string County { get; set; }
+
+    /// <summary>
+    /// 行业
+    /// </summary>
+    public string IndustryName { get; set; }
+
+    /// <summary>
+    /// 受理时间
+    /// </summary>
+    public DateTime CreationTime { get; set; }
+
+    /// <summary>
+    /// 标注人
+    /// </summary>
+    public string? SignUserName { get; set; }
+
+    /// <summary>
+    /// 标注类型
+    /// </summary>
+    public string LabelName { get; set; }
+
+    /// <summary>
+    /// 标记时间
+    /// </summary>
+    public DateTime? SignTime { get; set; }
+}
+
 public record SignOrderSnapshotItemsInDto : PagedRequest
 {
     /// <summary>
@@ -1851,12 +1963,17 @@ public class SignOrderSnapshotDetailOutDto
     public string Id { get; set; }
 
     /// <summary>
-    /// 标签
+    /// 已选中的标签
     /// </summary>
-    public IReadOnlyCollection<SystemDicDataOutDto> Lables { get; set; }
+    public IList<Kv> Lables { get; set; }
 
     /// <summary>
     /// 标题
     /// </summary>
     public string Title { get; set; }
+
+    /// <summary>
+    /// 基础数据
+    /// </summary>
+    public IReadOnlyCollection<SystemDicDataOutDto> LabelsBaseData { get; set; }
 }

+ 141 - 0
src/Hotline.Share/Dtos/Snapshot/RedPackRecordDto.cs

@@ -12,6 +12,147 @@ internal class RedPackRecordDto
 {
 }
 
+public class SnapshotRedPackRecordSendOutDto
+{
+    /// <summary>
+    /// Id
+    /// </summary>
+    public string Id { get; set; }
+
+    /// <summary>
+    /// 工单Id
+    /// </summary>
+    public string OrderId { get; set; }
+
+    /// <summary>
+    /// No
+    /// </summary>
+    public string No { get; set; }
+
+    /// <summary>
+    /// 用户类型
+    /// </summary>
+    public EReadPackUserType UserType { get; set; }
+
+    /// <summary>
+    /// 用户类型
+    /// </summary>
+    public string UserTypeTxt => UserType.GetDescription();
+
+    /// <summary>
+    /// 行业
+    /// </summary>
+    public string IndustryName { get; set; }
+
+    /// <summary>
+    /// OpenId
+    /// </summary>
+    public string WXOpenId { get; set; }
+
+    /// <summary>
+    /// 商户订单号
+    /// </summary>
+    public string MerchantCode { get; set; }
+
+    /// <summary>
+    /// 金额
+    /// </summary>
+    public double Amount { get; set; }
+
+    /// <summary>
+    /// 发放时间
+    /// </summary>
+    public DateTime CreationTime { get; set; }
+
+    /// <summary>
+    /// 发放状态
+    /// </summary>
+    public EReadPackSendStatus DistributionState { get; set; }
+
+    /// <summary>
+    /// 发放状态
+    /// </summary>
+    public string DistributionStateTxt => DistributionState.GetDescription();
+
+    /// <summary>
+    /// 领取状态
+    /// </summary>
+    public ERedPackPickupStatus PickupStatus { get; set; }
+
+    /// <summary>
+    /// 领取状态
+    /// </summary>
+    public string PickupStatusTxt => PickupStatus.GetDescription();
+
+    /// <summary>
+    /// 领取操作时间
+    /// </summary>
+    public DateTime? ReceiveTime { get; set; }
+
+    /// <summary>
+    /// 备注
+    /// </summary>
+    public string? Remark { get; set; }
+}
+
+public record SnapshotRedPackRecordSendInDto : PagedRequest
+{
+    /// <summary>
+    /// 状态;
+    /// 0: 全部;
+    /// 1: 已领取;
+    /// 2: 已退款;
+    /// 3: 发放失败;
+    /// 4: 待领取;
+    /// </summary>
+    public int Status { get; set; }
+
+    /// <summary>
+    /// 行业
+    /// </summary>
+    public string? IndustryId { get; set; }
+
+    /// <summary>
+    /// 编号
+    /// </summary>
+    public string? No { get; set; }
+
+    /// <summary>
+    /// 发放用户类型
+    /// </summary>
+    public EReadPackUserType? UserType { get; set; }
+
+    /// <summary>
+    /// 用户OpenId
+    /// </summary>
+    public string? OpenId { get; set; }
+
+    /// <summary>
+    /// 发送状态
+    /// </summary>
+    public EReadPackSendStatus? SendStatus { get; set; }
+
+    /// <summary>
+    /// 是否领取
+    /// </summary>
+    public bool? IsReceive { get; set; }
+
+    /// <summary>
+    /// 是否补领
+    /// </summary>
+    public bool? IsReplace { get; set; }
+
+    /// <summary>
+    /// 发放时间开始
+    /// </summary>
+    public DateTime? BeginCreationTime { get; set; }
+
+    /// <summary>
+    /// 发放时间结束
+    /// </summary>
+    public DateTime? EndCreationTime { get; set; }
+}
+
 public record SnapshotRedPackRecordItemsGuiderInDto : SnapshotRedPackRecordItemsInDto
 {
     /// <summary>

+ 1 - 1
src/Hotline/Caching/Interfaces/ISystemSettingCacheManager.cs

@@ -87,7 +87,7 @@ namespace Hotline.Caching.Interfaces
         /// 网格员回复等待时间(单位:小时)
         /// 超过该时间自动退回工单
         /// </summary>
-        int OvertimeBack { get; }
+        double OvertimeBack { get; }
 
         /// <summary>
         /// 天阙服务AppKey|AppSecret

+ 2 - 2
src/Hotline/Caching/Services/SystemSettingCacheManager.cs

@@ -179,8 +179,8 @@ namespace Hotline.Caching.Services
         /// 网格员回复等待时间(单位:小时)
         /// 超过该时间自动退回工单
         /// </summary>
-        public int OvertimeBack =>
-            GetOrDefault("08dd18e0-1c9e-4aa5-8dc6-f639e8d1b3ea", SettingConstants.OvertimeBack, "网格员回复等待时间(单元小时)", 4, "网格员回复等待时间(单位:小时), 超过该时间自动退回工单");
+        public double OvertimeBack =>
+            GetOrDefault("08dd18e0-1c9e-4aa5-8dc6-f639e8d1b3ea", SettingConstants.OvertimeBack, "网格员回复等待时间(单元小时)", 4d, "网格员回复等待时间(单位:小时), 超过该时间自动退回工单");
 
         /// <summary>
         /// 天阙服务AppKey|AppSecret

+ 1 - 1
src/Hotline/Settings/ISystemLogRepository.cs

@@ -18,5 +18,5 @@ public interface ISystemLogRepository : IRepository<SystemLog>
     /// <param name="remark">备注</param>
     /// <param name="status">状态(0失败 1成功)</param>
     /// <returns></returns>
-    void Add(string name, string executeParam = "", string remark = "", [CallerMemberName]string executeUrl = "", int status = 0, string ipUrl = "");
+    void Add(string name, string executeParam = "", string remark = "", [CallerMemberName]string executeUrl = "", int status = 0, string ipUrl = "", string executeResult = "");
 }

+ 1 - 0
src/Hotline/Snapshot/Interfaces/IIndustryRepository.cs

@@ -9,4 +9,5 @@ using XF.Domain.Repository;
 namespace Hotline.Snapshot.Interfaces;
 public interface IIndustryRepository : IRepository<Industry>
 {
+    Task<double> GetIntervalTimeAsync(string industryId, double defaultValue, CancellationToken cancellationToken);
 }

+ 13 - 0
src/Hotline/Snapshot/Interfaces/IInviteCodeRepository.cs

@@ -0,0 +1,13 @@
+using Microsoft.EntityFrameworkCore.Metadata;
+using SqlSugar;
+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 IInviteCodeRepository : IRepository<InviteCode>
+{
+}

+ 31 - 31
src/Hotline/Snapshot/InviteCode.cs

@@ -12,38 +12,38 @@ namespace Hotline.Snapshot;
 /// <summary>
 /// 邀请码
 /// </summary>
-//[Description("邀请码")]
-//public class InviteCode : CreationSoftDeleteEntity
-//{
-//    /// <summary>
-//    /// 邀请码开始
-//    /// 邀请码开始 -> 结束 范围内的邀请码都有效
-//    /// </summary>
-//    [SugarColumn(ColumnDescription = "邀请码开始")]
-//    public string BeginCode { get; set; }
+[Description("邀请码")]
+public class InviteCode : CreationSoftDeleteEntity
+{
+    /// <summary>
+    /// 邀请码开始
+    /// 邀请码开始 -> 结束 范围内的邀请码都有效
+    /// </summary>
+    [SugarColumn(ColumnDescription = "邀请码开始")]
+    public int BeginCode { get; set; }
 
-//    /// <summary>
-//    /// 邀请码结束
-//    /// 邀请码开始 -> 结束 范围内的邀请码都有效
-//    /// </summary>
-//    [SugarColumn(ColumnDescription = "邀请码结束")]
-//    public string EndCode { get; set; }
+    /// <summary>
+    /// 邀请码结束
+    /// 邀请码开始 -> 结束 范围内的邀请码都有效
+    /// </summary>
+    [SugarColumn(ColumnDescription = "邀请码结束")]
+    public int EndCode { get; set; }
 
-//    /// <summary>
-//    /// 部门名称
-//    /// </summary>
-//    [SugarColumn(ColumnDescription = "部门名称")]
-//    public string OrgName { get; set; }
+    /// <summary>
+    /// 部门名称
+    /// </summary>
+    [SugarColumn(ColumnDescription = "部门名称")]
+    public string OrgName { get; set; }
 
-//    /// <summary>
-//    /// 上级部门ID
-//    /// </summary>
-//    [SugarColumn(ColumnDescription = "上级部门ID")]
-//    public string ParentOrgId { get; set; }
+    /// <summary>
+    /// 上级部门ID
+    /// </summary>
+    [SugarColumn(ColumnDescription = "上级部门ID")]
+    public string ParentOrgId { get; set; }
 
-//    /// <summary>
-//    /// 邀请码Url
-//    /// </summary>
-//    [SugarColumn(ColumnDescription = "邀请码Url")]
-//    public string QRCodeUrl { get; set; }
-//}
+    /// <summary>
+    /// 邀请码Url
+    /// </summary>
+    [SugarColumn(ColumnDescription = "邀请码Url")]
+    public string QRCodeUrl { get; set; }
+}

+ 18 - 10
src/TianQue.Sdk/TiqnQueService.cs

@@ -38,12 +38,17 @@ public class TiqnQueService : IGuiderSystemService, IScopeDependency
     /// <returns></returns>
     public async Task<ApiResponse<GuiderSystemOutDto>> PostOrder(Order order, OrderSnapshot orderSnapshot, ThirdTokenDto tokenDto)
     {
+        var baseUrl = _sysSetting.TianQuanPostAcceptInfoApi;
         TQHttpClient httpClient;
-#if DEBUG
-         httpClient = new TQHttpClient(tokenDto.Secret, tokenDto.AppId, "171.94.154.2", 22, "root" , "ZGbyy@2024!", _logger);
-#else
-         httpClient = new TQHttpClient(tokenDto.Secret, tokenDto.AppId, _logger);
-#endif
+        var isDbueg = baseUrl.Contains("test");
+        if (isDbueg)
+        {
+            httpClient = new TQHttpClient(tokenDto.Secret, tokenDto.AppId, "171.94.154.2", 22, "root", "ZGbyy@2024!", _logger);
+        }
+        else
+        {
+            httpClient = new TQHttpClient(tokenDto.Secret, tokenDto.AppId, _logger);
+        }
         var acceptInfo = order.Adapt<AcceptInfo>();
         acceptInfo.ReplyCode = order.No!; // 唯一标识
         acceptInfo.TypeName = order.AcceptType!; // 诉求类型名称
@@ -56,11 +61,14 @@ public class TiqnQueService : IGuiderSystemService, IScopeDependency
         acceptInfo.RootCategoryInfo = ""; // order.HotspotName!; // 热点分类(大类)
         acceptInfo.CategoryInfo = "";// order.HotspotSpliceName!; // 热点分类(小类)
         acceptInfo.DeadLine = orderSnapshot.DeadLine!.Value; // 截止时间
-#if DEBUG
-        acceptInfo.Prod = false; // 正式/测试
-#else
-        acceptInfo.Prod = true; // 正式/测试
-#endif
+        if(isDbueg)
+        {
+            acceptInfo.Prod = false; // 正式/测试
+        }
+        else
+        {
+            acceptInfo.Prod = true; // 正式/测试
+        }
 
         // 反映人信息
         acceptInfo.PersonList = new List<PersonInfo>