浏览代码

Merge branch 'feature/snapshot' of http://110.188.24.182:10023/Fengwo/hotline into feature/snapshot

xf 4 月之前
父节点
当前提交
8b4065a066

+ 36 - 6
src/Hotline.Api/Controllers/OrderController.cs

@@ -71,6 +71,7 @@ using Hotline.FlowEngine.Notifications;
 using Hotline.Share.Dtos.Order.Detail;
 using Hotline.Snapshot.Interfaces;
 using Hotline.Snapshot.Notifications;
+using Hotline.Snapshot;
 
 namespace Hotline.Api.Controllers;
 
@@ -3495,6 +3496,15 @@ public class OrderController : BaseController
             orderTerminateList.Any(x => x.Status == ETerminateStatus.Refuse) ? "不同意" :
             orderTerminateList.Any(x => x.Status == ETerminateStatus.Approval || x.Status == ETerminateStatus.SendBack) ? "审批中" : null;
 
+        if (_systemSettingCacheManager.Snapshot)
+        {
+            var snapshot = await _orderSnapshotRepository.Queryable()
+                .Where(m => m.Id == order.Id)
+                .Select(m => new { m.IndustryId, m.IndustryName })
+                .FirstAsync(HttpContext.RequestAborted);
+            dto.IndustryName = snapshot.IndustryName;
+            dto.IndustryId = snapshot.IndustryId;
+        }
         return _sessionContext.OrgIsCenter ? dto : dto.DataMask();
     }
 
@@ -3550,6 +3560,17 @@ public class OrderController : BaseController
 
         await _orderDomainService.AddAsync(order, true, HttpContext.RequestAborted);
 
+        if (_systemSettingCacheManager.Snapshot && dto.IndustryId.NotNullOrEmpty() && dto.IndustryName.NotNullOrEmpty())
+        {
+            var snapshot = new OrderSnapshot
+            {
+                Id = order.Id,
+                IndustryId = dto.IndustryId,
+                IndustryName = dto.IndustryName
+            };
+            await _orderSnapshotRepository.AddAsync(snapshot, HttpContext.RequestAborted);
+        }
+
         //订阅此事件的内部处理工单数据只能更新各自业务的字段,不能全部更新
         //新增工单其他处理事件  (受理短信)
         if (!string.IsNullOrEmpty(order.Contact) && order.Contact.Length == 11)
@@ -4057,7 +4078,7 @@ public class OrderController : BaseController
                 orderHandleFlowDto.CrossSteps = orderHandleFlowDto.CrossSteps.OrderBy(d => d.Sort).ToList();
                 var stepCount = orderHandleFlowDto.CrossSteps.Count;
                 var unhandleSteps = new List<WorkflowStep> { startStep };
-                for (int i = 0; i < stepCount; i++)
+                for (int i = 0;i < stepCount;i++)
                 {
                     var crossStep = orderHandleFlowDto.CrossSteps[i];
                     var tempSteps = new List<WorkflowStep>();
@@ -4609,14 +4630,23 @@ public class OrderController : BaseController
     /// </summary>
     /// <returns></returns>
     [HttpGet("waited/center/base")]
-    public async Task<object> WaitedForCenterBaseData()
+    public async Task<Dictionary<string, object>> WaitedForCenterBaseData()
     {
-        var rsp = new
+        var rsp = new Dictionary<string, object>
         {
-            OrderStatus = EnumExts.GetDescriptions<EOrderStatus>(),
-            ExpiredStatus = EnumExts.GetDescriptions<EExpiredStatus>(),
-            StepNames = new string[] { "话务部", "派单组", "班长审批" }
+            {"orderStatus" ,  EnumExts.GetDescriptions<EOrderStatus>() },
+            {"expiredStatus",  EnumExts.GetDescriptions<EExpiredStatus>() },
+            { "stepNames" , new string[] { "话务部", "派单组", "班长审批" } },
         };
+
+        if (_systemSettingCacheManager.Snapshot)
+        {
+            var industry = await _industryRepository.Queryable()
+           .Select(d => new { d.Id, d.Name, })
+           .ToListAsync();
+            rsp.Add("industry", industry);
+        }
+
         return rsp;
     }
 

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

@@ -39,7 +39,7 @@ public class RedPackApplicationTest : TestBase
     [Fact]
     public async Task AuditRedPackAudit_Test()
     {
-        var items = await _redPackApplication.GetRedPackAuditItemsAsync(new SnapshotOrderAuditItemsInDto(null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, ERedPackAuditStatus.Pending)).ToListAsync();
+        var items = await _redPackApplication.GetRedPackAuditItemsAsync(new SnapshotOrderAuditItemsInDto(null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0)).ToListAsync();
         var audit = items.First();
         var smsTemplate = await _redPackApplication.GetRedPackAuditSMSTemplateAsync(new GetRedPackAuditSMSTemplateInDto(audit.OrderId, ERedPackAuditStatus.Agree));
         var inDto = new UpdateRedPackAuditInDto
@@ -51,7 +51,7 @@ public class RedPackApplicationTest : TestBase
             RedPackAuditId = audit.Id,
         };
         await _redPackApplication.AuditRedPackAuditAsync(inDto);
-        items = await _redPackApplication.GetRedPackAuditItemsAsync(new SnapshotOrderAuditItemsInDto(null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, ERedPackAuditStatus.Agree)).ToListAsync();
+        items = await _redPackApplication.GetRedPackAuditItemsAsync(new SnapshotOrderAuditItemsInDto(null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 1)).ToListAsync();
         items.Any(m => m.Id == audit.Id).ShouldBeTrue();
 
         var record = await _redPackRecordRepository.Queryable()

+ 38 - 3
src/Hotline.Application.Tests/Controller/OrderControllerTest.cs

@@ -15,6 +15,7 @@ using Hotline.Identity.Accounts;
 using Hotline.Identity.Roles;
 using Hotline.Orders;
 using Hotline.Repository.SqlSugar;
+using Hotline.Repository.SqlSugar.Snapshot;
 using Hotline.Settings;
 using Hotline.Settings.Hotspots;
 using Hotline.Share.Dtos.File;
@@ -64,8 +65,10 @@ public class OrderControllerTest : TestBase
     private readonly IRepository<CallidRelation> _callIdRelationRepository;
     private readonly XingTangCallApplication _defaultCallApplication;
     private readonly ISqlSugarClient _capSqlClient;
+    private readonly IIndustryRepository _industryRepository;
+    private readonly IOrderSnapshotRepository _orderSnapshotRepository;
 
-    public OrderControllerTest(IAccountRepository accountRepository, IRepository<Role> roleRepository, UserController userController, IRepository<Hotspot> hotspotRepository, OrderController orderController, IOrderRepository orderRepository, IServiceScopeFactory scopeFactory, IRepository<User> userRepository, OrderServiceMock orderServiceMock, IRepository<OrderPublish> orderPublishRepository, INotificationHandler<EndWorkflowNotify> orderPublishEndWorkflowHandler, IOrderVisitRepository orderVisitRepository, IRepository<SystemSetting> systemSettingRepository, ISystemSettingCacheManager systemSettingCacheManager, IRepository<CallNative> callNativeRepository, IRepository<CallidRelation> callIdRelationRepository, XingTangCallApplication defaultCallApplication, ISugarUnitOfWork<CapDbContext> capDbContext, IHttpContextAccessor httpContextAccessor, IThirdIdentiyService thirdService, IThirdAccountRepository thirdAccount) : base(accountRepository, roleRepository, userController, scopeFactory, userRepository, httpContextAccessor, thirdService, thirdAccount)
+    public OrderControllerTest(IAccountRepository accountRepository, IRepository<Role> roleRepository, UserController userController, IRepository<Hotspot> hotspotRepository, OrderController orderController, IOrderRepository orderRepository, IServiceScopeFactory scopeFactory, IRepository<User> userRepository, OrderServiceMock orderServiceMock, IRepository<OrderPublish> orderPublishRepository, INotificationHandler<EndWorkflowNotify> orderPublishEndWorkflowHandler, IOrderVisitRepository orderVisitRepository, IRepository<SystemSetting> systemSettingRepository, ISystemSettingCacheManager systemSettingCacheManager, IRepository<CallNative> callNativeRepository, IRepository<CallidRelation> callIdRelationRepository, XingTangCallApplication defaultCallApplication, ISugarUnitOfWork<CapDbContext> capDbContext, IHttpContextAccessor httpContextAccessor, IThirdIdentiyService thirdService, IThirdAccountRepository thirdAccount, IIndustryRepository industryRepository, IOrderSnapshotRepository orderSnapshotRepository) : base(accountRepository, roleRepository, userController, scopeFactory, userRepository, httpContextAccessor, thirdService, thirdAccount)
     {
         _hotspotRepository = hotspotRepository;
         _orderController = orderController;
@@ -84,6 +87,8 @@ public class OrderControllerTest : TestBase
         _callIdRelationRepository = callIdRelationRepository;
         _defaultCallApplication = defaultCallApplication;
         _capSqlClient = capDbContext.Db;
+        _industryRepository = industryRepository;
+        _orderSnapshotRepository = orderSnapshotRepository;
     }
 
     /// <summary>
@@ -102,7 +107,7 @@ public class OrderControllerTest : TestBase
             .With(m => m.Id, Ulid.NewUlid().ToString())
             .With(m => m.CallNo, callNo)
             .With(m => m.Direction, ECallDirection.In)
-            .With(m => m.IsDeleted , false)
+            .With(m => m.IsDeleted, false)
             .Create();
         await _callNativeRepository.AddAsync(inDto);
 
@@ -111,7 +116,7 @@ public class OrderControllerTest : TestBase
             .With(m => m.Direction, ECallDirection.Out)
             .With(m => m.CallNo, callNo)
             .With(m => m.AudioFile, string.Empty)
-            .With(m => m.IsDeleted , false)
+            .With(m => m.IsDeleted, false)
             .Create();
         await _callNativeRepository.AddAsync(inDto2);
         var callOrder = new CallidRelation
@@ -167,6 +172,36 @@ public class OrderControllerTest : TestBase
         order.ShouldNotBeNull();
     }
 
+    /// <summary>
+    /// 创建随手拍工单
+    /// 验证随手拍工单是否能正常创建
+    /// </summary>
+    /// <returns></returns>
+    [Fact]
+    public async Task OrderSnapshot_Test()
+    {
+        var industryItems = await _industryRepository.Queryable() .Select(d => new { d.Id, d.Name, }) .ToListAsync();
+        var industry = industryItems.First();
+
+        SetZuoXi();
+        var order = _orderServiceMock.CreateOrder(industryId:industry.Id, industryName: industry.Name)
+            .办理到派单员()
+            .办理到归档(SetPaiDanYuan, data =>
+            {
+                data.IsEvasive = true;
+                data.IsInactively = true;
+            })
+            .GetCreateResult();
+        var orderEntity = await _orderRepository.GetAsync(order.Id);
+        orderEntity.ShouldNotBeNull();
+
+        var snapshot = await _orderSnapshotRepository.GetAsync(m => m.Id == order.Id);
+        snapshot.ShouldNotBeNull();
+        snapshot.IndustryId.ShouldBe(industry.Id);
+        snapshot.IndustryName.ShouldBe(industry.Name);
+    }
+
+
     /// <summary>
     /// 验证中心直办工单归档后 自动发布
     /// 是否推诿, 是否不积极

+ 4 - 2
src/Hotline.Application.Tests/Mock/OrderServiceMock.cs

@@ -79,7 +79,7 @@ public class OrderServiceMock
         return this;
     }
 
-    public OrderServiceMock CreateOrder(string callId = "")
+    public OrderServiceMock CreateOrder(string callId = "", string industryId = "", string industryName = "")
     {
         var json = "{\"sourceChannel\":\"因特网\",\"sourceChannelCode\":\"YTW\",\"transferPhone\":null,\"fromPhone\":null,\"acceptorName\":\"单元测试\",\"acceptorStaffNo\":\"\",\"fromName\":\"1233333333\",\"fromGender\":1,\"identityType\":1,\"licenceType\":null,\"licenceTypeCode\":null,\"licenceNo\":null,\"ageRange\":null,\"ageRangeCode\":null,\"contact\":\"12333333333\",\"isSecret\":false,\"acceptSms\":false,\"no\":null,\"title\":\"\",\"hotspotId\":\"1912\",\"eventCategoryId\":null,\"incidentTime\":null,\"incidentPurpose\":null,\"areaCode\":\"519800\",\"city\":\"省内\",\"street\":null,\"isRepeat\":\"false\",\"pushType\":null,\"pushTypeCode\":null,\"content\":\"单元测试内容\",\"duplicateIds\":[],\"duplicateTitle\":null,\"callAddress\":null,\"repeatableEventDetails\":[],\"orderExtension\":null,\"transpond\":false,\"isEnforcementOrder\":false,\"focusOnEventsArr\":[],\"focusOnEvents\":null,\"isFormalistWorkOrder\":false,\"isSensitiveWorkOrders\":false,\"isUrgent\":false,\"isThreePartyConference\":false,\"is24HoursComplete\":false,\"company\":null,\"orderPushTypes\":[],\"acceptType\":\"咨询\",\"acceptTypeCode\":\"10\",\"files\":[],\"hotspotSpliceName\":\"互联互通-转接乐山市12345\",\"hotspotName\":\"转接乐山市12345\",\"hotspotCode\":\"1912\",\"hotspotExternal\":\"19\",\"county\":\"\",\"town\":\"\"}";
         AddOrderDto = json.FromJson<AddOrderDto>();
@@ -89,6 +89,8 @@ public class OrderServiceMock
             AddOrderDto.SourceChannel = "电话";
             AddOrderDto.SourceChannelCode = AppDefaults.SourceChannel.DianHua;
         }
+        AddOrderDto.IndustryId = industryId;
+        AddOrderDto.IndustryName = industryName;
         AddOrderDto.Title = "单元测试" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
         CreateOrderOutDto = _orderController.Add(AddOrderDto).GetAwaiter().GetResult().ToJson().FromJson<CreateOrderOutDto>();
         return this;
@@ -301,7 +303,7 @@ public class OrderServiceMock
         aciton?.Invoke();
         var baseData = _orderController.PublishOrderPageBase(CreateOrderOutDto.Id).GetAwaiter().GetResult();
         var inDto = new PublishOrderDto
-        { 
+        {
             Id = CreateOrderOutDto.Id,
             PublishState = false,
             ArrangeTitle = baseData.OrderTitle,

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

@@ -108,6 +108,12 @@ public class RedPackApplication : IRedPackApplication, IScopeDependency
 
     public ISugarQueryable<SnapshotOrderAuditItemsOutDto> GetRedPackAuditItemsAsync(SnapshotOrderAuditItemsInDto dto)
     {
+        ERedPackAuditStatus? status = null;
+        if (dto.Status != -1 && Enum.TryParse<ERedPackAuditStatus>(dto.Status.ToString(), out var statusParse))
+        {
+            status = statusParse;
+        }
+
         var query = _redPackAuditRepository.Queryable(includeDeleted: true)
             .LeftJoin<Order>((redPackAudit, order) => redPackAudit.OrderId == order.Id)
             .LeftJoin<OrderSnapshot>((redPackAudit, order, snapshot) => redPackAudit.OrderId == snapshot.Id)
@@ -129,7 +135,7 @@ public class RedPackApplication : IRedPackApplication, IScopeDependency
             .WhereIF(dto.AcutalAmount.HasValue, (redPackAudit, order, snapshot, record, industry) => redPackAudit.AcutalAmount == dto.AcutalAmount)
             .WhereIF(dto.ApprovedAmount.HasValue, (redPackAudit, order, snapshot, record, industry) => redPackAudit.ApprovedAmount == dto.ApprovedAmount)
             .WhereIF(dto.IsDanger.HasValue, (redPackAudit, order, snapshot, record, industry) => snapshot.IsDanger == dto.IsDanger)
-            .WhereIF(dto.Status.HasValue, (redPackAudit, order, snapshot, record, industry) => redPackAudit.Status == dto.Status)
+            .WhereIF(status.HasValue, (redPackAudit, order, snapshot, record, industry) => redPackAudit.Status == status)
             .Select((redPackAudit, order, snapshot, record, industry) => new SnapshotOrderAuditItemsOutDto
             {
                 Id = redPackAudit.Id,

+ 30 - 0
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -953,6 +953,21 @@ namespace Hotline.Share.Dtos.Order
         /// 工单补充
         /// </summary>
         public List<OrderComplementDto> OrderComplements { get; set; }
+
+        #region 随手拍
+        /// <summary>
+        /// 行业Id
+        /// <inheritdoc cref="Industry"/> 表的Id
+        /// </summary>
+        public string? IndustryId { get; set; }
+
+        /// <summary>
+        /// 行业名称
+        /// <inheritdoc cref="Industry"/> 表的Name
+        /// </summary>
+        public string? IndustryName { get; set; }
+
+        #endregion
     }
 
     public class UpdateOrderDto : AddOrderDto
@@ -1335,6 +1350,21 @@ namespace Hotline.Share.Dtos.Order
         /// 工单推送分类
         /// </summary>
         public List<OrderPushTypeDto>? OrderPushTypes { get; set; }
+
+        #region 随手拍
+        /// <summary>
+        /// 行业Id
+        /// <inheritdoc cref="Industry"/> 表的Id
+        /// </summary>
+        public string? IndustryId { get; set; }
+
+        /// <summary>
+        /// 行业名称
+        /// <inheritdoc cref="Industry"/> 表的Name
+        /// </summary>
+        public string? IndustryName { get; set; }
+
+        #endregion
     }
 
     public record CanLinkCallRecordOrderDto : PagedKeywordRequest

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

@@ -206,7 +206,7 @@ public class AddSnapshotOrderInDto : Position
 /// <param name="AcutalAmount">实际发放金额</param>
 /// <param name="ApprovedAmount">审批金额</param>
 /// <param name="IsDanger">是否安全生成</param>
-/// <param name="Status">审核状态</param>
+/// <param name="Status">审核状态: -1: 全部; 0: 待审批; 1: 同意; 2: 拒绝;</param>
 public record SnapshotOrderAuditItemsInDto(string? No, string? Title,
     string? FromPhone,
     DateTime? BeginCreationTime,
@@ -224,7 +224,7 @@ public record SnapshotOrderAuditItemsInDto(string? No, string? Title,
     double? AcutalAmount,
     double? ApprovedAmount,
     bool? IsDanger,
-    ERedPackAuditStatus? Status) : PagedRequest;
+    int? Status) : PagedRequest;
 
 public class SnapshotOrderAuditItemsOutDto
 {

+ 6 - 1
src/Hotline.Share/Dtos/Snapshot/RedPackRecordDto.cs

@@ -45,6 +45,11 @@ public record SnapshotRedPackRecordItemsInDto : PagedRequest
 
 public class SnapshotRedPackRecordItemsOutDto
 {
+    /// <summary>
+    /// Id
+    /// </summary>
+    public string Id { get; set; }
+
     /// <summary>
     /// No
     /// </summary>
@@ -69,7 +74,7 @@ public class SnapshotRedPackRecordItemsOutDto
     /// <summary>
     /// 发放时间
     /// </summary>
-    public DateTime ReceiveTime { get; set; }
+    public DateTime? ReceiveTime { get; set; }
 
     /// <summary>
     /// 状态

+ 1 - 1
src/Hotline/Snapshot/OrderSnapshot.cs

@@ -98,7 +98,7 @@ public class OrderSnapshot : CreationSoftDeleteEntity
     /// 合规类型
     /// </summary>
     [SugarColumn(ColumnDescription = "合规类型")]
-    public ECompliantType CompliantType { get; set; }
+    public ECompliantType? CompliantType { get; set; }
 
     #region 网格员回复