浏览代码

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

xf 6 月之前
父节点
当前提交
02cd525fc4

+ 12 - 0
src/Hotline.Api/Controllers/CommonPController.cs

@@ -317,6 +317,12 @@ namespace Hotline.Api.Controllers
 				//部门即将超期
 				var nearlyExpiredDataList = await _orderRepository.Queryable(canView: !IsCenter)
 					.Includes(d => d.OrderDelays)
+					.Where(d => SqlFunc.Subqueryable<WorkflowStep>()
+						.Where(step => step.ExternalId == d.Id &&
+						               ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
+						                (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
+						                (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId))))
+						.Any())
 					.Where(d => d.Status < EOrderStatus.Filed && DateTime.Now > d.NearlyExpiredTime && DateTime.Now < d.ExpiredTime)
 					.OrderByDescending(d => d.CreationTime)
 					.Select(d => new HomeOrderDto
@@ -539,6 +545,12 @@ namespace Hotline.Api.Controllers
 				//部门即将超期
 				var nearlyExpiredDataList = await _orderRepository.Queryable(canView: !IsCenter)
 					.Includes(d => d.OrderDelays)
+					.Where(d => SqlFunc.Subqueryable<WorkflowStep>()
+						.Where(step => step.ExternalId == d.Id &&
+						               ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
+						                (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
+						                (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId))))
+						.Any())
 					.Where(d => d.Status < EOrderStatus.Filed && DateTime.Now > d.NearlyExpiredTime && DateTime.Now < d.ExpiredTime)
 					.OrderByDescending(d => d.CreationTime)
 					.Select(d => new HomeOrderDto

+ 5 - 3
src/Hotline.Api/Controllers/HotSpotController.cs

@@ -204,7 +204,7 @@ namespace Hotline.Api.Controllers
         public async Task DelEventCategory(string[] id)
         {
             var list = await _eventCategoryRepository.Queryable().In(id).ToListAsync(HttpContext.RequestAborted);
-            await _eventCategoryRepository.RemoveRangeAsync(list, HttpContext.RequestAborted);
+            await _eventCategoryRepository.RemoveRangeAsync(list,true, HttpContext.RequestAborted);
         }
 
         /// <summary>
@@ -220,9 +220,11 @@ namespace Hotline.Api.Controllers
                 throw UserFriendlyException.SameMessage("无效数据");
 
             model.EventName = dto.EventName;
-            if (dto.EventFullName.IndexOf("-") > 0)
+
+            var parentModel = await _eventCategoryRepository.GetAsync(model.ParentId, HttpContext.RequestAborted);
+            if (parentModel!= null)
             {
-                model.EventFullName = dto.EventFullName + "-" + model.EventName;
+                model.EventFullName = parentModel.EventFullName + "-" + model.EventName;
             }
             model.OrderBy = dto.OrderBy;
             await _eventCategoryRepository.UpdateAsync(model, HttpContext.RequestAborted);

+ 25 - 19
src/Hotline.Api/Controllers/IPPbxController.cs

@@ -781,37 +781,43 @@ namespace Hotline.Api.Controllers
         public async Task LinkCallRecord([FromBody] LinkCallRecordDto dto)
         {
             //var trRecord = await _trCallRecordRepository.GetAsync(x => x.CallAccept == dto.CallId, HttpContext.RequestAborted);//由CallAccept改为OtherAccept
-            var trRecord = await _trCallRecordRepository.GetAsync(x => x.OtherAccept == dto.CallId, HttpContext.RequestAborted);
+            
             if (dto.IsOrder)
             {
-                if (trRecord.CallOrderType == ECallOrderType.Order && !string.IsNullOrEmpty(trRecord.ExternalId))
-                    throw UserFriendlyException.SameMessage("通话记录已经关联工单");
-
-                //工单
-                var order = await _orderRepository.GetAsync(x => x.Id == dto.Id, HttpContext.RequestAborted);
-                if (!string.IsNullOrEmpty(order.CallId))
-                    throw UserFriendlyException.SameMessage("通话记录已经关联工单");
-
-                order.CallId = dto.CallId;
-                order.FromPhone = trRecord.CPN;
-                order.TransferPhone = trRecord.Gateway;
-                await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
-                trRecord.CallOrderType = ECallOrderType.Order;
-                trRecord.ExternalId = order.Id;
-
-                //推省上
-                await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineCallConnectWithOrder, new PublishCallRecrodDto() { Order = _mapper.Map<OrderDto>(order), TrCallRecordDto = _mapper.Map<TrCallDto>(trRecord) });
+                var trRecords = await _trCallRecordRepository.Queryable().Where(x => x.OtherAccept == dto.CallId).ToListAsync(HttpContext.RequestAborted);
+                foreach (var trRecord in trRecords)
+                {
+                    if (trRecord.CallOrderType == ECallOrderType.Order && !string.IsNullOrEmpty(trRecord.ExternalId))
+                        throw UserFriendlyException.SameMessage("通话记录已经关联工单");
+
+                    //工单
+                    var order = await _orderRepository.GetAsync(x => x.Id == dto.Id, HttpContext.RequestAborted);
+                    if (!string.IsNullOrEmpty(order.CallId))
+                        throw UserFriendlyException.SameMessage("通话记录已经关联工单");
+
+                    order.CallId = dto.CallId;
+                    order.FromPhone = trRecord.CPN;
+                    order.TransferPhone = trRecord.Gateway;
+                    await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
+                    trRecord.CallOrderType = ECallOrderType.Order;
+                    trRecord.ExternalId = order.Id;
+                    await _trCallRecordRepository.UpdateAsync(trRecord, HttpContext.RequestAborted);
+                    //推省上
+                    await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineCallConnectWithOrder, new PublishCallRecrodDto() { Order = _mapper.Map<OrderDto>(order), TrCallRecordDto = _mapper.Map<TrCallDto>(trRecord) });
+                }
             }
             else
             {
+                var trRecord = await _trCallRecordRepository.GetAsync(x => x.OtherAccept == dto.CallId, HttpContext.RequestAborted);
                 //回访
                 var visit = await _orderVisitRepository.GetAsync(x => x.Id == dto.Id, HttpContext.RequestAborted);
                 visit.CallId = dto.CallId;
                 await _orderVisitRepository.UpdateAsync(visit, HttpContext.RequestAborted);
                 trRecord.CallOrderType = ECallOrderType.Visit;
                 trRecord.ExternalId = visit.Id;
+                await _trCallRecordRepository.UpdateAsync(trRecord, HttpContext.RequestAborted);
             }
-            await _trCallRecordRepository.UpdateAsync(trRecord, HttpContext.RequestAborted);
+           
         }
 
 

+ 70 - 1
src/Hotline.Api/Controllers/OrderController.cs

@@ -24,6 +24,7 @@ using Hotline.Push.FWMessage;
 using Hotline.Push.Notifies;
 using Hotline.Repository.SqlSugar.CallCenter;
 using Hotline.Repository.SqlSugar.Extensions;
+using Hotline.Repository.SqlSugar.System;
 using Hotline.Repository.SqlSugar.Ts;
 using Hotline.SeedData;
 using Hotline.Settings;
@@ -55,6 +56,7 @@ using MediatR;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Options;
+using Microsoft.IdentityModel.Tokens;
 using MiniExcelLibs;
 using MongoDB.Driver;
 using SqlSugar;
@@ -141,6 +143,7 @@ public class OrderController : BaseController
     private readonly ICalcExpireTime _expireTime;
     private readonly IRepository<OrderPushType> _orderPushTypeRepository;
     private readonly IOptions<CityBaseConfiguration> _cityBaseConfiguration;
+    private readonly IRepository<OrderRevoke> _orderRevokeRepository;
 
     public OrderController(
         IOrderDomainService orderDomainService,
@@ -204,7 +207,8 @@ public class OrderController : BaseController
         IRepository<OrderPushType> orderPushTypeRepository,
         IOptions<CityBaseConfiguration> cityBaseConfiguration,
         ICallNativeRepository callNativeRepository,
-        ICallNativeApplication callNativeApplication)
+        ICallNativeApplication callNativeApplication,
+        IRepository<OrderRevoke> orderRevokeRepository)
     {
         _orderDomainService = orderDomainService;
         _orderRepository = orderRepository;
@@ -268,6 +272,7 @@ public class OrderController : BaseController
         _cityBaseConfiguration = cityBaseConfiguration;
         _callNativeRepository = callNativeRepository;
         _callNativeApplication = callNativeApplication;
+        _orderRevokeRepository = orderRevokeRepository;
     }
     #endregion 
 
@@ -3000,6 +3005,41 @@ public class OrderController : BaseController
         {
             dto.IsReturnUnderApproval = true;
         }
+        //省退回
+        var orderSendback = await _orderSendBackRepository.Queryable().Where(x => x.OrderId == order.Id).OrderByDescending(x=>x.AuditTime).FirstAsync();
+        if (orderSendback is not null)
+        {
+            string stateStr = "";
+            // 0  待审核  1 审核通过  2 审核不通过
+            switch (orderSendback.State)
+            {
+                case 0:
+                    stateStr = "待审核";
+                    break;
+                case 1:
+                    stateStr = "审核通过";
+                    break;
+                case 2:
+                    stateStr = "审核不通过";
+                    break;
+                default:
+                    stateStr = "未知";
+                    break;
+            }
+            dto.ProvinceSendBackString = "该工单已向省平台发送退回申请!退回状态:"+ stateStr;
+        }
+
+        var isProvinceorderRevoke = await _orderRevokeRepository.Queryable().AnyAsync(x => x.OrderId == order.Id && x.IsProRevoke == true);
+        if (isProvinceorderRevoke)
+        {
+            dto.ProvinceRevokeString = "该工单已由省平台发送撤单!请直接归档办理!";
+        }
+        var isHasSendBackAudit = await _orderSendBackAuditRepository.Queryable().AnyAsync(x => x.OrderId == order.Id && x.State == ESendBackAuditState.Apply);
+        var isHasSendBack = await _orderSendBackRepository.Queryable().AnyAsync(x => x.OrderId == order.Id && x.State == 0);
+        if ((order.ActualHandleOrgCode == "001" || order.Status == EOrderStatus.WaitForAccept || string.IsNullOrEmpty(order.ActualHandleOrgCode)) && !isHasSendBackAudit && order.Status < EOrderStatus.Filed && order.IsProvince && !isHasSendBack && order.Status != EOrderStatus.BackToProvince)
+            dto.IsCanProvinceSendBack = true;
+        else
+            dto.IsCanProvinceSendBack = false;
 
         return dto;
     }
@@ -6456,6 +6496,35 @@ public class OrderController : BaseController
         return new PagedDto<ExternalcitizensRep>(total, _mapper.Map<IReadOnlyList<ExternalcitizensRep>>(items));
     }
 
+    /// <summary>
+    /// 删除外部市民
+    /// </summary>
+    /// <param name="ids"></param>
+    /// <returns></returns>
+    [HttpDelete("del-externalcitizens")]
+    public async Task DelExternalcitizens(string[] ids)
+    {
+        var list = await _externalCitizensRepository.Queryable().In(ids).ToListAsync(HttpContext.RequestAborted);
+        await _externalCitizensRepository.RemoveRangeAsync(list, HttpContext.RequestAborted);
+    }
+
+    /// <summary>
+    /// 修改外部市民
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpPost("modify-externalcitizens")]
+    public async Task ModifyExternalcitizens([FromBody]ModifyExternalcitizensDto dto)
+    {
+        var model = await _externalCitizensRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
+        if( model == null )
+            throw UserFriendlyException.SameMessage("无效数据");
+        model.PhoneNum = dto.PhoneNum;
+        model.Name = dto.Name;
+        await _externalCitizensRepository.UpdateAsync(model, HttpContext.RequestAborted);
+    }
+
+
     #endregion
 
     #region 工单期满时间、来源方式修改

+ 9 - 6
src/Hotline.Application/CallCenter/TianRunCallApplication.cs

@@ -136,13 +136,16 @@ namespace Hotline.Application.CallCenter
 		/// </summary>
 		public override async Task RelateTianrunCallWithOrderAsync(string callId, string orderId, CancellationToken cancellationToken)
         {
-            var callRecord = await _trCallRecordRepository.GetAsync(
-                p => p.OtherAccept == callId && string.IsNullOrEmpty(p.OtherAccept) == false, cancellationToken);
-            if (callRecord != null && string.IsNullOrEmpty(callRecord.ExternalId))
+            var callRecords = await _trCallRecordRepository.Queryable().Where(p => p.OtherAccept == callId && string.IsNullOrEmpty(p.OtherAccept) == false).ToListAsync(cancellationToken);
+
+            foreach (var callRecord in callRecords)
             {
-                callRecord.ExternalId = orderId;
-                callRecord.CallOrderType = Share.Enums.CallCenter.ECallOrderType.Order;
-                await _trCallRecordRepository.UpdateAsync(callRecord, cancellationToken);
+                if (callRecord != null && string.IsNullOrEmpty(callRecord.ExternalId))
+                {
+                    callRecord.ExternalId = orderId;
+                    callRecord.CallOrderType = Share.Enums.CallCenter.ECallOrderType.Order;
+                    await _trCallRecordRepository.UpdateAsync(callRecord, cancellationToken);
+                }
             }
         }
 

+ 9 - 0
src/Hotline.Application/Subscribers/DatasharingSubscriber.cs

@@ -199,6 +199,15 @@ namespace Hotline.Application.Subscribers
                         await _workflowApplication.JumpToEndAsync(current, order.WorkflowId, dto.Reason ?? "省工单同意退回",
                             null, order.ExpiredTime, cancellationToken: cancellationToken);
                     }
+                    //处理延期
+                    var orderDelayModel = await _orderDelayRepository.Queryable().Where(x => x.OrderId == order.Id && x.IsProDelay == false && x.DelayState == EDelayState.Examining).FirstAsync();
+                    if (orderDelayModel is not null)
+                    {
+                        orderDelayModel.DelayState = EDelayState.Withdraw;
+                        await _workflowApplication.JumpToEndAsync(current, orderDelayModel.WorkflowId, dto.Reason ?? "省退回同意自动处理", null, null, cancellationToken: cancellationToken);
+                    }
+
+                    //TODO 工单终止
                 }
                 else
                 {

+ 1 - 0
src/Hotline.Repository.SqlSugar/System/EventCategoryRepository.cs

@@ -14,6 +14,7 @@ namespace Hotline.Repository.SqlSugar.System
 
         public async Task<(string,string)> GetNewEventCodeAsync(string? parentId,string name)
         {
+            Db.QueryFilter.Clear();
             if (string.IsNullOrEmpty(parentId))
             {
                 //一级

+ 10 - 0
src/Hotline.Share/Dtos/Order/ExternalcitizensDto.cs

@@ -16,10 +16,20 @@ namespace Hotline.Share.Dtos.Order
 
     public class ExternalcitizensRep
     {
+        public string Id { get; set; }
         public string PhoneNum { get; set;}
 
         public string Name { get; set; }
 
         public DateTime CreationTime { get; set; }
     }
+
+    public class ModifyExternalcitizensDto
+    {
+        public string Id { get; set; }
+
+        public string PhoneNum { get; set; }
+
+        public string Name { get; set; }
+    }
 }

+ 17 - 1
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -685,7 +685,23 @@ namespace Hotline.Share.Dtos.Order
         /// 退回截至时间
         /// </summary>
         public DateTime? SendBackAuditEndTime { get; set; }
-	}
+
+        /// <summary>
+        /// 省退回信息
+        /// </summary>
+        public string ProvinceSendBackString { get; set; }
+
+        /// <summary>
+        /// 省撤单信息
+        /// </summary>
+        public string ProvinceRevokeString { get; set; }
+
+
+        /// <summary>
+        /// 是否可以省退回
+        /// </summary>
+        public bool IsCanProvinceSendBack { get; set; }
+    }
 
     public class UpdateOrderDto : AddOrderDto
     {

+ 120 - 1
src/Hotline/dataview.md

@@ -338,4 +338,123 @@ WHERE ordervisitdetailtemp."VisitTarget" = 20 and ordervisittemp."VisitTime">='2
  SUM(( CASE  WHEN ((( "CallDirection" = 0 ) AND ( "Duration" > 0 )) AND ( "Duration" <= 5 )) THEN 1  ELSE 0 END )) AS "ConnectByeCount" , 
  SUM(( CASE  WHEN ((( "CallDirection" = 0 ) AND ( "OnState" = 1 )) AND ( "RingTimes" <= 15 )) THEN 1  ELSE 0 END )) AS "TimelyAnswerCount"  
  FROM "tr_call_record"  WHERE (( "CreatedTime" >= '2024-09-12 17:00:00' ) AND ( "CreatedTime" <= '2024-09-13 17:00:00' ))  AND ( "Gateway" = '12333' )GROUP BY "Gateway") aaa
- 
+ 
+
+
+ ###信件清单查询(新)
+ select '' as "序号",
+aaa.信件状态,aaa."是否超期",aaa.来源,aaa.转接来源,aaa.当前节点,aaa.重办次数,aaa.甄别状态,aaa.受理编号,aaa.省编号,aaa.受理时间,aaa.标题,aaa.期满时间,aaa."一级部门",
+aaa.二级部门,aaa."接办部门",aaa."办结时间",aaa."受理类型",aaa."热点类型",aaa.热点全称,aaa."区域",aaa.区域全称,aaa."受理人",aaa."姓名",aaa."联系电话",aaa."来电电话",
+aaa."事发地址",aaa."具体对象",aaa."来电人主体",aaa."性别",ccc."SeatVisitResult" as "坐席满意度",bbb."OrgProcessingResults" as "满意度",aaa."推送分类",aaa."受理内容",
+aaa."承办意见",aaa."归档意见" from 
+(select 
+CASE "ordertemp"."Status"
+	WHEN 500 THEN '已回访'
+	WHEN 400 THEN '已发布'
+	WHEN 300 THEN '已归档'
+	WHEN 200 THEN '会签中'
+	WHEN 105 THEN '退回审批中'
+	WHEN 104 THEN '特提审批中'
+	WHEN 103 THEN '移交信件'
+	WHEN 102 THEN '退回信件'
+	WHEN 101 THEN '特提信件'
+	WHEN 100 THEN '办理中'
+	WHEN 9 THEN '退回省平台'
+	WHEN 2 THEN '特提待受理'
+	WHEN 1 THEN '退回待受理'
+	WHEN 0 THEN '待受理'
+	ELSE	'未知'
+END AS "信件状态",
+CASE 	WHEN "Status">=300 and "ExpiredTime">"FiledTime" THEN '正常'
+		  WHEN "Status">=300 AND "ExpiredTime"<"FiledTime" THEN '超期'
+			WHEN "Status"<300 AND "ExpiredTime"> now() AND now()> "NearlyExpiredTime" THEN '即将超期'
+			WHEN "Status"<300 AND "ExpiredTime">now() AND now()< "NearlyExpiredTime" THEN '正常'
+		  WHEN "Status"<300 AND "ExpiredTime"<now() THEN '超期'
+	ELSE '未知'
+END AS "是否超期",
+"SourceChannel" AS "来源" , 
+CASE 
+	WHEN "TransferPhone" is null or "TransferPhone"='undefined' THEN '12345'
+	ELSE
+		"TransferPhone"
+END AS "转接来源" ,
+"ActualHandleStepName" AS "当前节点" ,
+"ReTransactNum" AS "重办次数" , 
+(select CASE "screentemp"."Status"
+	WHEN 0 THEN '待办'
+	WHEN 1 THEN '审批中'
+	WHEN 2 THEN '审批完成'
+	WHEN 3 THEN '审批拒绝'
+	ELSE '-'
+END AS "OrderScreenStatus"
+ from order_screen screentemp WHERE "OrderId"="ordertemp"."Id" order by "CreationTime" DESC LIMIT 1) as "甄别状态", 
+"No" AS "受理编号" , 
+"ProvinceNo" AS "省编号" , 
+to_char("CreationTime", 'YYYY-MM-DD HH24:MI:SS') AS "受理时间" , 
+"Title" AS "标题" , 
+to_char("ExpiredTime", 'YYYY-MM-DD HH24:MI:SS') AS "期满时间" , 
+"OrgLevelOneName" AS "一级部门" , 
+
+CASE 
+	WHEN length("ActualHandleOrgCode")>=9 THEN
+		(select "Name" from system_organize orgtemp WHERE orgtemp."Id"="substring"("ordertemp"."ActualHandleOrgCode", 1, 9))
+	ELSE
+		'-'
+END AS "二级部门" , 
+"ActualHandleOrgName" AS "接办部门" , 
+to_char("FiledTime", 'YYYY-MM-DD HH24:MI:SS') AS "办结时间" , 
+"AcceptType" AS "受理类型" , 
+"HotspotName" AS "热点类型",
+"HotspotSpliceName" AS "热点全称",
+CASE 
+	WHEN "Town" is not NULL and "Town" <>'' THEN "Town"
+  WHEN "County" is not null and "County" <>'' THEN "County"
+	ELSE "City"
+END AS "区域",
+"Address"  As "区域全称",
+"AcceptorName" AS "受理人" ,
+ "FromName" AS "姓名" , 
+ "Contact" AS "联系电话" , 
+ "FromPhone" AS "来电电话" , 
+ "Street" AS "事发地址" ,
+ '' AS "具体对象",
+ CASE "IdentityType"
+	WHEN 1 THEN '市民'
+	WHEN 2 THEN '企业'
+	ELSE
+		'市民'
+END AS "来电人主体",
+CASE "FromGender"
+	WHEN 0 THEN '女士'
+	WHEN 1 THEN '先生'
+	ELSE '未知'
+END AS "性别" , 
+"PushType" AS "推送分类" , 
+"Content" AS "受理内容" , 
+"ActualOpinion" AS "承办意见" ,
+"FileOpinion" AS "归档意见" ,
+"Id" AS "SugarNav_Id" FROM "order" ordertemp  WHERE (( "CreationTime" >= '2024-08-29' ) AND ( "CreationTime" <= '2024-08-30' ))  AND ( "IsDeleted" = FALSE )ORDER BY "CreationTime" ASC) aaa
+left JOIN
+(select 
+ string_agg(visitdetailtemptwo."OrgProcessingResults"::JSON->>'Value','/') as "OrgProcessingResults",visittemptwo."OrderId" as "OrderId"
+from order_visit visittemptwo
+left join order_visit_detail visitdetailtemptwo on visittemptwo."Id" = visitdetailtemptwo."VisitId"
+where  visittemptwo."CreationTime">='2024-08-29' and visitdetailtemptwo."VisitTarget"=20 AND visittemptwo."VisitState"=30 group by visittemptwo."OrderId") as bbb
+on aaa."SugarNav_Id" = bbb."OrderId"
+left join
+(select string_agg(CASE visitdetailtemp."SeatEvaluate"
+	WHEN 0 THEN '默认满意'
+	WHEN 2 THEN '不满意'
+	WHEN 4 THEN '满意'
+	WHEN 5 THEN '非常满意'
+	WHEN 6 THEN '未接通'
+	WHEN 7 THEN '未做评价'
+	ELSE
+		'-'
+END, '/') AS "SeatVisitResult",visittemp."OrderId" AS "OrderId"
+ from order_visit visittemp
+left join order_visit_detail visitdetailtemp on visittemp."Id"= visitdetailtemp."VisitId"  
+where visittemp."CreationTime">='2024-08-29' and visitdetailtemp."VisitTarget"=10 AND visittemp."VisitState"=30 GROUP BY visittemp."OrderId") as "ccc"
+on aaa."SugarNav_Id" = ccc."OrderId"
+
+