瀏覽代碼

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

田爽 4 周之前
父節點
當前提交
a5e0793c36

+ 77 - 51
src/Hotline.Api/Controllers/OrderController.cs

@@ -53,6 +53,7 @@ using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Push;
 using Hotline.Share.Enums.Settings;
+using Hotline.Share.Enums.Snapshot;
 using Hotline.Share.Mq;
 using Hotline.Share.Requests;
 using Hotline.Share.Tools;
@@ -165,6 +166,7 @@ public class OrderController : BaseController
     private readonly ICircularRecordDomainService _circularRecordDomainService;
     private readonly IRepository<Hotline.Special.SpecialNumber> _specialNumberRepository;
     private readonly IRepository<OrderVisitDetailCopy> _orderVisitDetailCopyRepository;
+    private readonly IRedPackAuditRepository _redPackAuditRepository;
 
     public OrderController(
         IOrderDomainService orderDomainService,
@@ -241,6 +243,7 @@ public class OrderController : BaseController
         IRepository<SystemOrganize> systemOrganizeRepository,
         IRepository<OrderComplement> orderComplementRepository,
         ICircularRecordDomainService circularRecordDomainService,
+        IRedPackAuditRepository redPackAuditRepository,
         IRepository<Hotline.Special.SpecialNumber> specialNumberRepository,
         IRepository<OrderVisitDetailCopy> orderVisitDetailCopyRepository)
     {
@@ -318,6 +321,7 @@ public class OrderController : BaseController
         _systemOrganizeRepository = systemOrganizeRepository;
         _orderComplementRepository = orderComplementRepository;
         _circularRecordDomainService = circularRecordDomainService;
+        _redPackAuditRepository = redPackAuditRepository;
         _specialNumberRepository = specialNumberRepository;
         _orderVisitDetailCopyRepository = orderVisitDetailCopyRepository;
     }
@@ -5137,69 +5141,91 @@ public class OrderController : BaseController
     public async Task<string> OrderSignBathAsync([FromBody] OrderSignBathInDto dto)
     {
         var stringBuilder = new StringBuilder();
-        foreach (var orderId in dto.OrderIds)
+        if (dto.Status == 1)
         {
-            var order = await _orderRepository.GetAsync(orderId, HttpContext.RequestAborted);
-            if (order is null)
+            foreach (var orderId in dto.OrderIds)
             {
-                continue;
-            }
+                var order = await _orderRepository.GetAsync(orderId, HttpContext.RequestAborted);
+                if (order is null)
+                {
+                    continue;
+                }
 
-            var snapshot = await _orderSnapshotApplication.UpdateSafetyAsync(orderId, dto.IsSafetyDepartment, dto.Remark);
-            if (snapshot is null)
-            {
-                stringBuilder.Append($"随手拍: {order.No} 不存在");
-                continue;
-            }
+                var snapshot = await _orderSnapshotApplication.UpdateSafetyAsync(orderId, dto.IsSafetyDepartment, dto.Remark);
+                if (snapshot is null)
+                {
+                    stringBuilder.Append($"随手拍: {order.No} 不存在");
+                    continue;
+                }
 
-            var workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withDefine: true, withSteps: true, withTraces: true,
-                cancellationToken: HttpContext.RequestAborted);
+                var workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withDefine: true, withSteps: true, withTraces: true,
+                    cancellationToken: HttpContext.RequestAborted);
 
-            NextStepsWithOpinionDto<NextStepOption> nextSteps;
-            try
-            {
-                nextSteps = await _workflowApplication.GetNextStepsAsync(order.WorkflowId, HttpContext.RequestAborted);
-            }
-            catch (UserFriendlyException e)
-            {
-                if (e.Message.Contains("未找到对应节点"))
+                NextStepsWithOpinionDto<NextStepOption> nextSteps;
+                try
+                {
+                    nextSteps = await _workflowApplication.GetNextStepsAsync(order.WorkflowId, HttpContext.RequestAborted);
+                }
+                catch (UserFriendlyException e)
                 {
-                    stringBuilder.AppendLine($"{order.No} 修改成功");
+                    if (e.Message.Contains("未找到对应节点"))
+                    {
+                        stringBuilder.AppendLine($"{order.No} 修改成功");
+                        continue;
+                    }
+
+                    throw;
+                }
+
+                var stepInfo = nextSteps.Steps.FirstOrDefault(m => m.BusinessType == EBusinessType.Send);
+                if (stepInfo == null)
+                {
+                    stringBuilder.Append($"下一步节点: [派单组] 未找到");
                     continue;
                 }
 
-                throw;
+                var data = new OrderHandleFlowDto
+                {
+                    OrderId = orderId,
+                    IsSafetyDepartment = dto.IsSafetyDepartment
+                };
+                var workflowDto = new NextWorkflowDto
+                {
+                    WorkflowId = order.WorkflowId,
+                    StepId = nextSteps.StepId,
+                    NextStepCode = stepInfo.Key,
+                    NextStepName = stepInfo.Value,
+                    Opinion = dto.Remark,
+                    BackToCountersignEnd = false,
+                    IsSms = false,
+                    IsForwarded = false,
+                    HandlerType = EHandlerType.OrgLevel,
+                    BusinessType = EBusinessType.Send,
+                    FlowDirection = EFlowDirection.CenterToCenter,
+                };
+                var startStep = workflow.Steps.First(d => d.Id == nextSteps.StepId);
+                await HandleOrderAsync(order, workflow, startStep, data, workflowDto, HttpContext.RequestAborted);
+                stringBuilder.AppendLine($"{orderId} 标注完成;");
             }
-
-            var stepInfo = nextSteps.Steps.FirstOrDefault(m => m.BusinessType == EBusinessType.Send);
-            if (stepInfo == null)
+        }
+        else
+        {
+            var orderNo = await _redPackAuditRepository.Queryable()
+                .LeftJoin<Order>((m , order) => m.OrderId == order.Id)
+                .Where(m => dto.OrderIds.Contains(m.OrderId) && m.Status != ERedPackAuditStatus.Pending)
+                .Select((m, order) => order.No)
+                .ToListAsync();
+            if (orderNo.NotNullOrEmpty())
+                stringBuilder.AppendLine(string.Join(',', orderNo) + " 该工单已红包审批,无法修改标记状态!");
+            else
             {
-                stringBuilder.Append($"下一步节点: [派单组] 未找到");
-                continue;
+                await _orderSnapshotRepository.Updateable()
+                    .SetColumns(m => m.IsSafetyDepartment, dto.IsSafetyDepartment)
+                    .SetColumns(m => m.SignRemark, dto.Remark)
+                    .Where(m => dto.OrderIds.Contains(m.Id))
+                    .ExecuteCommandAsync();
+                stringBuilder.AppendLine("标注完成;");
             }
-
-            var data = new OrderHandleFlowDto
-            {
-                OrderId = orderId,
-                IsSafetyDepartment = dto.IsSafetyDepartment
-            };
-            var workflowDto = new NextWorkflowDto
-            {
-                WorkflowId = order.WorkflowId,
-                StepId = nextSteps.StepId,
-                NextStepCode = stepInfo.Key,
-                NextStepName = stepInfo.Value,
-                Opinion = dto.Remark,
-                BackToCountersignEnd = false,
-                IsSms = false,
-                IsForwarded = false,
-                HandlerType = EHandlerType.OrgLevel,
-                BusinessType = EBusinessType.Send,
-                FlowDirection = EFlowDirection.CenterToCenter,
-            };
-            var startStep = workflow.Steps.First(d => d.Id == nextSteps.StepId);
-            await HandleOrderAsync(order, workflow, startStep, data, workflowDto, HttpContext.RequestAborted);
-            stringBuilder.AppendLine($"{orderId} 标注完成;");
         }
 
         return stringBuilder.ToString();

+ 59 - 43
src/Hotline.Application/OrderApp/OrderApplication.cs

@@ -48,6 +48,7 @@ using Hotline.Validators.FlowEngine;
 using Mapster;
 using MapsterMapper;
 using MediatR;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion.Internal;
 using Microsoft.Extensions.Options;
 using PanGu;
 using Quartz.Simpl;
@@ -1317,7 +1318,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         if (_appOptions.Value.IsYiBin && visit.VisitState == EVisitState.Visited)
             throw UserFriendlyException.SameMessage("已回访,不能重复回访");
 
-        var visitTemp = visit;
+        bool exisNoSatisfiedSeat = false;
+        bool exisNoSatisfiedOrg = false;
 
         //记录修改历史
         try
@@ -1335,6 +1337,35 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                     await _orderVisitDetailCopyRepository.AddRangeAsync(visitDetailsCopy, cancellationToken);
                     visit.IsUpdate = true;
                 }
+
+                //#  再次回访处理之前的甄别记录
+                //## 若用户将语音评价结果修改为了满意,此时甄别类型为中心话务甄别的工单,需从甄别待审批中删除;部门办件甄别的工单需保留
+                if (visit.OrderVisitDetails != null && visit.OrderVisitDetails.Count > 0)
+                {
+                    // 坐席
+                    // 判断老数据是否是不满意
+                    var visitDataSeat = visit.OrderVisitDetails.Where(x => x.VisitTarget == EVisitTarget.Seat).FirstOrDefault();
+                    if (visitDataSeat != null)
+                    {
+                        if (visitDataSeat.VoiceEvaluate == EVoiceEvaluate.NoSatisfied ||
+                            visitDataSeat.VoiceEvaluate == EVoiceEvaluate.VeryNoSatisfied)
+                        {
+                            exisNoSatisfiedSeat = true;
+                        }
+                    }
+
+                    // 部门
+                    // 判断老数据是否是不满意
+                    var visitDataOrg = visit.OrderVisitDetails.Where(x => x.VisitTarget == EVisitTarget.Org).FirstOrDefault();
+                    if (visitDataOrg != null)
+                    {
+                        if (visitDataOrg.OrgProcessingResults?.Value == "不满意" ||
+                            visitDataOrg.OrgProcessingResults?.Value == "非常不满意")
+                        {
+                            exisNoSatisfiedOrg = true;
+                        }
+                    }
+                }
             }
         }
         catch (Exception)
@@ -1488,56 +1519,41 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 //## 若用户将语音评价结果修改为了满意,此时甄别类型为中心话务甄别的工单,需从甄别待审批中删除;部门办件甄别的工单需保留
                 if (dto.IsUpdate.HasValue && dto.IsUpdate == true)
                 {
-                    if (visitTemp.OrderVisitDetails != null && visitTemp.OrderVisitDetails.Count > 0)
+                    // 坐席
+                    // 判断老数据是否是不满意
+                    if (exisNoSatisfiedSeat)
                     {
-                        // 坐席
-                        // 判断老数据是否是不满意
-                        var visitDataSeat = visitTemp.OrderVisitDetails.Where(x => x.VisitTarget == EVisitTarget.Seat).FirstOrDefault();
-                        if (visitDataSeat != null)
+                        // 判断更新数据是否是满意
+                        var visitData = dto.VisitDetails.Where(x => x.VisitTarget == EVisitTarget.Seat).FirstOrDefault();
+                        if (visitData != null)
                         {
-                            if (visitDataSeat.VoiceEvaluate == EVoiceEvaluate.NoSatisfied ||
-                                visitDataSeat.VoiceEvaluate == EVoiceEvaluate.VeryNoSatisfied)
+                            if ((visitData.VoiceEvaluate == EVoiceEvaluate.VerySatisfied ||
+                                 visitData.VoiceEvaluate == EVoiceEvaluate.Satisfied) &&
+                                (visitData.SeatEvaluate == ESeatEvaluate.VerySatisfied ||
+                                 visitData.SeatEvaluate == ESeatEvaluate.Satisfied))
                             {
-                                // 判断更新数据是否是满意
-                                var visitData = dto.VisitDetails.Where(x => x.VisitTarget == EVisitTarget.Seat).FirstOrDefault();
-                                if (visitData != null)
-                                {
-                                    if ((visitData.VoiceEvaluate == EVoiceEvaluate.VerySatisfied ||
-                                         visitData.VoiceEvaluate == EVoiceEvaluate.Satisfied) &&
-                                        (visitData.SeatEvaluate == ESeatEvaluate.VerySatisfied ||
-                                         visitData.SeatEvaluate == ESeatEvaluate.Satisfied))
-                                    {
-                                        await _orderScreenRepository.RemoveAsync(x => x.VisitId == visitData.VisitId);
-                                    }
-                                }
+                                await _orderScreenRepository.RemoveAsync(x => x.VisitId == visitData.VisitId);
                             }
                         }
+                    }
 
-                        // 部门
-                        // 判断老数据是否是不满意
-                        var visitDataOrg = visitTemp.OrderVisitDetails.Where(x => x.VisitTarget == EVisitTarget.Org).FirstOrDefault();
-                        if (visitDataOrg != null)
+                    // 部门
+                    // 判断老数据是否是不满意
+                    if (exisNoSatisfiedOrg)
+                    {
+                        // 判断更新数据是否是满意
+                        var visitData = dto.VisitDetails.Where(x => x.VisitTarget == EVisitTarget.Org).FirstOrDefault();
+                        if (visitData != null)
                         {
-                            if (visitDataOrg.VoiceEvaluate == EVoiceEvaluate.NoSatisfied ||
-                                visitDataOrg.VoiceEvaluate == EVoiceEvaluate.VeryNoSatisfied)
+                            if (visitData.OrgProcessingResults != null)
                             {
-                                // 判断更新数据是否是满意
-                                var visitData = dto.VisitDetails.Where(x => x.VisitTarget == EVisitTarget.Org).FirstOrDefault();
-                                if (visitData != null)
+                                if (visitData.OrgProcessingResults.Value == "非常满意" ||
+                                    visitData.OrgProcessingResults.Value == "满意")
                                 {
-                                    if (visitData.OrgProcessingResults != null)
-                                    {
-                                        if (visitData.OrgProcessingResults.Value == "非常满意" ||
-                                            visitData.OrgProcessingResults.Value == "满意")
-                                        {
-                                            await _orderScreenRepository.RemoveAsync(x => x.VisitId == visitData.VisitId);
-                                        }
-                                    }
+                                    await _orderScreenRepository.RemoveAsync(x => x.VisitId == visitData.VisitId);
                                 }
                             }
                         }
-
-
                     }
                 }
             }
@@ -3887,17 +3903,17 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                     .Where((s, p) => p.DicDataValue == dto.OrderTagCode && d.OrderId == s.OrderId).Any()) //工单标签
             .WhereIF(dto.IsUpdate.HasValue && dto.IsUpdate == true, d => d.IsUpdate == true)
             .WhereIF(dto.IsUpdate.HasValue && dto.IsUpdate == false, d => d.IsUpdate == false || d.IsUpdate == null)
+            
             .OrderByIF(_appOptions.Value.IsYiBin && dto.VisitStateQuery != EVisitStateQuery.Visited, d => d.Order.IsUrgent, OrderByType.Desc)
             .OrderByIF(_appOptions.Value.IsZiGong == false, d => d.PublishTime, OrderByType.Desc)
-            //.OrderByDescending(d => d.PublishTime)
             .OrderByIF(dto is { SortField: "publishTime", SortRule: 0 }, x => x.PublishTime, OrderByType.Asc) // 发布时间升序
             .OrderByIF(dto is { SortField: "publishTime", SortRule: 1 }, x => x.PublishTime, OrderByType.Desc)// 发布时间升序
             .OrderByIF(dto is { SortField: "order.creationTime", SortRule: 0 }, x => x.Order.CreationTime, OrderByType.Asc) // 受理时间升序
             .OrderByIF(dto is { SortField: "order.creationTime", SortRule: 1 }, x => x.Order.CreationTime, OrderByType.Desc) // 受理时间升序
             .OrderByIF(dto is { SortField: "order.filedTime", SortRule: 0 }, x => x.Order.FiledTime, OrderByType.Asc) // 办结时间升序
             .OrderByIF(dto is { SortField: "order.filedTime", SortRule: 1 }, x => x.Order.FiledTime, OrderByType.Desc) // 办结时间升序
-            .OrderByIF(dto is { SortField: "order.visitTime", SortRule: 0 }, x => x.VisitTime, OrderByType.Asc) // 回访时间升序
-            .OrderByIF(dto is { SortField: "order.visitTime", SortRule: 1 }, x => x.VisitTime, OrderByType.Desc) // 回访时间升序
+            .OrderByIF(dto is { SortField: "visitTime", SortRule: 0 }, x => x.VisitTime, OrderByType.Asc) // 回访时间升序
+            .OrderByIF(dto is { SortField: "visitTime", SortRule: 1 }, x => x.VisitTime, OrderByType.Desc) // 回访时间升序
             .OrderByIF(_appOptions.Value.IsZiGong && string.IsNullOrEmpty(dto.SortField), d => d.PublishTime, OrderByType.Desc)
             ;
         return query;
@@ -5582,7 +5598,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 .WhereIF(dto.ExpiredTimeStart.HasValue, d => d.Order.ExpiredTime >= dto.ExpiredTimeStart) //期满时间开始
                 .WhereIF(dto.ExpiredTimeEnd.HasValue, d => d.Order.ExpiredTime <= dto.ExpiredTimeEnd) //期满时间结束
                 .WhereIF(!string.IsNullOrEmpty(dto.DelayApplyName), d => d.EmployeeName.Contains(dto.DelayApplyName))//申请人
-                .WhereIF(!string.IsNullOrEmpty(dto.DelayApplyOrgName), d => d.ApplyOrgName.Contains(dto.DelayApplyName))//申请部门
+                .WhereIF(!string.IsNullOrEmpty(dto.DelayApplyOrgName), d => d.ApplyOrgName.Contains(dto.DelayApplyOrgName))//申请部门
                 .WhereIF(dto.IsAutomaticDelay.HasValue && dto.IsAutomaticDelay == true, d => d.AutomaticDelayNum != null && d.AutomaticDelayNum > 0)//自动延期
                 .WhereIF(dto.IsAutomaticDelay.HasValue && dto.IsAutomaticDelay == false, d => d.AutomaticDelayNum == null || d.AutomaticDelayNum == 0)//非自动延期
                 .OrderByDescending(d => d.ApplyDelayTime)

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

@@ -343,6 +343,9 @@ public class RedPackApplication : IRedPackApplication, IScopeDependency
                             OpenBank = supplement.OpenBank,
                             AuditStatus = special.Status,
                         });
+#if DEBUG
+        var sql = query.ToSqlString();
+#endif        
         return query;
     }
 
@@ -591,6 +594,7 @@ public class RedPackApplication : IRedPackApplication, IScopeDependency
                 entity.No = orderNo;
                 entity.IndustryName = industryName.IndustryName;
                 entity.IndustryId = industryName.IndustryId;
+                entity.ReplenishRemark = dto.ReplenishRemark;
                 await _supplementRecordRepository.AddAsync(entity);
 
                 if (dto.IsSendSMS)
@@ -625,6 +629,7 @@ public class RedPackApplication : IRedPackApplication, IScopeDependency
                 entity.No = orderNo;
                 entity.IndustryName = industryName.IndustryName;
                 entity.IndustryId = industryName.IndustryId;
+                entity.ReplenishRemark = dto.ReplenishRemark;
                 await _supplementRecordRepository.AddAsync(entity);
 
                 if (dto.IsSendSMS)

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

@@ -226,7 +226,7 @@ public class SnapshotOrderApplication : IOrderSnapshotApplication, IScopeDepende
             .LeftJoin<WorkflowStep>((snapshot, order, step) => step.ExternalId == order.Id && step.Tag == TagDefaults.OrderMark && step.Status != EWorkflowStepStatus.Handled)
             .Where((snapshot, order, step) => snapshot.IndustryName == "安全隐患")
             .WhereIF(dto.Status == 1, (snapshot, order, step) => step.Id != null && snapshot.IsSafetyDepartment == null) // 待标记
-            .WhereIF(dto.Status == 2, (snapshot, order, step) => snapshot.IsSafetyDepartment != null) // 已标记
+            .WhereIF(dto.Status == 2, (snapshot, order, step) => snapshot.IsSafetyDepartment != null && snapshot.SignUserId == _sessionContext.UserId) // 已标记
             .WhereIF(dto.No.NotNullOrEmpty(), (snapshot, order, step) => order.No.Contains(dto.No))
             .WhereIF(dto.Title.NotNullOrEmpty(), (snapshot, order, step) => order.Title.Contains(dto.Title))
             .OrderByDescending((snapshot, order, step) => snapshot.CreationTime)

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

@@ -107,6 +107,33 @@ namespace Hotline.Share.Dtos.Order
 
         public List<SystemDicDataOutDto>? OrderTags { get; set; }
 
+        /// <summary>
+        /// 一级标签
+        /// </summary>
+        public string? OrderTagsOneName => GetOrderTagsOne(1);
+
+        /// <summary>
+        /// 二级标签
+        /// </summary>
+        public string? OrderTagsTwoName => GetOrderTagsOne(2);
+
+        private string? GetOrderTagsOne(int level)
+        {
+            if (OrderTags != null && OrderTags.Any())
+            {
+                List<SystemDicDataOutDto> tagsData = [];
+                if (level == 1)
+                    tagsData = OrderTags.Where(p => p.ParentId == null || p.ParentId == "").ToList();
+                if (level == 2)
+                    tagsData = OrderTags.Where(p => p.ParentId != null && p.ParentId != "").ToList();
+                if (tagsData != null && tagsData.Any())
+                {
+                    return string.Join(",", tagsData.Select(x => x.DicDataName));
+                }
+            }
+            return string.Empty;
+        }
+
         #region 流程信息
 
         /// <summary>

+ 5 - 0
src/Hotline.Share/Dtos/Settings/SystemDicDataDto.cs

@@ -20,6 +20,11 @@
         /// </summary>
         public string DicDataValue { get; set; }
 
+        /// <summary>
+		/// 上级ID
+		/// </summary>
+        public string? ParentId { get; set; }
+
         /// <summary>
         /// 子集集合
         /// </summary>

+ 24 - 12
src/Hotline.Share/Dtos/Snapshot/IndustryDto.cs

@@ -78,6 +78,11 @@ public class IndustryDetailOutDto : IndustryItemsOutDto
     /// App是否启用
     /// </summary>
     public bool IsAppEnable { get; set; }
+
+    /// <summary>
+    /// 是否开启积分
+    /// </summary>
+    public bool? IsPoints { get; set; }
 }
 
 public class IndustryItemsOutDto : IndustryOutDto
@@ -173,22 +178,27 @@ public class IndustryOutDto
     /// <summary>
     /// 上报积分
     /// </summary>
-    public int ReportPoints { get; set; }
+    public int? ReportPoints { get; set; }
 
     /// <summary>
     /// 审核同意积分
     /// </summary>
-    public int ArgeePoints { get; set; }
+    public int? ArgeePoints { get; set; }
 
     /// <summary>
     /// 审核不同意扣除积分
     /// </summary>
-    public int RefusePoints { get; set; }
+    public int? RefusePoints { get; set; }
 
     /// <summary>
     /// 额外扣除积分
     /// </summary>
-    public int ExtraDeductedPoints { get; set; }
+    public int? ExtraDeductedPoints { get; set; }
+
+    /// <summary>
+    /// 是否开启积分
+    /// </summary>
+    public bool? IsPoints { get; set; }
 
 }
 
@@ -417,26 +427,28 @@ public class AddIndustryDto
     /// <summary>
     /// 上报积分
     /// </summary>
-    [Required]
-    public int ReportPoints { get; set; }
+    public int? ReportPoints { get; set; }
 
     /// <summary>
     /// 审核同意积分
     /// </summary>
-    [Required]
-    public int ArgeePoints { get; set; }
+    public int? ArgeePoints { get; set; }
 
     /// <summary>
     /// 审核不同意扣除积分
     /// </summary>
-    [Required]
-    public int RefusePoints { get; set; }
+    public int? RefusePoints { get; set; }
 
     /// <summary>
     /// 额外扣除积分
     /// </summary>
-    [Required]
-    public int ExtraDeductedPoints { get; set; }
+    public int? ExtraDeductedPoints { get; set; }
+
+    /// <summary>
+    /// 是否开启积分
+    /// </summary>
+    public bool? IsPoints { get; set; }
+
 }
 
 public class IndustryCaseItemOutDto : AddIndustryCaseDto

+ 13 - 0
src/Hotline.Share/Dtos/Snapshot/OrderDto.cs

@@ -802,6 +802,11 @@ public class SnapshotOrderAuditDetailOutDto
     /// </summary>
     public IEnumerable<KeyValuePair<int, string>> AuditComBox { get; set; }
 
+    /// <summary>
+    /// 是否开启积分
+    /// </summary>
+    public bool? IsPoints { get; set; }
+
     /// <summary>
     /// 额外扣除积分类型
     /// </summary>
@@ -1746,6 +1751,14 @@ public class OrderSignBathInDto
     /// 备注
     /// </summary>
     public string Remark { get; set; }
+
+    /// <summary>
+    /// 状态;
+    /// 0: 全部;
+    /// 1: 待标签;
+    /// 2: 已标签;
+    /// </summary>
+    public int Status { get; set; }
 }
 
 public record LabelOrderSnapshotLogItemsInDto : PagedRequest

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

@@ -199,6 +199,11 @@ public class SnapshotRedPackRecordSupplementItemsOutDto
     /// </summary>
     public string FromPhone { get; set; }
 
+    /// <summary>
+    /// 来电人姓名
+    /// </summary>
+    public string FromName { get; set; }
+
     /// <summary>
     /// 区域
     /// </summary>
@@ -238,6 +243,17 @@ public class SnapshotRedPackRecordSupplementItemsOutDto
     /// 备注
     /// </summary>
     public string Remark { get; set; }
+
+    /// <summary>
+    /// 补充发放类型
+    /// </summary>
+    public string? ReplenishType { get; set; }
+
+    /// <summary>
+    /// 补充发放类型Id
+    /// </summary>
+    public string? ReplenishTypeId { get; set; }
+
 }
 
 public record SnapshotRedPackRecordSupplementItemsInDto : PagedRequest

+ 6 - 0
src/Hotline/Snapshot/Industry.cs

@@ -173,6 +173,12 @@ public class Industry : CreationSoftDeleteEntity
     [SugarColumn(ColumnDescription = "行业类型")]
     public EIndustryType IndustryType { get; set; }
 
+    /// <summary>
+    /// 是否开启积分
+    /// </summary>
+    [SugarColumn(ColumnDescription = "是否开启积分")]
+    public bool? IsPoints { get; set; }
+
     /// <summary>
     /// 上报积分
     /// </summary>

+ 2 - 0
test/Hotline.Tests/Application/IndustryApplicationTest.cs

@@ -58,6 +58,7 @@ public class IndustryApplicationTest : TestBase
         var orgs = await _systemOrganizeRepository.GetOrgEnabled();
         industry.ApproveOrgId = orgs.First().Key;
         industry.ApproveOrgName = null;
+        industry.IsPoints = false;
         await _industryApplication.UpdateIndustryAsync(industry, CancellationToken.None);
         var updateIndustry = await _industryApplication.GetIndustryDetailAsync(item.Id, CancellationToken.None);
         updateIndustry.ForeachClassProperties(async (industry, property, name, value) =>
@@ -65,6 +66,7 @@ public class IndustryApplicationTest : TestBase
             industry.GetType().GetProperty(name).GetValue(industry).ShouldBe(value);
             return true;
         });
+        updateIndustry.IsPoints.ShouldBe(false);
         await _industryApplication.UpdateIndustryAsync(item.Adapt<UpdateIndustryInDto>(), CancellationToken.None);
     }
 

+ 28 - 2
test/Hotline.Tests/Application/OrderSnapshotApplicationTest.cs

@@ -113,7 +113,7 @@ public class OrderSnapshotApplicationTest : TestBase
         SetSettingCache(SettingConstants.OvertimeBack, "4");
         var snapshotLabels = _systemDicDataCacheManager.SnapshotOrderLabel;
         var inputLable = snapshotLabels.Where(m => m.DicDataValue == "bss").ToList();
-        var industryCase = await _industryCaseRepository.Queryable().Where(m => m.IsEnable ==  true).FirstAsync();
+        var industryCase = await _industryCaseRepository.Queryable().Where(m => m.IsEnable == true).FirstAsync();
         var order = _orderServiceMock.CreateSnapshotOrder(SetWeiXin)
             .办理到网格员(SetZuoXi)
             .StepHandle(async (order, mock) =>
@@ -170,7 +170,8 @@ public class OrderSnapshotApplicationTest : TestBase
                 data.IndustryCase = industryCase.Id;
                 data.IsRectifyDepartment = true;
             })
-            .StepHandle(async order => {
+            .StepHandle(async order =>
+            {
                 var snapshot = await _orderSnapshotRepository.GetAsync(order.Id);
                 snapshot.IndustryCase.ShouldBe(industryCase.Id);
                 var orderDetail = await _orderController.Get(order.Id);
@@ -210,6 +211,31 @@ public class OrderSnapshotApplicationTest : TestBase
                 baseData.AuditType.ShouldNotBeNull();
                 baseData.AuditTypeCode.ShouldNotBeNull();
                 baseData.Amount.ShouldNotBeNull();
+
+                var specialRedAuditItems = await _redPackApplication.GetRedPackSpecialAuditItems(new SnapshotOrderAuditItemsInDto(order.No, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 1) { PageIndex = 1, PageSize = 10 }).ToListAsync();
+                var specialRedAudit = specialRedAuditItems.FirstOrDefault();
+                specialRedAudit.ShouldNotBeNull();
+                var a = _systemDicDataCacheManager.SnapshotReplenishType.First();
+                var inDto = new UpdateRedPackRecordInDto
+                {
+                    RedPackAuditId = baseData.RedPackAuditId,
+                    Name = "收银人",
+                    BankCardNo = "1233921321",
+                    OpenBank = "建设银行",
+                    ReplenishAmount = 10,
+                    ReplenishTime = DateTime.Now,
+                    ReplenishRemark = "补充发放备注",
+                    IsSendSMS = false,
+                    ReplenishType = a.DicDataName,
+                    ReplenishTypeId = a.DicDataValue
+                };
+
+                await _redPackApplication.UpdateRedPackSpecialRecordAsync(inDto);
+                specialRedAuditItems = await _redPackApplication.GetRedPackSpecialAuditItems(new SnapshotOrderAuditItemsInDto(order.No, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 1) { PageIndex = 1, PageSize = 10 }).ToListAsync();
+                specialRedAudit = specialRedAuditItems.First();
+                specialRedAudit.ShouldNotBeNull();
+                specialRedAudit.BankCardNo.ShouldBe(inDto.BankCardNo);
+                specialRedAudit.OpenBank.ShouldBe(inDto.OpenBank);
             })
             .GetCreateResult();
         order.Id.ShouldNotBeNull();

+ 11 - 0
test/Hotline.Tests/Application/RedPackApplicationTest.cs

@@ -8,6 +8,7 @@ using Hotline.Settings;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Snapshot;
 using Hotline.Share.Enums.Snapshot;
+using Hotline.Share.Tools;
 using Hotline.Snapshot.IRepository;
 using Hotline.Tests.Mock;
 using Hotline.ThirdAccountDomainServices;
@@ -164,4 +165,14 @@ public class RedPackApplicationTest : TestBase
         }).ToListAsync();
         sendRecordItems.Count.ShouldNotBe(0);
     }
+
+    [Fact]
+    public async Task GetRedPackRecordSupplementItems_Test()
+    {
+        var items = await _redPackApplication.GetRedPackRecordSupplementItems(new SnapshotRedPackRecordSupplementItemsInDto()).ToListAsync();
+        items.Any(m => m.FromName.NotNullOrEmpty()).ShouldBeTrue();
+        items.Any(m => m.Remark.NotNullOrEmpty()).ShouldBeTrue();
+        items.Any(m => m.ReplenishType.NotNullOrEmpty()).ShouldBeTrue();
+        items.ShouldNotBeNull();
+    }
 }

+ 7 - 5
test/Hotline.Tests/Application/SnapshotApplicationTest.cs

@@ -471,17 +471,19 @@ public class SnapshotApplicationTest : TestBase
             ArgeePoints = 3,
             ExtraDeductedPoints = 2,
             RefusePoints = 1,
-            ReportPoints = 4
+            ReportPoints = 4,
+            IsPoints = false
         };
         var industryId = await _industryApplication.AddIndustryAsync(industry, CancellationToken.None);
         var pageDto = await _snapshotApplication.GetIndustryBaseAsync(industryId, CancellationToken.None);
         var industryOut = await _industryApplication.GetIndustryDetailAsync(industryId, CancellationToken.None);
         try
         {
-            industryOut.ArgeePoints.ShouldBe(industry.ArgeePoints);
-            industryOut.ExtraDeductedPoints.ShouldBe(industry.ExtraDeductedPoints);
-            industryOut.RefusePoints.ShouldBe(industry.RefusePoints);
-            industryOut.ReportPoints.ShouldBe(industry.ReportPoints);
+            industryOut.ArgeePoints.Value.ShouldBe(industry.ArgeePoints.Value);
+            industryOut.ExtraDeductedPoints.Value.ShouldBe(industry.ExtraDeductedPoints.Value);
+            industryOut.RefusePoints.Value.ShouldBe(industry.RefusePoints.Value);
+            industryOut.ReportPoints.Value.ShouldBe(industry.ReportPoints.Value);
+            industryOut.IsPoints.ShouldBe(industry.IsPoints);
             pageDto.ShouldNotBeNull();
             pageDto.Files.ShouldNotBeNull();
             foreach (var file in pageDto.Files)