Browse Source

合并冲突

qinchaoyue 4 months ago
parent
commit
93b0249822
25 changed files with 368 additions and 180 deletions
  1. 40 8
      src/Hotline.Api/Controllers/OrderController.cs
  2. 19 2
      src/Hotline.Api/Controllers/Snapshot/RedPackController.cs
  3. 7 0
      src/Hotline.Application/FlowEngine/WorkflowApplication.cs
  4. 7 2
      src/Hotline.Application/Handlers/FlowEngine/WorkflowNextHandler.cs
  5. 1 1
      src/Hotline.Application/Orders/Handles/OrderHandler/AddOrderPushMessageNotifyHandler.cs
  6. 1 1
      src/Hotline.Application/Orders/Handles/OrderHandler/GetOrderDetailNotifyHandler.cs
  7. 1 1
      src/Hotline.Application/Orders/Handles/OrderHandler/OrderRelateCallHandler.cs
  8. 1 1
      src/Hotline.Application/Orders/Handles/OrderHandler/OrderVisitSmsHandler.cs
  9. 3 3
      src/Hotline.Application/Orders/Handles/OrderHandler/TranspondCityNotifyHandler.cs
  10. 1 1
      src/Hotline.Application/Orders/Handles/OrderHandler/UpdateOrderPushMessageNotifyHandler.cs
  11. 9 9
      src/Hotline.Application/Orders/Handles/OrderScreenHandler/OrderScreenEndWorkflowHandler.cs
  12. 102 0
      src/Hotline.Application/Orders/Handles/OrderScreenHandler/OrderScreenNextWorkflowHandler.cs
  13. 37 0
      src/Hotline.Application/Orders/Handles/OrderScreenHandler/OrderScreenStartWorkflowHandler.cs
  14. 1 1
      src/Hotline.Application/Orders/Handles/SnapshotHandler/GuiderSystemTimeoutHandler.cs
  15. 0 102
      src/Hotline.Application/Orders/OrderScreenHandler/OrderScreenNextWorkflowHandler.cs
  16. 0 37
      src/Hotline.Application/Orders/OrderScreenHandler/OrderScreenStartWorkflowHandler.cs
  17. 7 0
      src/Hotline.Application/Snapshot/IRedPackApplication.cs
  18. 26 1
      src/Hotline.Application/Snapshot/RedPackApplication.cs
  19. 17 9
      src/Hotline.Share/Dtos/FlowEngine/BasicWorkflowDto.cs
  20. 2 0
      src/Hotline.Share/Dtos/FlowEngine/NextStepOption.cs
  21. 9 0
      src/Hotline.Share/Dtos/Order/OrderStartFlowDto.cs
  22. 30 0
      src/Hotline.Share/Dtos/Snapshot/RedPackDto.cs
  23. 28 0
      src/Hotline.Share/Enums/Snapshot/ERedPackPickupFailCase.cs
  24. 7 1
      src/Hotline.Share/Enums/Snapshot/ERedPackPickupStatus.cs
  25. 12 0
      src/Hotline/Snapshot/RedPackRecord.cs

+ 40 - 8
src/Hotline.Api/Controllers/OrderController.cs

@@ -18,7 +18,6 @@ using Hotline.Import;
 using Hotline.Orders;
 using Hotline.Orders.Notifications;
 using Hotline.OrderTranspond;
-using Hotline.Permissions;
 using Hotline.Push.FWMessage;
 using Hotline.Push.Notifies;
 using Hotline.Repository.SqlSugar.CallCenter;
@@ -66,13 +65,14 @@ using XF.Utility.EnumExtensions;
 using Hotline.Application.Contracts.Validators.FlowEngine;
 using Hotline.Authentications;
 using Hotline.Share.Dtos.CallCenter;
-using NPOI.SS.Formula.Functions;
-using System.Threading;
 using Hotline.Share.Mq;
 using Hotline.CallCenter.Calls;
+using Hotline.FlowEngine.Notifications;
 using Hotline.Share.Dtos.Order.Detail;
 using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.Org;
+using Hotline.Snapshot.Interfaces;
+using Hotline.Snapshot.Notifications;
 
 namespace Hotline.Api.Controllers;
 
@@ -127,7 +127,6 @@ public class OrderController : BaseController
     private readonly IOrderApplication _orderApplication;
     private readonly IPushDomainService _pushDomainService;
     private readonly ILogger<OrderController> _logger;
-    private readonly ITypedCache<YbEnterpriseToken> _cacheResponse;
     private readonly IRepository<OrderSendBackAudit> _orderSendBackAuditRepository;
     private readonly IRepository<User> _userRepository;
     private readonly IExportApplication _exportApplication;
@@ -149,6 +148,7 @@ public class OrderController : BaseController
     private readonly IOrderTerminateRepository _orderTerminateRepository;
     private readonly ISystemLogApplication _systemLogApplication;
     private readonly IRepository<OrderCarboncopy> _orderCarboncopy;
+    private readonly IOrderSnapshotRepository _orderSnapshotRepository;
 
     public OrderController(
         IOrderDomainService orderDomainService,
@@ -216,7 +216,8 @@ public class OrderController : BaseController
         IOrderTerminateRepository orderTerminateRepository,
         IRepository<OrderCarboncopy> orderCarboncopy,
         ITypedCache<string> typeCache,
-        ISystemLogApplication systemLogApplication)
+        ISystemLogApplication systemLogApplication,
+        IOrderSnapshotRepository orderSnapshotRepository)
     {
         _orderDomainService = orderDomainService;
         _orderRepository = orderRepository;
@@ -260,7 +261,6 @@ public class OrderController : BaseController
         _logger = logger;
         _orderApplication = orderApplication;
         _pushDomainService = pushDomainService;
-        _cacheResponse = cacheResponse;
         _orderSendBackAuditRepository = orderSendBackAuditRepository;
         _userRepository = userRepository;
         _exportApplication = exportApplication;
@@ -285,6 +285,7 @@ public class OrderController : BaseController
         _typeCache = typeCache;
         _baseDataApplication = baseDataApplication;
         _systemLogApplication = systemLogApplication;
+        _orderSnapshotRepository = orderSnapshotRepository;
     }
 
     #endregion
@@ -3907,6 +3908,20 @@ public class OrderController : BaseController
             outDto.Opinion = await _typeCache.GetAsync($"tmp_opinion_{orderId}{_sessionContext.UserId}", HttpContext.RequestAborted);
         }
 
+        //随手拍
+        bool.TryParse(_systemSettingCacheManager.GetSetting(SettingConstants.Snapshot)?.SettingValue[0],
+            out bool isSnapshotEnable);
+        if (isSnapshotEnable)
+        {
+            var orderSnapshot = await _orderSnapshotRepository.GetAsync(orderId, HttpContext.RequestAborted);
+            if (orderSnapshot is null)
+                throw new UserFriendlyException($"无效编号, id: {orderId}");
+            if (string.CompareOrdinal(orderSnapshot.IndustryName, "安全隐患") == 0)
+            {
+                outDto.Steps = outDto.Steps.Where(d => d.BusinessType != EBusinessType.Send).ToList();
+            }
+        }
+
         return outDto;
     }
 
@@ -3923,8 +3938,25 @@ public class OrderController : BaseController
                 $"非法参数, {string.Join(',', validResult.Errors.Select(d => d.ErrorMessage))}");
         var order = await _orderApplication.SaveOrderWorkflowInfo(dto, HttpContext.RequestAborted);
 
-        var workflow = await _workflowDomainService.GetWorkflowAsync(dto.Workflow.WorkflowId, withDefine: true,
-            withSteps: true, withTraces: true, cancellationToken: HttpContext.RequestAborted);
+        //随手拍推送网格员
+        bool.TryParse(
+            _systemSettingCacheManager.GetSetting(SettingConstants.Snapshot)?.SettingValue[0],
+            out bool isSnapshotEnable);
+        if (isSnapshotEnable)
+        {
+            if (string.Compare(TagDefaults.OrderMark, dto.Workflow.Tag,
+                    StringComparison.OrdinalIgnoreCase) == 0)
+            {
+                var orderSnapshot = await _orderSnapshotRepository.GetAsync(order.Id, HttpContext.RequestAborted);
+                if (orderSnapshot is null)
+                    throw new UserFriendlyException($"无效编号, id: {order.Id}");
+                orderSnapshot.IsSafetyDepartment = dto.Data.IsSafetyDepartment;
+                await _orderSnapshotRepository.UpdateAsync(orderSnapshot, HttpContext.RequestAborted);
+            }
+        }
+
+        var workflow = await _workflowDomainService.GetWorkflowAsync(dto.Workflow.WorkflowId, withDefine: true, withSteps: true, withTraces: true,
+            cancellationToken: HttpContext.RequestAborted);
 
         //await _workflowApplication.NextAsync(dto.WorkflowDto, order.ExpiredTime, HttpContext.RequestAborted);
         var startStep = workflow.Steps.First(d => d.Id == dto.Workflow.StepId);

+ 19 - 2
src/Hotline.Api/Controllers/Snapshot/RedPackController.cs

@@ -8,6 +8,7 @@ using Hotline.Snapshot.Interfaces;
 using Hotline.Caching.Interfaces;
 using XF.Utility.EnumExtensions;
 using Hotline.Share.Enums.Snapshot;
+using Quartz.Impl.Triggers;
 
 namespace Hotline.Api.Controllers.Snapshot;
 
@@ -48,8 +49,24 @@ public class RedPackController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    //[HttpPut("audit/remark")]
-    //public async Task
+    [HttpPut("audit/remark")]
+    public async Task UpdateRedPackAuditRemarkAsync([FromBody] UpdateRedPackAuditRemarkInDto dto)
+        => await _redPackApplication.UpdateRedPackAuditRemarkAsync(dto);
+
+    /// <summary>
+    /// 添加备注页面基础信息
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpPut("audit/remark/basedata")]
+    public async Task<Dictionary<string, object>> UpdateRedPackAuditRemarkBaseDataAsync([FromBody] UpdateRedPackAuditRemarkInDto dto)
+    {
+        return new Dictionary<string, object>()
+        {
+            { "failCase", EnumExts.GetDescriptions<ERedPackPickupFailCase>() }
+        };
+    }
+
 
     /// <summary>
     /// 红包审核通过或拒绝

+ 7 - 0
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -572,6 +572,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 StepType = stepDefine.StepType,
                 BusinessType = stepDefine.BusinessType,
                 HandlerType = stepDefine.HandlerType,
+                Tag = stepDefine.Tag ?? string.Empty,
                 OrgLevel = stepDefine.HandlerType is EHandlerType.OrgLevel ? orgLevel : null,
             };
             var orgs = await _organizeRepository.Queryable()
@@ -869,6 +870,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                     BusinessType = stepDefine.BusinessType,
                     //HandlerType = stepDefine.HandlerType,
                     HandlerType = EHandlerType.AssignedUser, //指定办理人(业务需求)
+                    Tag = stepDefine.Tag ?? string.Empty,
                     Items = new List<FlowStepHandler> { handler } //handlers
                 };
             }
@@ -901,6 +903,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 StepType = stepDefine.StepType,
                 BusinessType = stepDefine.BusinessType,
                 HandlerType = stepDefine.HandlerType,
+                Tag = stepDefine.Tag ?? string.Empty,
                 Items = handlers
             };
         }
@@ -1045,6 +1048,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             StepType = stepDefine.StepType,
             BusinessType = stepDefine.BusinessType,
             HandlerType = stepDefine.HandlerType,
+            Tag = stepDefine.Tag ?? string.Empty,
             OrgLevel = stepDefine.HandlerType is EHandlerType.OrgLevel ? orgLevel : null,
             Items = handlers
         };
@@ -1081,6 +1085,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             BusinessType = prevStep.BusinessType,
             //HandlerType = prevStep.HandlerType,
             HandlerType = EHandlerType.AssignedUser, //指定办理人(业务需求)
+            Tag = prevStep.Tag ?? string.Empty,
             Items = new List<FlowStepHandler> { handler } //handlers //new List<Kv> { new(prevStep.HandlerId, prevStep.HandlerName) },
         };
     }
@@ -1480,6 +1485,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             StepType = stepType,
             BusinessType = businessType,
             HandlerType = handlerType, //目前所有动态策略均属于部门等级
+            Tag = string.Empty,
             Items = items
         };
     }
@@ -1620,6 +1626,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             StepType = stepType,
             BusinessType = businessType,
             HandlerType = EHandlerType.OrgLevel, //目前所有动态策略均属于部门等级
+            Tag = string.Empty,
             Items = items
         };
     }

+ 7 - 2
src/Hotline.Application/Handlers/FlowEngine/WorkflowNextHandler.cs

@@ -23,6 +23,7 @@ using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Push;
 using Hotline.Share.Enums.Quality;
 using Hotline.Share.Mq;
+using Hotline.Snapshot.Interfaces;
 using Hotline.Snapshot.Notifications;
 using Hotline.Users;
 using Mapster;
@@ -33,6 +34,7 @@ using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Options;
 using XF.Domain.Authentications;
 using XF.Domain.Entities;
+using XF.Domain.Exceptions;
 using XF.Domain.Repository;
 
 namespace Hotline.Application.Handlers.FlowEngine;
@@ -41,6 +43,7 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
 {
     private readonly IOrderDomainService _orderDomainService;
     private readonly ICalcExpireTime _expireTime;
+    private readonly IOrderSnapshotRepository _orderSnapshotRepository;
     private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
     private readonly IOrderRepository _orderRepository;
     private readonly ICapPublisher _capPublisher;
@@ -70,7 +73,8 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
         ISystemSettingCacheManager systemSettingCacheManager,
         Publisher publisher,
         IOptionsSnapshot<AppConfiguration> appOptions,
-        ICalcExpireTime expireTime)
+        ICalcExpireTime expireTime,
+        IOrderSnapshotRepository orderSnapshotRepository)
     {
         _orderDomainService = orderDomainService;
         _orderRepository = orderRepository;
@@ -87,6 +91,7 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
         _publisher = publisher;
         _appOptions = appOptions;
         _expireTime = expireTime;
+        _orderSnapshotRepository = orderSnapshotRepository;
     }
 
     /// <summary>Handles a notification</summary>
@@ -239,7 +244,7 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
                         out bool isSnapshotEnable);
                     if (isSnapshotEnable)
                     {
-                        if (string.Compare(notification.NextStepDefine.Tag, TagDefaults.Wanggeyuan,
+                        if (string.Compare(TagDefaults.Wanggeyuan, notification.NextStepDefine.Tag,
                                 StringComparison.OrdinalIgnoreCase) == 0)
                         {
                             await _publisher.PublishAsync(new PostGuiderSystemNotification(order.Id),

+ 1 - 1
src/Hotline.Application/Handlers/Order/AddOrderPushMessageNotifyHandler.cs → src/Hotline.Application/Orders/Handles/OrderHandler/AddOrderPushMessageNotifyHandler.cs

@@ -6,7 +6,7 @@ using Hotline.Share.Enums.Push;
 using MediatR;
 using Microsoft.Extensions.Logging;
 
-namespace Hotline.Application.Handlers.Order
+namespace Hotline.Application.Orders.Handles.Order
 {
     /// <summary>
     /// 新增工单发送短信

+ 1 - 1
src/Hotline.Application/Handlers/Order/GetOrderDetailNotifyHandler.cs → src/Hotline.Application/Orders/Handles/OrderHandler/GetOrderDetailNotifyHandler.cs

@@ -7,7 +7,7 @@ using Hotline.FlowEngine.Workflows;
 using Hotline.Orders.Notifications;
 using MediatR;
 
-namespace Hotline.Application.Handlers.Order
+namespace Hotline.Application.Orders.Handles.Order
 {
     public class GetOrderDetailNotifyHandler : INotificationHandler<GetOrderDetailNotify>
     {

+ 1 - 1
src/Hotline.Application/Handlers/Order/OrderRelateCallHandler.cs → src/Hotline.Application/Orders/Handles/OrderHandler/OrderRelateCallHandler.cs

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 using XF.Domain.Dependency;
 using XF.Domain.Repository;
 
-namespace Hotline.Application.Handlers.Order
+namespace Hotline.Application.Orders.Handles.Order
 {
     public class OrderRelateCallHandler : ICapSubscribe, ITransientDependency
     {

+ 1 - 1
src/Hotline.Application/Handlers/Order/OrderVisitSmsHandler.cs → src/Hotline.Application/Orders/Handles/OrderHandler/OrderVisitSmsHandler.cs

@@ -17,7 +17,7 @@ using MediatR;
 using XF.Domain.Dependency;
 using XF.Domain.Repository;
 
-namespace Hotline.Application.Handlers.Order;
+namespace Hotline.Application.Orders.Handles.Order;
 public class OrderVisitSmsHandler : INotificationHandler<ReceiveMessageNotify>
 {
     private readonly IOrderVisitDomainService _orderVisitDomainService;

+ 3 - 3
src/Hotline.Application/Handlers/Order/TranspondCityNotifyHandler.cs → src/Hotline.Application/Orders/Handles/OrderHandler/TranspondCityNotifyHandler.cs

@@ -13,9 +13,9 @@ using System;
 using Hotline.DI;
 using XF.Domain.Repository;
 
-namespace Hotline.Application.Handlers.Order
+namespace Hotline.Application.Orders.Handles.Order
 {
-   // [Injection(AppScopes = EAppScope.YiBin)]
+    // [Injection(AppScopes = EAppScope.YiBin)]
     public class TranspondCityNotifyHandler : INotificationHandler<OrderStartWorkflowNotify>
     {
         private readonly IMapper _mapper;
@@ -63,7 +63,7 @@ namespace Hotline.Application.Handlers.Order
                     if (order.Transpond.HasValue && order.Transpond.Value)
                     {
                         var orderDto = _mapper.Map<OrderDto>(order);
-                        await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderTranspondCity, orderDto);
+                        await _capPublisher.PublishAsync(Share.Mq.EventNames.HotlineOrderTranspondCity, orderDto);
                         //保存本地数据
                         TranspondCityRawData cityRawData = new TranspondCityRawData
                         {

+ 1 - 1
src/Hotline.Application/Handlers/Order/UpdateOrderPushMessageNotifyHandler.cs → src/Hotline.Application/Orders/Handles/OrderHandler/UpdateOrderPushMessageNotifyHandler.cs

@@ -6,7 +6,7 @@ using Hotline.Share.Enums.Push;
 using MediatR;
 using Microsoft.Extensions.Logging;
 
-namespace Hotline.Application.Handlers.Order
+namespace Hotline.Application.Orders.Handles.Order
 {
     public class UpdateOrderPushMessageNotifyHandler : INotificationHandler<UpdateOrderNotify>
     {

+ 9 - 9
src/Hotline.Application/Orders/OrderScreenHandler/OrderScreenEndWorkflowHandler.cs → src/Hotline.Application/Orders/Handles/OrderScreenHandler/OrderScreenEndWorkflowHandler.cs

@@ -1,25 +1,25 @@
 using DotNetCore.CAP;
+using Hotline.Configurations;
 using Hotline.FlowEngine.Notifications;
 using Hotline.FlowEngine.WorkflowModules;
 using Hotline.Orders;
+using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.Order;
 using MapsterMapper;
 using MediatR;
-using Hotline.Share.Dtos;
-using XF.Domain.Repository;
-using XF.Domain.Authentications;
-using Hotline.Configurations;
 using Microsoft.Extensions.Options;
+using XF.Domain.Authentications;
+using XF.Domain.Repository;
 
-namespace Hotline.Application.Orders.OrderScreenHandler;
+namespace Hotline.Application.Orders.Handles.OrderScreenHandler;
 public class OrderScreenEndWorkflowHandler : INotificationHandler<EndWorkflowNotify>
 {
     private readonly IOrderRepository _orderRepository;
     private readonly ICapPublisher _capPublisher;
     private readonly IMapper _mapper;
     private readonly IRepository<OrderVisitDetail> _orderVisitedDetailRepository;
-    private readonly IRepository<OrderScreen> _orderScreenRepository;
+    private readonly IRepository<Hotline.Orders.OrderScreen> _orderScreenRepository;
     private readonly IRepository<OrderVisit> _orderVisitRepository;
     private readonly ISessionContext _sessionContext;
     private readonly IRepository<OrderScreenDetail> _orderScreenDetailRepository;
@@ -30,7 +30,7 @@ public class OrderScreenEndWorkflowHandler : INotificationHandler<EndWorkflowNot
         ICapPublisher capPublisher,
         IMapper mapper,
         IRepository<OrderVisitDetail> orderVisitedDetailRepository,
-        IRepository<OrderScreen> orderScreenRepository,
+        IRepository<Hotline.Orders.OrderScreen> orderScreenRepository,
         IRepository<OrderVisit> orderVisitRepository,
         ISessionContext sessionContext,
         IRepository<OrderScreenDetail> orderScreenDetailRepository,
@@ -97,7 +97,7 @@ public class OrderScreenEndWorkflowHandler : INotificationHandler<EndWorkflowNot
                                 //获取回访明细
                                 var visitDe = visit.OrderVisitDetails.First(x => x.Id == screen.VisitDetailId);
                                 //推省上
-                                await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderScreenApplyed,
+                                await _capPublisher.PublishAsync(Share.Mq.EventNames.HotlineOrderScreenApplyed,
                                     new PublishVisitDto()
                                     {
                                         Order = _mapper.Map<OrderDto>(visit.Order),
@@ -113,7 +113,7 @@ public class OrderScreenEndWorkflowHandler : INotificationHandler<EndWorkflowNot
                                     });
 
                                 //推门户
-                                await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisitedWeb, new PublishVisitAllDto()
+                                await _capPublisher.PublishAsync(Share.Mq.EventNames.HotlineOrderVisitedWeb, new PublishVisitAllDto()
                                 {
                                     Id = visit.Id,
                                     Order = _mapper.Map<OrderDto>(visit.Order),

+ 102 - 0
src/Hotline.Application/Orders/Handles/OrderScreenHandler/OrderScreenNextWorkflowHandler.cs

@@ -0,0 +1,102 @@
+using DotNetCore.CAP;
+using Hotline.Configurations;
+using Hotline.FlowEngine.Notifications;
+using Hotline.FlowEngine.WorkflowModules;
+using Hotline.Orders;
+using Hotline.Share.Dtos.Order;
+using Hotline.Share.Enums.Order;
+using Hotline.Share.Mq;
+using MapsterMapper;
+using MediatR;
+using Microsoft.Extensions.Options;
+using XF.Domain.Authentications;
+using XF.Domain.Repository;
+
+namespace Hotline.Application.Orders.Handles.OrderScreen;
+public class OrderScreenNextWorkflowHandler : INotificationHandler<NextStepNotify>
+{
+    private readonly ICapPublisher _capPublisher;
+    private readonly IMapper _mapper;
+    private readonly IOrderScreenRepository _orderScreenRepository;
+    private readonly ISessionContext _sessionContext;
+    private readonly IRepository<OrderScreenDetail> _orderScreenDetailRepository;
+    private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
+
+    public OrderScreenNextWorkflowHandler(
+        ICapPublisher capPublisher,
+        IMapper mapper,
+        IOrderScreenRepository orderScreenRepository,
+        ISessionContext sessionContext,
+        IOptionsSnapshot<AppConfiguration> appOptions,
+        IRepository<OrderScreenDetail> orderScreenDetailRepository)
+    {
+        _capPublisher = capPublisher;
+        _mapper = mapper;
+        _orderScreenRepository = orderScreenRepository;
+        _sessionContext = sessionContext;
+        _orderScreenDetailRepository = orderScreenDetailRepository;
+        _appOptions = appOptions;
+    }
+
+    /// <summary>Handles a notification</summary>
+    /// <param name="notification">The notification</param>
+    /// <param name="cancellationToken">Cancellation token</param>
+    public async Task Handle(NextStepNotify notification, CancellationToken cancellationToken)
+    {
+        if (notification.Workflow.ModuleCode == WorkflowModuleConsts.OrderScreen)
+        {
+            var workflow = notification.Workflow;
+            var nextTag = string.IsNullOrEmpty(notification.NextStepDefine.Tag)
+                ? null
+                : System.Text.Json.JsonSerializer.Deserialize<DefinitionTag>(notification.NextStepDefine.Tag);
+            var screen = await _orderScreenRepository.Queryable().Includes(x => x.Order)
+                .Where(x => x.Id == workflow.ExternalId).FirstAsync(cancellationToken);
+            if (screen != null)
+            {
+                screen.Status = EScreenStatus.Approval;
+                screen.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
+                //如果下个节点是省审批,则修改为省甄别
+                if (nextTag is not null && nextTag.Type == TagDefaults.TagType.Org && nextTag.Value == TagDefaults.TagValue.Province)
+                    screen.IsProScreen = true;
+                await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
+            }
+
+            if (nextTag is not null && nextTag.Type == TagDefaults.TagType.Org)
+            {
+                switch (nextTag.Value)
+                {
+                    case TagDefaults.TagValue.Province:
+                        if (screen != null)
+                        {
+                            var screenDto = _mapper.Map<OrderScreenListDto>(screen);
+                            if (screen.Order != null && screen.Order.Source == ESource.ProvinceStraight)
+                            {
+                                var screenOrderDto = _mapper.Map<OrderDto>(screen.Order);
+                                //省件甄别--以省审批前一个节点整理的甄别意见为准推送省上 宜宾
+                                if (_appOptions.Value.IsYiBin)
+                                {
+                                    screenDto.Content = notification.Dto.Opinion;
+                                    screenDto.Files = new List<Share.Dtos.File.FileDto>();
+                                }
+                                //推省上
+                                _capPublisher.Publish(EventNames.HotlineOrderScreenApply, new PublishScreenDto()
+                                {
+                                    Order = screenOrderDto,
+                                    Screen = screenDto,
+                                    ClientGuid = ""
+                                });
+                            }
+                        }
+
+                        break;
+                }
+            }
+            OrderScreenDetail detail = new OrderScreenDetail
+            {
+                ScreenId = screen.Id
+            };
+            detail.Audit(_sessionContext.UserId, _sessionContext.UserName, _sessionContext.OrgId, _sessionContext.OrgName, 1);
+            await _orderScreenDetailRepository.AddAsync(detail, cancellationToken);
+        }
+    }
+}

+ 37 - 0
src/Hotline.Application/Orders/Handles/OrderScreenHandler/OrderScreenStartWorkflowHandler.cs

@@ -0,0 +1,37 @@
+using Hotline.FlowEngine.Notifications;
+using Hotline.FlowEngine.WorkflowModules;
+using Hotline.Orders;
+using MediatR;
+
+namespace Hotline.Application.Orders.Handles.OrderScreen;
+
+public class OrderScreenStartWorkflowHandler : INotificationHandler<StartWorkflowNotify>
+{
+    private readonly IOrderScreenRepository _orderScreenRepository;
+
+    public OrderScreenStartWorkflowHandler(
+        IOrderScreenRepository orderScreenRepository
+    )
+    {
+        _orderScreenRepository = orderScreenRepository;
+    }
+
+    /// <summary>Handles a notification</summary>
+    /// <param name="notification">The notification</param>
+    /// <param name="cancellationToken">Cancellation token</param>
+    public async Task Handle(StartWorkflowNotify notification, CancellationToken cancellationToken)
+    {
+        if (notification.Workflow.ModuleCode == WorkflowModuleConsts.OrderScreen)
+        {
+            var workflow = notification.Workflow;
+            var screen = await _orderScreenRepository.Queryable().Includes(x => x.Order)
+                .Where(x => x.Id == workflow.ExternalId).FirstAsync(cancellationToken);
+            if (screen != null)
+            {
+                screen.WorkflowId = workflow.Id;
+                screen.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
+                await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
+            }
+        }
+    }
+}

+ 1 - 1
src/Hotline.Application/Handlers/Order/GuiderSystemTimeoutHandler.cs → src/Hotline.Application/Orders/Handles/SnapshotHandler/GuiderSystemTimeoutHandler.cs

@@ -17,7 +17,7 @@ using Hotline.Snapshot.Notifications;
 using MediatR;
 using XF.Domain.Exceptions;
 
-namespace Hotline.Application.Handlers.Order
+namespace Hotline.Application.Orders.Handles.Snapshot
 {
     /// <summary>
     /// 需求:坐席派给网格员的安全隐患工单若未推送成功超过4小时或者网格员超过4小时没回复,则自动流转到标注节点待标注列表

+ 0 - 102
src/Hotline.Application/Orders/OrderScreenHandler/OrderScreenNextWorkflowHandler.cs

@@ -1,102 +0,0 @@
-using DotNetCore.CAP;
-using Hotline.Configurations;
-using Hotline.FlowEngine.Notifications;
-using Hotline.FlowEngine.WorkflowModules;
-using Hotline.Orders;
-using Hotline.Share.Dtos.Order;
-using Hotline.Share.Enums.Order;
-using Hotline.Share.Mq;
-using MapsterMapper;
-using MediatR;
-using Microsoft.Extensions.Options;
-using XF.Domain.Authentications;
-using XF.Domain.Repository;
-
-namespace Hotline.Application.Orders.OrderScreenHandler;
-public class OrderScreenNextWorkflowHandler : INotificationHandler<NextStepNotify>
-{
-	private readonly ICapPublisher _capPublisher;
-	private readonly IMapper _mapper;
-	private readonly IOrderScreenRepository _orderScreenRepository;
-	private readonly ISessionContext _sessionContext;
-	private readonly IRepository<OrderScreenDetail> _orderScreenDetailRepository;
-	private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
-
-	public OrderScreenNextWorkflowHandler(
-		ICapPublisher capPublisher,
-		IMapper mapper,
-		IOrderScreenRepository orderScreenRepository,
-		ISessionContext sessionContext,
-		IOptionsSnapshot<AppConfiguration> appOptions,
-		IRepository<OrderScreenDetail> orderScreenDetailRepository)
-	{
-		_capPublisher = capPublisher;
-		_mapper = mapper;
-		_orderScreenRepository = orderScreenRepository;
-		_sessionContext = sessionContext;
-		_orderScreenDetailRepository = orderScreenDetailRepository;
-		_appOptions = appOptions;
-	}
-
-	/// <summary>Handles a notification</summary>
-	/// <param name="notification">The notification</param>
-	/// <param name="cancellationToken">Cancellation token</param>
-	public async Task Handle(NextStepNotify notification, CancellationToken cancellationToken)
-	{
-		if (notification.Workflow.ModuleCode == WorkflowModuleConsts.OrderScreen) 
-		{
-			var workflow = notification.Workflow;
-			var nextTag = string.IsNullOrEmpty(notification.NextStepDefine.Tag)
-				? null
-				: System.Text.Json.JsonSerializer.Deserialize<DefinitionTag>(notification.NextStepDefine.Tag);
-			var screen = await _orderScreenRepository.Queryable().Includes(x => x.Order)
-				.Where(x => x.Id == workflow.ExternalId).FirstAsync(cancellationToken);
-			if (screen != null)
-			{
-				screen.Status = EScreenStatus.Approval;
-				screen.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
-				//如果下个节点是省审批,则修改为省甄别
-				if (nextTag is not null && nextTag.Type == TagDefaults.TagType.Org && nextTag.Value == TagDefaults.TagValue.Province)
-					screen.IsProScreen = true;
-				await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
-			}
-
-			if (nextTag is not null && nextTag.Type == TagDefaults.TagType.Org)
-			{
-				switch (nextTag.Value)
-				{
-					case TagDefaults.TagValue.Province:
-						if (screen != null)
-						{
-							var screenDto = _mapper.Map<OrderScreenListDto>(screen);
-							if (screen.Order != null && screen.Order.Source == ESource.ProvinceStraight)
-							{
-								var screenOrderDto = _mapper.Map<OrderDto>(screen.Order);
-								//省件甄别--以省审批前一个节点整理的甄别意见为准推送省上 宜宾
-								if (_appOptions.Value.IsYiBin)
-								{
-									screenDto.Content = notification.Dto.Opinion;
-									screenDto.Files = new List<Share.Dtos.File.FileDto>();
-								}
-								//推省上
-								_capPublisher.Publish(EventNames.HotlineOrderScreenApply, new PublishScreenDto()
-								{
-									Order = screenOrderDto,
-									Screen = screenDto,
-									ClientGuid = ""
-								});
-							}
-						}
-
-						break;
-				}
-			}
-			OrderScreenDetail detail = new OrderScreenDetail
-			{
-				ScreenId = screen.Id
-			};
-			detail.Audit(_sessionContext.UserId, _sessionContext.UserName, _sessionContext.OrgId, _sessionContext.OrgName, 1);
-			await _orderScreenDetailRepository.AddAsync(detail, cancellationToken);
-		}
-	}
-}

+ 0 - 37
src/Hotline.Application/Orders/OrderScreenHandler/OrderScreenStartWorkflowHandler.cs

@@ -1,37 +0,0 @@
-using Hotline.FlowEngine.Notifications;
-using Hotline.FlowEngine.WorkflowModules;
-using Hotline.Orders;
-using MediatR;
-
-namespace Hotline.Application.Orders.OrderScreenHandler;
-
-public class OrderScreenStartWorkflowHandler : INotificationHandler<StartWorkflowNotify>
-{
-	private readonly IOrderScreenRepository _orderScreenRepository;
-
-	public OrderScreenStartWorkflowHandler(
-		IOrderScreenRepository orderScreenRepository
-	)
-	{
-		_orderScreenRepository = orderScreenRepository;
-	}
-
-	/// <summary>Handles a notification</summary>
-	/// <param name="notification">The notification</param>
-	/// <param name="cancellationToken">Cancellation token</param>
-	public async Task Handle(StartWorkflowNotify notification, CancellationToken cancellationToken)
-	{
-		if (notification.Workflow.ModuleCode == WorkflowModuleConsts.OrderScreen)
-		{
-			var workflow = notification.Workflow;
-			var screen = await _orderScreenRepository.Queryable().Includes(x => x.Order)
-				.Where(x => x.Id == workflow.ExternalId).FirstAsync(cancellationToken);
-			if (screen != null)
-			{
-				screen.WorkflowId = workflow.Id;
-				screen.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
-				await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
-			}
-		}
-	}
-}

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

@@ -35,4 +35,11 @@ public interface IRedPackApplication
     /// <param name="dto"></param>
     /// <returns></returns>
     Task<IList<GetRedPackAuditSMSTemplateOutDto>> GetRedPackAuditSMSTemplateAsync(GetRedPackAuditSMSTemplateInDto dto);
+
+    /// <summary>
+    /// 审核添加备注
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    Task UpdateRedPackAuditRemarkAsync(UpdateRedPackAuditRemarkInDto dto);
 }

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

@@ -55,6 +55,7 @@ public class RedPackApplication : IRedPackApplication, IScopeDependency
             var entity = new RedPackRecord
             {
                 OrderId = redPackAudit.OrderId,
+                RedPackAuditId = redPackAudit.Id,
                 PeopleType = EReadPackUserType.Citizen,
                 Name = order.FromName,
                 PickupStatus = ERedPackPickupStatus.Unreceived,
@@ -174,11 +175,35 @@ public class RedPackApplication : IRedPackApplication, IScopeDependency
         var items = await _snapshotSMSTemplateRepository.Queryable(includeDeleted: true)
             .LeftJoin<Industry>((sms, industry) => sms.IndustryId == industry.Id)
             .LeftJoin<OrderSnapshot>((sms, industry, snapshot) => snapshot.IndustryId == industry.Id)
-            .Where((sms, industry, snapshot) => (sms.IsPublic == true || sms.IndustryId == snapshot.IndustryId) 
+            .Where((sms, industry, snapshot) => (sms.IsPublic == true || sms.IndustryId == snapshot.IndustryId)
              && sms.Status == dto.Status && sms.IsEnable == true)
             .Select<GetRedPackAuditSMSTemplateOutDto>()
             .Distinct()
             .ToListAsync();
         return items;
     }
+
+    /// <summary>
+    /// 审核添加备注
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public async Task UpdateRedPackAuditRemarkAsync(UpdateRedPackAuditRemarkInDto dto)
+    {
+        var audit = await _redPackAuditRepository.GetAsync(dto.RedPackAuditId) ?? throw UserFriendlyException.SameMessage("审核记录不存在");
+        audit.AcutalAmount = dto.AcutalAmount;
+        if (dto.IsSend == false)
+        {
+            await _redPackRecordRepository.Queryable()
+                .Where(m => m.RedPackAuditId == audit.Id)
+                .FirstAsync()
+                .Then(async (record) =>
+                {
+                    record.FailCase = dto.FailCase;
+                    await _redPackRecordRepository.UpdateAsync(record);
+                });
+        }
+        audit.SendRemarks = dto.SendRemarks;
+        await _redPackAuditRepository.UpdateAsync(audit);
+    }
 }

+ 17 - 9
src/Hotline.Share/Dtos/FlowEngine/BasicWorkflowDto.cs

@@ -20,6 +20,8 @@ public class BasicWorkflowDto : EndWorkflowDto
     public bool BackToCountersignEnd { get; set; }
 
     public EFlowDirection? FlowDirection { get; set; }
+    
+    #region currentStepInfo
 
     /// <summary>
     /// 办理对象类型
@@ -31,6 +33,20 @@ public class BasicWorkflowDto : EndWorkflowDto
     /// </summary>
     public EStepType StepType { get; set; }
 
+    /// <summary>
+    /// 模板配置节点业务类型
+    /// </summary>
+    public EBusinessType BusinessType { get; set; }
+
+    /// <summary>
+    /// 发起会签
+    /// </summary>
+    public bool IsStartCountersign { get; set; }
+
+    public string Tag { get; set; }
+
+    #endregion
+
     /// <summary>
     /// 根据办理者类型不同,此字段为不同内容
     /// <example>
@@ -49,10 +65,7 @@ public class BasicWorkflowDto : EndWorkflowDto
     /// </summary>
     public string? NextMainHandler { get; set; }
 
-    /// <summary>
-    /// 发起会签
-    /// </summary>
-    public bool IsStartCountersign { get; set; }
+   
 
     ///// <summary>
     ///// 办理方式
@@ -64,11 +77,6 @@ public class BasicWorkflowDto : EndWorkflowDto
     /// </summary>
     public External External { get; set; }
 
-    /// <summary>
-    /// 模板配置节点业务类型
-    /// </summary>
-    public EBusinessType BusinessType { get; set; }
-
     /// <summary>
     /// 审核结果(非审批流程无意义)
     /// </summary>

+ 2 - 0
src/Hotline.Share/Dtos/FlowEngine/NextStepOption.cs

@@ -35,6 +35,8 @@ public class NextStepOption : Kv
     /// </summary>
     public EHandlerType HandlerType { get; set; }
 
+    public string Tag { get; set; }
+
     /// <summary>
     /// 节点部门等级(非部门等级办理时无效)
     /// </summary>

+ 9 - 0
src/Hotline.Share/Dtos/Order/OrderStartFlowDto.cs

@@ -145,6 +145,15 @@ namespace Hotline.Share.Dtos.Order
         public ETimeType? TimeLimitUnit { get; set; }
 
         #endregion
+
+        #region 随手拍业务
+
+        /// <summary>
+        /// 部门标记是否安全生产
+        /// </summary>
+        public bool? IsSafetyDepartment { get; set; }
+
+        #endregion
     }
 
     public class CrossStep : BasicWorkflowDto

+ 30 - 0
src/Hotline.Share/Dtos/Snapshot/RedPackDto.cs

@@ -63,3 +63,33 @@ public class RedPackDateOutDto
     public string AmountTxt => Amount.ToYuanFinance();
 }
 
+public class UpdateRedPackAuditRemarkInDto
+{
+    /// <summary>
+    /// Id
+    /// </summary>
+    public string RedPackAuditId { get; set; }
+
+    /// <summary>
+    /// 实发金额
+    /// </summary>
+    public double AcutalAmount { get; set; }
+
+    /// <summary>
+    /// 市民奖励发放备注
+    /// </summary>
+    public string SendRemarks { get; set; }
+
+    /// <summary>
+    /// 市民奖励发放结果
+    /// </summary>
+    public bool IsSend { get; set; }
+
+    /// <summary>
+    /// 红包发放失败原因;
+    /// 0: 无法联系;
+    /// 1: 婉拒红包;
+    /// </summary>
+    public ERedPackPickupFailCase FailCase { get; set; }
+}
+

+ 28 - 0
src/Hotline.Share/Enums/Snapshot/ERedPackPickupFailCase.cs

@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Enums.Snapshot;
+
+/// <summary>
+/// 红包发放失败原因;
+/// 0: 无法联系;
+/// 1: 婉拒红包;
+/// </summary>
+public enum ERedPackPickupFailCase
+{
+    /// <summary>
+    /// 无法联系
+    /// </summary>
+    [Description("无法联系")]
+    NotContact,
+
+    /// <summary>
+    /// 婉拒红包
+    /// </summary>
+    [Description("婉拒红包")]
+    Excuse
+}

+ 7 - 1
src/Hotline.Share/Enums/Snapshot/ERedPackPickupStatus.cs

@@ -31,5 +31,11 @@ public enum ERedPackPickupStatus
     /// 退回
     /// </summary>
     [Description("退回")]
-    Back = 2
+    Back = 2,
+
+    /// <summary>
+    /// 婉拒
+    /// </summary>
+    [Description("婉拒")]
+    Excuse = 3
 }

+ 12 - 0
src/Hotline/Snapshot/RedPackRecord.cs

@@ -19,6 +19,13 @@ public class RedPackRecord : CreationSoftDeleteEntity
     [SugarColumn(ColumnDescription = "关联工单编号")]
     public string OrderId { get; set; }
 
+    /// <summary>
+    /// 红包审核Id
+    /// <inheritdoc cref="RedPackAudit"/>
+    /// </summary>
+    [SugarColumn(ColumnDescription = "红包审核Id")]
+    public string RedPackAuditId { get; set; }
+
     /// <summary>
     /// 微信返回的订单号
     /// </summary>
@@ -67,6 +74,11 @@ public class RedPackRecord : CreationSoftDeleteEntity
     [SugarColumn(ColumnDescription = "红包领取状态")]
     public ERedPackPickupStatus PickupStatus { get; set; }
 
+    /// <summary>
+    /// 发放失败原因
+    /// </summary>
+    public ERedPackPickupFailCase FailCase { get; set; }
+
     /// <summary>
     /// 备注
     /// </summary>