ソースを参照

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

xf 2 週間 前
コミット
5996c4644e

+ 5 - 2
src/Hotline.Api/Controllers/ExportWordController.cs

@@ -1,4 +1,5 @@
-using Hotline.Application.ExportWord;
+using Hotline.Api.Filter;
+using Hotline.Application.ExportWord;
 using Hotline.Caching.Interfaces;
 using Hotline.Configurations;
 using Hotline.Orders;
@@ -56,7 +57,8 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <returns></returns>
         [HttpPost("order_submission_form")]
-        public async Task<IActionResult> OrderSubmissionForm([FromBody] List<string> Ids)
+		[LogFilterAlpha("导出日志")]
+		public async Task<IActionResult> OrderSubmissionForm([FromBody] List<string> Ids)
         {
             var streams = new Dictionary<string, Stream>();
             var path = $"{Directory.GetCurrentDirectory()}/Template/AssignmentForm.doc";
@@ -136,6 +138,7 @@ namespace Hotline.Api.Controllers
         /// <param name="Ids"></param>
         /// <returns></returns>
 		[HttpPost("quality_certificate")]
+		[LogFilterAlpha("导出日志")]
 		public async Task<IActionResult> QualityCertificate([FromBody] List<string> Ids) {
 
 			var streams = new Dictionary<string, Stream>();

+ 71 - 48
src/Hotline.Api/Controllers/OrderController.cs

@@ -59,6 +59,7 @@ using Hotline.Share.Requests;
 using Hotline.Share.Tools;
 using Hotline.Snapshot;
 using Hotline.Snapshot.IRepository;
+using Hotline.Special;
 using Hotline.Tools;
 using Hotline.Users;
 using Hotline.Validators.FlowEngine;
@@ -368,8 +369,8 @@ public class OrderController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("publishorder/export")]
-	[LogFilterAlpha("导出日志")]
-	public async Task<FileStreamResult> ExportPublishOrders([FromBody] ExportExcelDto<QueryOrderPublishDto> dto)
+    [LogFilterAlpha("导出日志")]
+    public async Task<FileStreamResult> ExportPublishOrders([FromBody] ExportExcelDto<QueryOrderPublishDto> dto)
     {
         var query = _orderApplication.GetPublishOrderList(dto.QueryDto);
         List<Order> orders;
@@ -886,8 +887,8 @@ public class OrderController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("publishedorder/export")]
-	[LogFilterAlpha("导出日志")]
-	public async Task<FileStreamResult> ExportPublishedOrders([FromBody] ExportExcelDto<PublishedPagedRequest> dto)
+    [LogFilterAlpha("导出日志")]
+    public async Task<FileStreamResult> ExportPublishedOrders([FromBody] ExportExcelDto<PublishedPagedRequest> dto)
     {
         var query = _orderApplication.GetPublishedOrder(dto.QueryDto);
         List<OrderPublish> orders;
@@ -1174,8 +1175,8 @@ public class OrderController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("visit/export")]
-	[LogFilterAlpha("导出日志")]
-	public async Task<FileStreamResult> ExportOrderVisit([FromBody] ExportExcelDto<QueryOrderVisitDto> dto)
+    [LogFilterAlpha("导出日志")]
+    public async Task<FileStreamResult> ExportOrderVisit([FromBody] ExportExcelDto<QueryOrderVisitDto> dto)
     {
         var query = _orderApplication.QueryOrderVisitList(dto.QueryDto);
         List<OrderVisit> orders;
@@ -1463,6 +1464,10 @@ public class OrderController : BaseController
         dto.CallId = await _callApplication.PublishVisitRelevanceCallIdAsync(dto.Adapt<OrderRelevanceCallIdDto>(), HttpContext.RequestAborted);
         dto.CallId = await _callApplication.GetOrSetCallIdAsync(dto.CallId, HttpContext.RequestAborted);
         await _orderApplication.SaveOrderVisit(dto, HttpContext.RequestAborted);
+        if (dto.IsTransact.HasValue && dto.IsTransact.Value)
+        {
+            await Add(dto.OrderReTransact);
+        }
     }
 
     /// <summary>
@@ -1620,8 +1625,8 @@ public class OrderController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("visit/judge-query-export")]
-	[LogFilterAlpha("导出日志")]
-	public async Task<FileStreamResult> VisitJudgeQueryExport([FromBody] ExportExcelDto<VisitJudgeQueryReq> dto)
+    [LogFilterAlpha("导出日志")]
+    public async Task<FileStreamResult> VisitJudgeQueryExport([FromBody] ExportExcelDto<VisitJudgeQueryReq> dto)
     {
         var query = _orderRepository.VisitJudgeQuery(dto.QueryDto);
 
@@ -1751,8 +1756,8 @@ public class OrderController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("org-visitdetail-list-export")]
-	[LogFilterAlpha("导出日志")]
-	public async Task<FileStreamResult> OrgVisitDetailListExport([FromBody] ExportExcelDto<OrgVisitDetailListReq> dto)
+    [LogFilterAlpha("导出日志")]
+    public async Task<FileStreamResult> OrgVisitDetailListExport([FromBody] ExportExcelDto<OrgVisitDetailListReq> dto)
     {
         //特殊需求:管理员账号使用该查询条件查询的数据,与富顺的账号查询的数据一致;
         var isAdmin = _orderDomainService.IsCheckAdmin();
@@ -2599,8 +2604,8 @@ public class OrderController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("delay/export")]
-	[LogFilterAlpha("导出日志")]
-	public async Task<FileStreamResult> ExportDelayList([FromBody] ExportExcelDto<DelayListDto> dto)
+    [LogFilterAlpha("导出日志")]
+    public async Task<FileStreamResult> ExportDelayList([FromBody] ExportExcelDto<DelayListDto> dto)
     {
         var query = _orderApplication.DelayList(dto.QueryDto);
         List<OrderDelay> orders;
@@ -2648,8 +2653,8 @@ public class OrderController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("wait_delay/export")]
-	[LogFilterAlpha("导出日志")]
-	public async Task<FileStreamResult> ExportWaitDelayList([FromBody] ExportExcelDto<DelayListDto> dto)
+    [LogFilterAlpha("导出日志")]
+    public async Task<FileStreamResult> ExportWaitDelayList([FromBody] ExportExcelDto<DelayListDto> dto)
     {
         var query = _orderApplication.WaitDelayList(dto.QueryDto);
         List<OrderDelay> orders;
@@ -2808,8 +2813,8 @@ public class OrderController : BaseController
     /// </summary>
     /// <returns></returns>
     [HttpPost("mayscreen/_export")]
-	[LogFilterAlpha("导出日志")]
-	public async Task<FileStreamResult> ScreenListExport([FromBody] ExportExcelDto<MayScreenListDto> dto)
+    [LogFilterAlpha("导出日志")]
+    public async Task<FileStreamResult> ScreenListExport([FromBody] ExportExcelDto<MayScreenListDto> dto)
     {
         if (_appOptions.Value.IsYiBin) dto.QueryDto.ScreenType = EOrderScreenType.Org;
 
@@ -2867,8 +2872,8 @@ public class OrderController : BaseController
     /// </summary>
     /// <returns></returns>
     [HttpPost("screen_list/_export")]
-	[LogFilterAlpha("导出日志")]
-	public async Task<FileStreamResult> ScreenListExport([FromBody] ExportExcelDto<ScreenListDto> dto)
+    [LogFilterAlpha("导出日志")]
+    public async Task<FileStreamResult> ScreenListExport([FromBody] ExportExcelDto<ScreenListDto> dto)
     {
         var query = _orderApplication.OrderScreenList(dto.QueryDto);
         List<OrderScreen> data;
@@ -3425,8 +3430,8 @@ public class OrderController : BaseController
     }
 
     [HttpPost("supervise/travel/export")]
-	[LogFilterAlpha("导出日志")]
-	public async Task<FileStreamResult> ExportTravel([FromBody] ExportExcelDto<QueryOrderDto> dto)
+    [LogFilterAlpha("导出日志")]
+    public async Task<FileStreamResult> ExportTravel([FromBody] ExportExcelDto<QueryOrderDto> dto)
     {
         var query = _orderApplication.QueryTravel(dto.QueryDto);
         List<Order> orders;
@@ -4152,8 +4157,8 @@ public class OrderController : BaseController
     }
 
     [HttpPost("order/export")]
-	[LogFilterAlpha("导出日志")]
-	public async Task<FileStreamResult> ExportOrders([FromBody] ExportExcelDto<QueryOrderDto> dto)
+    [LogFilterAlpha("导出日志")]
+    public async Task<FileStreamResult> ExportOrders([FromBody] ExportExcelDto<QueryOrderDto> dto)
     {
         var query = _orderApplication.QueryOrders(dto.QueryDto);
         List<Order> orders;
@@ -4225,9 +4230,19 @@ public class OrderController : BaseController
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
             .Select(d => new OrderHistoryOutDto
             {
+                Id = d.Id,
+                Title = d.Title,
+                No = d.No,
+                CurrentStepName = d.CurrentStepName,
+                CreationTime = d.CreationTime,
+                ActualHandleOrgName = d.ActualHandleOrgName,
+                Status = d.Status,
                 IsScreen = d.OrderScreens.Any(x => x.Status == EScreenStatus.End),
-                TerminateStatus = d.OrderTerminates.OrderByDescending(p => p.CreationTime).Select(p => p.Status).FirstOrDefault()
-            }, true)
+                IsTerminate = d.OrderTerminates.Any(p => p.Status == ETerminateStatus.End),
+                //TerminateStatus = SqlFunc.Subqueryable<OrderTerminate>().Where(s => s.OrderId == d.Id).OrderByDesc(s => s.CreationTime).Select(s => s.Status)
+            })
+            .MergeTable()
+            .OrderByIF(_appOptions.Value.IsZiGong, d => d.IsTerminate, OrderByType.Desc)
             .OrderByDescending(d => d.CreationTime)
             .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
         return new PagedDto<OrderHistoryOutDto>(total, _mapper.Map<IReadOnlyList<OrderHistoryOutDto>>(items));
@@ -4651,16 +4666,14 @@ public class OrderController : BaseController
         //工单保存特殊身份验证
         var specialIdentityVerification =
             bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.SpecialIdentityVerification).SettingValue[0]);
+        var specialNumber = await _specialNumberRepository.GetAsync(p => p.PhoneNumber == dto.FromPhone, HttpContext.RequestAborted);
         if (specialIdentityVerification)
         {
-            var specialNumber = await _specialNumberRepository.GetAsync(p => p.PhoneNumber == dto.FromPhone, HttpContext.RequestAborted);
             if (specialNumber != null && specialNumber.PoliticalIdentityValue == "1")
             {
-                if (dto.OrderPushTypes == null || dto.OrderPushTypes.Count() == 0)
+                if (dto.OrderPushTypes == null || dto.OrderPushTypes.Count() == 0 || dto.OrderPushTypes.Exists(p => p.PushTypeCode == "9") == false)
                     throw UserFriendlyException.SameMessage("人大代表来电,请选择推送分类人大代表意见快办!");
 
-                if (dto.OrderPushTypes.Exists(p => p.PushTypeCode == "9") == false)
-                    throw UserFriendlyException.SameMessage("人大代表来电,请选择推送分类人大代表意见快办!");
             }
         }
 
@@ -4703,6 +4716,11 @@ public class OrderController : BaseController
         var order = _mapper.Map<Orders.Order>(dto);
         order.SignerId = _sessionContext.UserId;
         order.SignerName = _sessionContext.UserName;
+        if (specialNumber != null)
+        {
+            order.PoliticalIdentityValue = specialNumber.PoliticalIdentityValue;
+            order.PoliticalIdentityName = specialNumber.PoliticalIdentityName;
+        }
         order.InitId();
         if (dto.Files.Any())
             order.FileJson = await _fileRepository.AddFileAsync(dto.Files, order.Id, "", HttpContext.RequestAborted);
@@ -4911,15 +4929,12 @@ public class OrderController : BaseController
         //工单保存特殊身份验证
         var specialIdentityVerification =
             bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.SpecialIdentityVerification).SettingValue[0]);
+        var specialNumber = await _specialNumberRepository.GetAsync(p => p.PhoneNumber == dto.FromPhone, HttpContext.RequestAborted);
         if (specialIdentityVerification)
         {
-            var specialNumber = await _specialNumberRepository.GetAsync(p => p.PhoneNumber == dto.FromPhone, HttpContext.RequestAborted);
             if (specialNumber != null && specialNumber.PoliticalIdentityValue == "1")
             {
-                if (dto.OrderPushTypes == null || dto.OrderPushTypes.Count() == 0)
-                    throw UserFriendlyException.SameMessage("人大代表来电,请选择推送分类人大代表意见快办!");
-
-                if (dto.OrderPushTypes.Exists(p => p.PushTypeCode == "9") == false)
+                if (dto.OrderPushTypes == null || dto.OrderPushTypes.Count() == 0 || dto.OrderPushTypes.Exists(p => p.PushTypeCode == "9") == false)
                     throw UserFriendlyException.SameMessage("人大代表来电,请选择推送分类人大代表意见快办!");
             }
         }
@@ -4996,6 +5011,12 @@ public class OrderController : BaseController
         if (order.SourceChannelCode != AppDefaults.SourceChannel.DianHua)
             order.CallId = null;
 
+        if (specialNumber != null)
+        {
+            order.PoliticalIdentityValue = specialNumber.PoliticalIdentityValue;
+            order.PoliticalIdentityName = specialNumber.PoliticalIdentityName;
+        }
+
         if (dto.IsEdit && !string.IsNullOrEmpty(dto.CenterOpinion) && order.CenterToOrgOpinion != dto.CenterOpinion)
             order.CenterToOrgOpinion = dto.CenterOpinion;
         if (dto.IsEdit && !string.IsNullOrEmpty(dto.FileOpinion) && order.FileOpinion != dto.FileOpinion)
@@ -5829,7 +5850,8 @@ public class OrderController : BaseController
             CurrentStepOptions = definition?.Steps.Select(x => new Kv(x.Code, x.Name)),
             IdentityTypeOptions = EnumExts.GetDescriptions<EIdentityType>(),
             OrderTags = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.OrderTag),
-            FocusOnEvents = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.FocusOnEvent)
+            FocusOnEvents = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.FocusOnEvent),
+            PoliticalIdentity = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.PoliticalIdentity)
         };
         return rsp;
     }
@@ -6654,8 +6676,8 @@ public class OrderController : BaseController
     /// </summary>
     /// <returns></returns>
     [HttpPost("order_previous_list/_export")]
-	[LogFilterAlpha("导出日志")]
-	public async Task<FileStreamResult> OrgDataListDetailExport([FromBody] ExportExcelDto<SendBackListDto> dto)
+    [LogFilterAlpha("导出日志")]
+    public async Task<FileStreamResult> OrgDataListDetailExport([FromBody] ExportExcelDto<SendBackListDto> dto)
     {
         var query = _orderSendBackAuditApplication.AuditList(dto.QueryDto);
         List<OrderSendBackAudit> data;
@@ -8495,8 +8517,8 @@ public class OrderController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("order_word/list/export")]
-	[LogFilterAlpha("导出日志")]
-	public async Task<FileStreamResult> ListExport([FromBody] ExportExcelDto<OrderWordListDto> dto)
+    [LogFilterAlpha("导出日志")]
+    public async Task<FileStreamResult> ListExport([FromBody] ExportExcelDto<OrderWordListDto> dto)
     {
         var query = _orderRepository.QueryOrderWordList(dto.QueryDto);
         List<OrderWord> list;
@@ -8621,8 +8643,8 @@ public class OrderController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("order_observe/list/export")]
-	[LogFilterAlpha("导出日志")]
-	public async Task<FileStreamResult> ListExport([FromBody] ExportExcelDto<OrderObserveListDto> dto)
+    [LogFilterAlpha("导出日志")]
+    public async Task<FileStreamResult> ListExport([FromBody] ExportExcelDto<OrderObserveListDto> dto)
     {
         var query = _orderApplication.OrderObserveList(dto.QueryDto);
         List<OrderObserve> data;
@@ -8818,8 +8840,8 @@ public class OrderController : BaseController
     /// </summary>
     /// <returns></returns>
     [HttpPost("order/about_expire/_export")]
-	[LogFilterAlpha("导出日志")]
-	public async Task<FileStreamResult> AboutListExport([FromBody] ExportExcelDto<AboutToExpireListDto> dto)
+    [LogFilterAlpha("导出日志")]
+    public async Task<FileStreamResult> AboutListExport([FromBody] ExportExcelDto<AboutToExpireListDto> dto)
     {
         var query = _orderApplication.GetAboutToExpireAsync(dto.QueryDto);
         List<Hotline.Orders.Order> orders;
@@ -8872,8 +8894,8 @@ public class OrderController : BaseController
     /// </summary>
     /// <returns></returns>
     [HttpPost("order/expire/_export")]
-	[LogFilterAlpha("导出日志")]
-	public async Task<FileStreamResult> ExpireListExport([FromBody] ExportExcelDto<AboutToExpireListDto> dto)
+    [LogFilterAlpha("导出日志")]
+    public async Task<FileStreamResult> ExpireListExport([FromBody] ExportExcelDto<AboutToExpireListDto> dto)
     {
         var query = _orderApplication.GetToExpireAsync(dto.QueryDto);
         List<Hotline.Orders.Order> orders;
@@ -9256,8 +9278,8 @@ public class OrderController : BaseController
     /// </summary>
     /// <returns></returns>
     [HttpPost("secondary_handling/apply_export")]
-	[LogFilterAlpha("导出日志")]
-	public async Task<FileStreamResult> OrderSecondaryHandlingApplyExport([FromBody] ExportExcelDto<MayScreenListDto> dto)
+    [LogFilterAlpha("导出日志")]
+    public async Task<FileStreamResult> OrderSecondaryHandlingApplyExport([FromBody] ExportExcelDto<MayScreenListDto> dto)
     {
         var query = _orderSecondaryHandlingApplication.ApplyQuery(dto.QueryDto, HttpContext.RequestAborted);
         List<OrderVisitDetail> visitDetails;
@@ -9303,8 +9325,8 @@ public class OrderController : BaseController
     /// </summary>
     /// <returns></returns>
     [HttpPost("secondary_handling/_export")]
-	[LogFilterAlpha("导出日志")]
-	public async Task<FileStreamResult> OrderSecondaryHandlingExport([FromBody] ExportExcelDto<SecondaryHandlingListDto> dto)
+    [LogFilterAlpha("导出日志")]
+    public async Task<FileStreamResult> OrderSecondaryHandlingExport([FromBody] ExportExcelDto<SecondaryHandlingListDto> dto)
     {
         var query = _orderSecondaryHandlingApplication.Query(dto.QueryDto, HttpContext.RequestAborted);
         List<OrderSecondaryHandling> secondaryHandling;
@@ -9401,6 +9423,7 @@ public class OrderController : BaseController
     {
         var (total, items) = await _orderCopyRepository.Queryable()
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.No.Contains(dto.Keyword!))
+            .WhereIF(_appOptions.Value.IsLuZhou,x=>x.AuditSource == EOrderUpdateSource.Alter)
             .OrderByDescending(x => x.CreationTime)
             .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
         return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));

+ 12 - 0
src/Hotline.Api/config/appsettings.Test.json

@@ -0,0 +1,12 @@
+{
+  "ConnectionStrings": {
+    "Hotline": "PORT=5432;DATABASE=hotline_test;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;",
+    //"Hotline1": "PORT=5432;DATABASE=hotline_dev;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;"
+  },
+  "Cache": {
+    "Host": "110.188.24.182",
+    "Port": 50179,
+    "Password": "fengwo123!$!$",
+    "Database": 2 //hotline:3, dev:5, test:2, demo:4
+  }
+}

+ 51 - 50
src/Hotline.Api/config/appsettings.json

@@ -1,7 +1,48 @@
 {
   "AllowedHosts": "*",
+  "AppConfiguration": {
+    "AppScope": "ZiGong",
+    "YiBin": {
+      "AreaCode": "511500",
+      "CallCenterType": "TianRun", //XunShi、WeiErXin、TianRun、XingTang
+      //智能回访
+      "AiVisit": {
+        "Url": "http://118.122.73.80:19061",
+        "Appkey": "MTAwMDAx",
+        "ServiceVersion": "V1.0.0" //接口版本号
+      },
+      //智能质检
+      "AiQuality": {
+        "Url": "http://118.122.73.80:19072/" // 正式
+        //"Url": "http://118.122.73.80:19072/", // 测试
+      },
+      //企业服务
+      "Enterprise": {
+        "AddressUrl": "http://10.12.185.227:8834/",
+        "ClientId": "1462598736",
+        "ClientSecret": "6nZtVK4rKfnsncGymUHB",
+        "TenantId": "000000"
+      }
+    },
+    "ZiGong": {
+      //智能质检
+      "AiQuality": {
+        "Url": "http://175.10.86.234:10095" //  测试
+        //"Url": "http://10.56.131.13:10095/", // 正式
+      },
+      "AreaCode": "510300",
+      "CallCenterType": "XingTang"
+    },
+    "LuZhou": {
+      "AreaCode": "510500",
+      "CallCenterType": "XingTang"
+    },
+    "FileUpload": {
+      "Url": "http://110.188.24.28:50120/"
+    }
+  },
   "CallCenterConfiguration": {
-    "CallCenterType": "XingTang", //XunShi、WeiErXin、TianRun、XingTang
+    //"CallCenterType": "TianRun", //XunShi、WeiErXin、TianRun、XingTang
     "NewRock": {
       "Address": "http://192.168.100.100/xml",
       "Authorize": true,
@@ -25,24 +66,24 @@
     },
     "XingTang": {
       //"DbConnectionString": "server=123.56.10.71;Database=callcenter_db;Uid=root;Pwd=Lhw1981!(*!"
-      "DbConnectionString": "server=110.188.24.182;Database=callcenter_db;Uid=dev;Pwd=fengwo123!@#"
+      "DbConnectionString": "server=110.188.24.182;Database=callcenter_xingtang;Uid=dev;Pwd=fengwo11!!"
+      //"DbConnectionString": "PORT=50143;server=110.188.24.182;Database=callcenter_db;Uid=dev;Pwd=fengwo123!@#;"
     }
   },
   "ConnectionStrings": {
-    "Hotline": "PORT=5432;DATABASE=hotline_dev;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;"
-    //"Redis": "110.188.24.182:50179,password=fengwo22@@",
-    //"MongoDB": "mongodb://192.168.100.121:27017",
-    //"Wex": "server=222.212.82.225;Port=4509;Database=fs_kft;Uid=root;Pwd=Wex@12345;"
+    "Hotline": "PORT=5432;DATABASE=hotline;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;",
+    //"Hotline1": "PORT=5432;DATABASE=hotline_dev;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;"
   },
   "Cache": {
     "Host": "110.188.24.182",
     "Port": 50179,
     "Password": "fengwo123!$!$",
-    "Database": 5 
+    "Database": 3 //hotline:3, dev:5, test:2, demo:4
   },
   "Swagger": true,
+  "AccLog": false,
   "Cors": {
-    "Origins": [ "http://10.210.252.122:8888", "http://localhost:8888", "http://localhost:8113", "http://hotline.12345lm.cn", "http://110.188.24.28:50101", "http://110.188.24.28:50102", "http://110.188.24.28:50301", "http://bs.hotline.12345lm.cn" ]
+    "Origins": [ "http://localhost:8888", "http://admin.hotline.fw.com", "http://localhost:80", "http://localhost:8113" ]
   },
   "IdentityConfiguration": {
     "Password": {
@@ -59,7 +100,7 @@
     },
     "Lockout": {
       "MaxFailedAccessAttempts": 5,
-      "DefaultLockoutTimeSpan": "00:01:00"
+      "DefaultLockoutTimeSpan": "00:10:00"
     },
     "Account": {
       "DefaultPassword": "Fwkj@789"
@@ -86,49 +127,9 @@
       "VirtualHost": "fwt-master"
     }
   },
-  "SmsAccountInfo": {
-    "MessageServerUrl": "http://webservice.fway.com.cn:1432/FWebService.asmx/FWay_Service", //短信发送地址
-    "AccountUser": "CS12345", //短信系统账号
-    "AccountPwd": "9EE3899305A8FC97D6146CAC6B802E6F", //短信系统密码
-    "ReturnAccountUser": "fwkj", //短信回传账号
-    "ReturnAccountPwd": "fwkj12" //短信回传密码
-  },
   "FwClient": {
     "ClientId": "hotline",
     "ClientSecret": "08db29cc-0da0-4adf-850c-1b2689bd535d"
-  },
-  "ConfigCenter": {
-    "ServerAddresses": [ "http://110.188.24.28:8848" ],
-    "Namespace": "f5017bc5-af0a-4f85-8e38-6718accc8f36", //dev
-    "ServiceName": "hotline"
-  },
-  "Tr": {
-    //"Address": "http://internal.ttf-cti.com:8080",
-    //"Username": "yscs",
-    //"Password": "123456"
-    "Address": "http://222.213.23.229:29003/",
-    "Username": "root",
-    "Password": "12345678aa",
-    "Ip": "222.213.23.229"
-  },
-  //智能质检
-  "AiQuality": {
-    "Url": "http://118.121.201.140:19072/"
-  },
-  //智能回访
-  "AiVisit": {
-    "Url": "http://118.122.73.80:19061",
-    "Appkey": "MTAwMDAx",
-    "ServiceVersion": "V1.0.0" //接口版本号
-  },
-  //企业服务
-  "Enterprise": {
-    "AddressUrl": "http://172.15.28.11:8835",
-    "ClientId": "1476116956",
-    "ClientSecret": "6NVnvmsFSC8d3qwgBZmN",
-    "TenantId": "000000"
-  },
-  "SendSms": {
-    "Url": "http://110.188.24.28:50108/api/v1/PushMessage/addwaitmsg"
   }
+
 }

+ 5 - 0
src/Hotline.Application/OrderApp/OrderApplication.cs

@@ -1433,6 +1433,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 visit.OrderVisitDetails[i].ScreenByEndTime = await _orderDomainService.GetScreenByEndTime();
             }
         }
+        if (dto.IsTransact.HasValue && dto.IsTransact.Value)
+        {
+			visit.Order.VisitReTransactNum = visit.Order.VisitReTransactNum is null ? 1 : visit.Order.VisitReTransactNum + 1;
+		}
 
         await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
         await _orderVisitedDetailRepository.UpdateRangeAsync(visit.OrderVisitDetails, cancellationToken);
@@ -1724,6 +1728,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         //}
 
         query = query
+                .WhereIF(!string.IsNullOrEmpty(dto.PoliticalIdentityValue), d => d.PoliticalIdentityValue == dto.PoliticalIdentityValue)//政治身份查询
                 .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword!)) //标题
                 .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), d => d.ProvinceNo.Contains(dto.ProvinceNo)) //省本地编号
                 .WhereIF(!string.IsNullOrEmpty(dto.ReceiveProvinceNo), d => d.ReceiveProvinceNo.Contains(dto.ReceiveProvinceNo)) //省编号

+ 23 - 11
src/Hotline.Application/StatisticalReport/OrderReportApplication.cs

@@ -5,6 +5,7 @@ using Hotline.FlowEngine.WorkflowModules;
 using Hotline.FlowEngine.Workflows;
 using Hotline.Identity.Accounts;
 using Hotline.Orders;
+using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.SeedData;
 using Hotline.Settings;
 using Hotline.Settings.Hotspots;
@@ -3018,7 +3019,7 @@ namespace Hotline.Application.StatisticalReport
             var IsCenter = _sessionContext.OrgIsCenter;
             DataTable data = new DataTable();
 
-            data = await _hotspotTypeRepository.Queryable()
+            var  list = await _hotspotTypeRepository.Queryable()
             .LeftJoin<Order>((it, o) => o.HotspotId.StartsWith(it.Id))
             .Where((it, o) => o.CreationTime >= dto.QueryDto.StartTime && o.CreationTime <= dto.QueryDto.EndTime && o.Id != null)
             .WhereIF(dto.QueryDto.TypeId == 1, (it, o) => o.IdentityType == EIdentityType.Citizen)
@@ -3026,21 +3027,32 @@ namespace Hotline.Application.StatisticalReport
             .WhereIF(IsCenter == false, (it, o) => o.ActualHandleOrgCode.StartsWith(_sessionContext.RequiredOrgId))
             .GroupBy((it, o) => it.Id)
             .OrderBy((it, o) => new { it.Id }, OrderByType.Asc)
-            .Select((it, o) => new
-            {
+            .Select((it, o) => new HotspotStatisticsDto
+			{
                 HotspotName = it.HotSpotName,
                 HotSpotFullName = it.HotSpotFullName,
                 SumCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.HotspotId.StartsWith(it.Id), 1, 0))
             })
-            .ToDataTableAsync();
-
-            data.Columns["HotspotName"].SetOrdinal(0);
-            data.Columns["HotSpotFullName"].SetOrdinal(1);
-            data.Columns["SumCount"].ColumnName = "分类统计";
+            .ToListAsync();
+            data = list.ToDataTable("HotspotStatistics");
+
+			data.Columns["HotspotName"].SetOrdinal(0);
+            data.Columns["OneHotspotName"].SetOrdinal(1);
+			data.Columns["TwoHotspotName"].SetOrdinal(2);
+			data.Columns["ThreeHotspotName"].SetOrdinal(3);
+			data.Columns["FourHotspotName"].SetOrdinal(4);
+			data.Columns["FiveHotspotName"].SetOrdinal(5);
+			data.Columns["SumCount"].ColumnName = "分类统计";
             data.Columns["HotspotName"].ColumnName = "热点名称";
-            data.Columns["HotSpotFullName"].ColumnName = "热点分级";
-            //合计
-            DataRow sumRow = data.NewRow();
+			data.Columns["OneHotspotName"].ColumnName = "一级热点";
+			data.Columns["TwoHotspotName"].ColumnName = "二级热点";
+			data.Columns["ThreeHotspotName"].ColumnName = "三级热点";
+			data.Columns["FourHotspotName"].ColumnName = "四级热点";
+			data.Columns["FiveHotspotName"].ColumnName = "五级热点";
+			data.Columns.Remove("HotSpotFullName");
+			//data.Columns["HotSpotFullName"].ColumnName = "热点分级";
+			//合计
+			DataRow sumRow = data.NewRow();
             sumRow["热点名称"] = "合计";
             decimal totalAmount = 0;
             foreach (DataRow row in data.Rows)

+ 12 - 6
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -41,12 +41,9 @@ namespace Hotline.Share.Dtos.Order
 
         public string StatusText => Status.GetDescription();
 
-        /// <summary>
-		/// 终止状态
-		/// </summary>
-        public ETerminateStatus? TerminateStatus { get; set; }
+        public string? TerminateStatusText => IsTerminate == true ? "终止同意" : "";
 
-        public string? TerminateStatusText => TerminateStatus?.GetDescription();
+        public bool IsTerminate { get; set; }
     }
 
     public class OrderDto : UpdateOrderDto
@@ -1203,7 +1200,7 @@ namespace Hotline.Share.Dtos.Order
         /// 工单修改来源
         /// </summary>
         public EOrderUpdateSource? Source { get; set; }
-	}
+    }
 
     public class OrderUploadFiles
     {
@@ -1222,6 +1219,15 @@ namespace Hotline.Share.Dtos.Order
     public class AddOrderDto : Position
     {
         #region 来电信息
+        /// <summary>
+        /// 政治身份
+        /// </summary>
+        public string? PoliticalIdentityValue { get; set; }
+
+        /// <summary>
+        /// 政治身份
+        /// </summary>
+        public string? PoliticalIdentityName { get; set; }
 
         /// <summary>
         /// 来源渠道

+ 12 - 1
src/Hotline.Share/Dtos/Order/OrderVisitDto.cs

@@ -476,7 +476,18 @@ namespace Hotline.Share.Dtos.Order
         public bool? IsUpdate { get; set; }
 
         public List<VisitDetailDto> VisitDetails { get; set; }
-    }
+
+        /// <summary>
+        /// 是否重办
+        /// </summary>
+        public bool? IsTransact { get; set; }
+
+        /// <summary>
+        /// 重办对象
+        /// </summary>
+        public OrderReTransactDto? OrderReTransact { get; set; }
+
+	}
 
     public record VisitDetailDto
     {

+ 5 - 0
src/Hotline.Share/Dtos/Order/QueryOrderDto.cs

@@ -10,6 +10,11 @@ namespace Hotline.Share.Dtos.Order
 {
     public record QueryOrderDto : PagedKeywordRequest
     {
+        /// <summary>
+        /// 政治身份
+        /// </summary>
+        public string? PoliticalIdentityValue {  get; set; }
+
         /// <summary>
         /// 省本地编号(√)
         /// </summary>

+ 42 - 0
src/Hotline.Share/Dtos/StatisticalReport/OrderDelayStatisicalReturnDto.cs

@@ -44,4 +44,46 @@ namespace Hotline.Share.Dtos.StatisticalReport
         /// </summary>
         public string NodeCode { get; set; }
     }
+
+    public class HotspotStatisticsDto { 
+    
+        /// <summary>
+        /// 分类名称
+        /// </summary>
+        public string HotspotName { get; set; }
+
+        /// <summary>
+        /// 分类全称
+        /// </summary>
+        public string HotSpotFullName { get; set; }
+
+        /// <summary>
+        /// 一级热点
+        /// </summary>
+        public string OneHotspotName => !string.IsNullOrEmpty(HotSpotFullName) && HotSpotFullName.Split("-").Length >= 1 && HotSpotFullName.Split("-")[0] == HotspotName ? HotSpotFullName.Split("-")[0] : string.Empty;
+
+        /// <summary>
+        /// 二级热点
+        /// </summary>
+        public string TwoHotspotName => !string.IsNullOrEmpty(HotSpotFullName) && HotSpotFullName.Split("-").Length >= 2 && HotSpotFullName.Split("-")[1] == HotspotName ? HotSpotFullName.Split("-")[1] : string.Empty;
+
+        /// <summary>
+        /// 三级热点
+        /// </summary>
+        public string ThreeHotspotName => !string.IsNullOrEmpty(HotSpotFullName) && HotSpotFullName.Split("-").Length >= 3 && HotSpotFullName.Split("-")[2] == HotspotName ? HotSpotFullName.Split("-")[2] : string.Empty;
+
+        /// <summary>
+        /// 四级热点
+        /// </summary>
+        public string FourHotspotName => !string.IsNullOrEmpty(HotSpotFullName) && HotSpotFullName.Split("-").Length >= 4 && HotSpotFullName.Split("-")[3] == HotspotName ? HotSpotFullName.Split("-")[3] : string.Empty;
+
+        /// <summary>
+        /// 五级热点
+        /// </summary>
+        public string FiveHotspotName => !string.IsNullOrEmpty(HotSpotFullName) && HotSpotFullName.Split("-").Length >= 5 && HotSpotFullName.Split("-")[4] == HotspotName ? HotSpotFullName.Split("-")[4] : string.Empty;
+
+
+        public int SumCount { get; set; }
+
+	}
 }

+ 21 - 4
src/Hotline/Orders/Order.cs

@@ -45,6 +45,17 @@ namespace Hotline.Orders
         public string? FirstVisitResultCode { get; set; }
 
         #region 来电信息
+        /// <summary>
+        /// 政治身份
+        /// </summary>
+        [SugarColumn(ColumnDescription = "政治身份")]
+        public string? PoliticalIdentityValue { get; set; }
+
+        /// <summary>
+        /// 政治身份
+        /// </summary>
+        [SugarColumn(ColumnDescription = "政治身份")]
+        public string? PoliticalIdentityName { get; set; }
 
         /// <summary>
         /// 来源渠道(电话、网站、APP等)
@@ -951,10 +962,16 @@ namespace Hotline.Orders
         [SugarColumn(ColumnDescription = "重办次数")]
         public int? ReTransactNum { get; set; }
 
-        /// <summary>
-        /// 派单退回次数
-        /// </summary>
-        [SugarColumn(ColumnDescription = "派单退回次数")]
+		/// <summary>
+		/// 回访重办次数
+		/// </summary>
+		[SugarColumn(ColumnDescription = "重办次数")]
+		public int? VisitReTransactNum { get; set; }
+
+		/// <summary>
+		/// 派单退回次数
+		/// </summary>
+		[SugarColumn(ColumnDescription = "派单退回次数")]
         public int? SendBackNum { get; set; }
 
         /// <summary>

+ 17 - 0
src/Hotline/SeedData/SystemDicDataSeedData.cs

@@ -190,6 +190,19 @@ public class SystemDicDataSeedData : ISeedData<SystemDicData>
                 new () { Id = "08dd6060-7913-4b4b-83cf-475f692e93ae", DicDataValue = "default", DicDataName = "LocalHeadImageDefault", Sort = 2}
                 ];
         }
+        if (dicTypeCode == SysDicTypeConsts.InstaShotSpecialReason)
+        {
+            return [
+                new() { Id= "08dcd790-af29-4815-83b2-35df6e9e3400", DicDataValue = "工单内容不规范", DicDataName = "工单内容不规范", Sort = 1},
+                new () { Id = "08dcd790-b7e2-4905-895d-05b04c5a522b", DicDataValue = "回访不满意", DicDataName = "回访不满意", Sort = 2},
+                new () { Id = "08dcd790-f209-440c-8639-3c8312fe00ae", DicDataValue = "随手拍无办理结果", DicDataName = "随手拍无办理结果", Sort = 3},
+                new () { Id = "08dcd790-fbe5-4aea-8036-d227ff3bc09f", DicDataValue = "随手拍乱回复", DicDataName = "随手拍乱回复", Sort = 4},
+                new () { Id = "08dcd791-0af7-4d24-8b7f-4712fb719fb0", DicDataValue = "未上传已整改图片", DicDataName = "未上传已整改图片", Sort = 5},
+                new () { Id = "08dcd790-c6f2-406c-85cb-63a5417218de", DicDataValue = "部门要求退回重办", DicDataName = "部门要求退回重办", Sort = 6},
+                new () { Id = "08dcd790-d67d-4617-8ec3-7b5d2be5e7bb", DicDataValue = "随手拍没有整改完成时间", DicDataName = "随手拍没有整改完成时间", Sort = 7},
+                new () { Id = "08dcd790-e54b-4da2-8a1a-bba70490b08c", DicDataValue = "随手拍整改时间过长", DicDataName = "随手拍整改时间过长", Sort = 8}
+                ];
+        }
 
         throw new NotImplementedException();
     }
@@ -197,6 +210,10 @@ public class SystemDicDataSeedData : ISeedData<SystemDicData>
     public SystemDicType GetType(string dicTypeCode)
     {
         var dicType = new string[2];
+        if (dicTypeCode == SysDicTypeConsts.InstaShotSpecialReason)
+        {
+            dicType = ["81c202b7-5c50-45e5-bbde-fb1904957f85", "随手拍特提原因"];
+        }
         if (dicTypeCode == SysDicTypeConsts.HeaderImages)
         {
             dicType = ["08dd6ac1-024b-49cb-8ce0-723246d62767", "用户默认头像集合"];

+ 0 - 1
src/Hotline/Settings/SysDicTypeConsts.cs

@@ -211,7 +211,6 @@ public class SysDicTypeConsts
     /// </summary>
     public const string InstaShotSpecialReason = "InstaShotSpecialReason";
 
-
     /// <summary>
     /// 网民评价类型
     /// </summary>

+ 3 - 1
src/Hotline/Snapshot/Services/SnapshotPointsDomainService.cs

@@ -30,7 +30,9 @@ public class SnapshotPointsDomainService : ISnapshotPointsDomainService, IScopeD
             .Where((snapshot, industry) => snapshot.Id == orderId)
             .Select((snapshot, industry) => new { snapshot.Id, industry.ReportPoints , industry.ArgeePoints , industry.RefusePoints,  industry.Name,
                 snapshot.CreatorId})
-            .FirstAsync() ?? throw new UserFriendlyException($"{orderId} 工单不存在");
+            .FirstAsync();
+        if (order == null) return;
+        
         if (order.ReportPoints.HasValue == false)
             throw new UserFriendlyException($"{order.Name} 行业未配置积分");