xf 1 ano atrás
pai
commit
0fc53e379b

+ 1 - 1
src/Hotline.Api.Sdk/Hotline.Api.Sdk.csproj

@@ -5,7 +5,7 @@
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
     <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
-    <Version>1.0.4</Version>
+    <Version>1.0.5</Version>
     <Company>fw</Company>
     <Description>hotline.api.sdk</Description>
   </PropertyGroup>

+ 18 - 0
src/Hotline.Api.Sdk/Order/IHotlineClient.Order.cs

@@ -28,5 +28,23 @@ namespace Hotline.Api.Sdk
         /// </summary>
         public Task<ApiResponse> OrderSendBackResultAsync(OrderSendBackResultDto request, CancellationToken cancellationToken) =>
 	        ExecuteAsync("api/v1/Order/send_back/result", Method.Post, request, cancellationToken);
+
+        /// <summary>
+        /// 督办工单派发
+        /// </summary>
+        public Task<ApiResponse> ProvinceOrderSuperviseAsync(ProvinceOrderSuperviseDto request, CancellationToken cancellationToken) =>
+	        ExecuteAsync("api/v1/Order/supervise/province", Method.Post, request, cancellationToken);
+
+        /// <summary>
+        /// 催办工单派发
+        /// </summary>
+        public Task<ApiResponse> ProvinceOrderUrgeAsync(ProvinceOrderUrgeDto request, CancellationToken cancellationToken) =>
+	        ExecuteAsync("api/v1/Order/urge/province", Method.Post, request, cancellationToken);
+
+		/// <summary>
+		/// 省工单甄别结果
+		/// </summary>
+		public Task<ApiResponse> ScreenProvinceResultAsync(ProvinceScreenResult request, CancellationToken cancellationToken) =>
+	        ExecuteAsync("api/v1/Order/screen/province/result", Method.Post, request, cancellationToken);
 	}
 }

+ 3 - 1
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -279,7 +279,8 @@ namespace Hotline.Api.Controllers
 		public async Task<PagedDto<KnowledgeDto>> SearchNumList([FromQuery] KnowledgeCollectListDto dto)
 		{
 			var (total, items) = await _knowledgeRepository.Queryable()
-				.Where(x=>x.Status == EKnowledgeStatus.OnShelf)
+				.Where(x => x.Status == EKnowledgeStatus.OnShelf)
+				.Where(x => x.ExpiredTime >= DateTime.Now)
 				.OrderByDescending(x => x.SearchNum)
 				.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 			return new PagedDto<KnowledgeDto>(total, _mapper.Map<IReadOnlyList<KnowledgeDto>>(items));
@@ -456,6 +457,7 @@ namespace Hotline.Api.Controllers
 				.Includes(x => x.SystemOrganize)
 				.Includes(x => x.KnowledgeType)
 				.Includes(x => x.HotspotType)
+				.Includes(x=>x.SourceOrganize)
 				.Where(x => x.IsDeleted == false)
 				.WhereIF(!string.IsNullOrEmpty(pagedDto.Title), x => x.Title.Contains(pagedDto.Title!))
 				.WhereIF(pagedDto.Status.HasValue, x => x.Status == pagedDto.Status)

+ 135 - 24
src/Hotline.Api/Controllers/OrderController.cs

@@ -240,6 +240,7 @@ public class OrderController : BaseController
         orderVisit.OrderId = order.Id;
         orderVisit.VisitState = EVisitState.WaitForVisit;
         orderVisit.PublishTime = DateTime.Now;
+        orderVisit.IsCanHandle = true;
         string visitId = await _orderVisitRepository.AddAsync(orderVisit);
 
         //新增回访信息
@@ -634,13 +635,13 @@ public class OrderController : BaseController
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.OrderVisit.Order.No.Contains(dto.Keyword))
             .Where(x => x.OrderVisit.VisitState == EVisitState.Visited && (x.OrderVisit.VisitType == EVisitType.SmsVisit || x.OrderVisit.VisitType == EVisitType.ChipVoiceVisit))
             .Where(x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" || SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2")
+            .Where(x => x.OrderVisit.IsCanHandle)
             .Where(x => x.VisitTarget == EVisitTarget.Org)
             .OrderByDescending(x => x.OrderVisit.VisitTime)
             .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
         return new PagedDto<OrderCanVisitAgainDto>(total, _mapper.Map<IReadOnlyList<OrderCanVisitAgainDto>>(items));
     }
 
-
     /// <summary>
     /// 二次回访申请
     /// </summary>
@@ -662,6 +663,14 @@ public class OrderController : BaseController
         if (orderModel?.CounterSignType != null)
             throw UserFriendlyException.SameMessage("会签件不能申请二次回访");
 
+        var orderVisitModel = await _orderVisitRepository.GetAsync(x => x.Id == dto.OrderVisitId && x.IsCanHandle, HttpContext.RequestAborted);
+        if (orderVisitModel == null)
+            throw UserFriendlyException.SameMessage("当前状态不能进行二次回访");
+
+
+        orderVisitModel.IsCanHandle = false;
+        await _orderVisitRepository.UpdateAsync(orderVisitModel, HttpContext.RequestAborted);
+
         orderVisitApply.EmployeeId = _sessionContext.RequiredUserId;
         orderVisitApply.VisitApplyState = EVisitApplyState.Examining;
         await _orderVisitApplyRepository.AddAsync(orderVisitApply, HttpContext.RequestAborted);
@@ -715,6 +724,7 @@ public class OrderController : BaseController
                 visitModelNew.CreatorOrgLevel = 0;
                 visitModelNew.AreaId = string.Empty;
                 visitModelNew.VisitState = EVisitState.WaitForVisit;
+                visitModelNew.IsCanHandle = false;
 
                 var id = await _orderVisitRepository.AddAsync(visitModelNew, HttpContext.RequestAborted);
                 var visitModelDetail = await _orderVisitedDetailRepository.Queryable().Where(x => x.VisitId == visitModel.Id).ToListAsync(HttpContext.RequestAborted);
@@ -741,6 +751,12 @@ public class OrderController : BaseController
             visitApplyModel.ExaminOpinion = dto.ExaminOpinion;
             visitApplyModel.ExaminTime = DateTime.Now;
             await _orderVisitApplyRepository.UpdateAsync(visitApplyModel, HttpContext.RequestAborted);
+            var visitModel = await _orderVisitRepository.GetAsync(visitApplyModel.OrderVisitId, HttpContext.RequestAborted);
+            if (visitModel!=null)
+            {
+                visitModel.IsCanHandle = true;
+                await _orderVisitRepository.UpdateAsync(visitModel, HttpContext.RequestAborted);
+            }
         }
 
     }
@@ -919,7 +935,11 @@ public class OrderController : BaseController
     [HttpPost("delay")]
     public async Task ApplyDelay([FromBody] DelayStartFlowDto dto)
     {
-        var delaydto = _mapper.Map<ApplyDelayDto>(dto.Data);
+        var delaydto = dto.Data;
+
+        if (string.IsNullOrEmpty(dto.Workflow.Opinion))
+            throw UserFriendlyException.SameMessage("办理意见不能为空!");
+
         //验证工单是否可以申请
         var order = await _orderRepository.GetAsync(delaydto.OrderId, HttpContext.RequestAborted);
         if (order is null)
@@ -943,6 +963,9 @@ public class OrderController : BaseController
         model.ApplyOrgCode = _sessionContext.OrgId;
         model.BeforeDelay = order.ExpiredTime;
         model.DelayState = EDelayState.Examining;
+        model.DelayReason = dto.Workflow.Opinion;
+        model.FileIds = dto.Workflow.Additions;
+
         if (model.BeforeDelay != null)
         {
             model.AfterDelay = _timeLimitDomainService.CalcEndTime(model.BeforeDelay.Value, delaydto.DelayUnit, delaydto.DelayNum, false)?.EndTime;//todo
@@ -1269,16 +1292,60 @@ public class OrderController : BaseController
         return rspModel;
     }
 
-    #endregion
-
-    #region 工单督办
-
     /// <summary>
-    /// 工单督办列表
-    /// </summary>
-    /// <param name="dto"></param>
-    /// <returns></returns>
-    [Permission(EPermission.SuperviseOrderList)]
+    /// 省工单督办结果
+    /// </summary>
+    /// <returns></returns>
+    [HttpPost("screen/province/result")]
+    public async Task ScreenProvinceResultAsync([FromBody] ProvinceScreenResult dto)
+    {
+	    var orderScreen = await _orderScreenRepository.Queryable()
+		    .Includes(d => d.Order)
+		    .Includes(d => d.Workflow)
+		    .FirstAsync(d => d.Order.ProvinceNo == dto.CaseSerial && d.Status == EScreenStatus.Approval,
+			    HttpContext.RequestAborted);
+	    if (orderScreen is null)
+		    throw new UserFriendlyException("无效省工单编号");
+        var pass = "1".Equals(dto.AuditResult);
+		if (pass)
+	    {
+		    var nextDtos =
+			    await _workflowApplication.GetNextStepsAsync(orderScreen.WorkflowId, HttpContext.RequestAborted);
+		    var nextStep = nextDtos.Steps.FirstOrDefault(d => d.Key == "end");
+		    if (nextStep is null)
+			    throw new UserFriendlyException("未查询到结束节点");
+
+		    var nextDto = new NextWorkflowDto
+		    {
+			    WorkflowId = orderScreen.WorkflowId,
+			    NextStepCode = nextStep.Key,
+			    NextStepName = nextStep.Value,
+			    NextMainHandler = nextStep.Key,
+			    Opinion = dto.AuditOpinion
+			};
+		    await _workflowApplication.NextAsync(nextDto, HttpContext.RequestAborted);
+	    }
+	    else
+	    {
+		    var rejectDto = new RejectDto
+		    {
+			    WorkflowId = orderScreen.WorkflowId,
+			    Opinion = dto.AuditOpinion,
+		    };
+		    await _workflowApplication.RejectAsync(rejectDto, HttpContext.RequestAborted);
+	    }
+    }
+
+	#endregion
+
+	#region 工单督办
+
+	/// <summary>
+	/// 工单督办列表
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	[Permission(EPermission.SuperviseOrderList)]
     [HttpGet("supervise")]
     public async Task<PagedDto<SuperviseOrderDto>> SuperviseList([FromQuery] SuperviseListDto dto)
     {
@@ -1316,7 +1383,7 @@ public class OrderController : BaseController
             var model = _mapper.Map<OrderSupervise>(dto);
             model.OrgId = item.OrgId;
             model.OrgName = item.OrgName;
-            model.CreatorOrgName = _sessionContext.OrgName;
+            model.LaunchOrgName = _sessionContext.OrgName;
             model.CrUser = _sessionContext.UserName;
             model.State = 0;
             var id = await _orderSuperviseRepository.AddAsync(model, HttpContext.RequestAborted);
@@ -1428,16 +1495,40 @@ public class OrderController : BaseController
             .FirstAsync(x => x.Id == id);
     }
 
-    #endregion
-
-    #region 工单催办
-
     /// <summary>
-    /// 工单催办列表
+    /// 省上督办
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.UrgeOrderList)]
+    [HttpPost("supervise/province")]
+    public async Task ProvinceOrderSupervise([FromBody] ProvinceOrderSuperviseDto dto) 
+    {
+        var order = await _orderRepository.Queryable().Where(x => x.ProvinceNo == dto.CaseSerial).FirstAsync();
+        var org = await _organizeRepository.Queryable().Where(x => x.Name == dto.SuperviseRsvDept).FirstAsync();
+		var model = new OrderSupervise
+		{
+			OrderId = order.Id,
+			ReplyLimitTime = dto.SuperviseReturnDate,
+			OrgId = org.Id,
+			OrgName = org.Name,
+			LaunchOrgName = dto.SuperviseSendDept,
+			State = 0,
+			ApplyContent = dto.SuperviseContent,
+			CrUser = dto.SupervisePerson,
+			SuperviseSerial = dto.SuperviseSerial
+		};
+		await _orderSuperviseRepository.AddAsync(model, HttpContext.RequestAborted);
+	}
+	#endregion
+
+	#region 工单催办
+
+	/// <summary>
+	/// 工单催办列表
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	[Permission(EPermission.UrgeOrderList)]
     [HttpGet("urge")]
     public async Task<PagedDto<UrgeOrderDto>> UrgeList([FromQuery] UrgeListDto dto)
     {
@@ -1563,16 +1654,36 @@ public class OrderController : BaseController
             .FirstAsync(x => x.Id == id);
     }
 
-    #endregion
-
-    #region 工单办理
-
     /// <summary>
-    /// 工单列表
+    /// 省上催办
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.OrderQuery)]
+    [HttpPost("urge/province")]
+    public async Task ProvinceOrderUrge([FromBody] ProvinceOrderUrgeDto dto)
+    {
+	    var order = await _orderRepository.Queryable().Where(x => x.ProvinceNo == dto.CaseSerial).FirstAsync();
+        var model = new OrderUrge
+        {
+            OrderId = order.Id,
+            ApplyContent = dto.RemindReasion,
+            CrUser = dto.RemindName,
+            State = 0,
+            CreationTime = dto.RemindTime
+        };
+	    await _orderUrgeRepository.AddAsync(model, HttpContext.RequestAborted);
+    }
+
+	#endregion
+
+	#region 工单办理
+
+	/// <summary>
+	/// 工单列表
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	[Permission(EPermission.OrderQuery)]
     [HttpGet]
     public async Task<PagedDto<OrderDto>> Query([FromQuery] QueryOrderDto dto)
     {

+ 1 - 1
src/Hotline.Api/config/appsettings.Development.json

@@ -60,7 +60,7 @@
     }
   },
   "DatabaseConfiguration": {
-    "ApplyDbMigrations": false,
+    "ApplyDbMigrations": true,
     "ApplySeed": false
   },
   "MqConfiguration": {

+ 10 - 0
src/Hotline.Share/Dtos/Knowledge/KnowledgeDataDto.cs

@@ -122,6 +122,16 @@ namespace Hotline.Share.Dtos.Knowledge
         public string? Attribution { get; set; }
 
 		public WorkflowDto? Workflow { get; set; }
+
+		/// <summary>
+		/// 来源部门
+		/// </summary>
+		public string? SourceOrganizeId { get; set; }
+
+		/// <summary>
+		/// 来源部门
+		/// </summary>
+		public OrgDto SourceOrganize { get; set; }
 	}
 
     /// <summary>

+ 29 - 16
src/Hotline.Share/Dtos/Order/OrderScreenDto.cs

@@ -200,33 +200,46 @@ namespace Hotline.Share.Dtos.Order
 		/// </summary>
 		public string ClientGuid { get; set; }
 	}
+	public class ProvinceScreenResult
+	{
+		/// <summary>
+		/// 省工单编号
+		/// </summary>
+		public string CaseSerial { get; set; }
 
-	public class PublishSuperviseDto {
-		// <summary>
-		/// 工单对象
+		/// <summary>
+		/// 审核结果是否通过
 		/// </summary>
-		public OrderDto Order { get; set; }
+		public string AuditResult { get; set; }
 
+		/// <summary>
+		/// 审核意见
+		/// </summary>
+		public string AuditOpinion { get; set; }
 
-		public SuperviseOrderDto Supervise { get; set; }
+		/// <summary>
+		/// 审核时间
+		/// </summary>
+		public DateTime AuditTime { get; set; }
 
 		/// <summary>
-		/// 附件
+		/// 审核部门
 		/// </summary>
-		public string ClientGuid { get; set; }
-	}
-	public class PublishUrgeDto
-	{
-		// <summary>
-		/// 工单对象
+		public string AuditOuname { get; set; }
+
+		/// <summary>
+		/// 审核人
 		/// </summary>
-		public OrderDto Order { get; set; }
+		public string AuditPerson { get; set; }
 
-		public UrgeOrderDto Urge { get; set; }
+		/// <summary>
+		/// 行政区划代码
+		/// </summary>
+		public string AreaCode { get; set; }
 
 		/// <summary>
-		/// 附件
+		/// 材料标识
 		/// </summary>
-		public string ClientGuid { get; set; }
+		public string CliengGuid { get; set; }
 	}
 }

+ 78 - 0
src/Hotline.Share/Dtos/Order/OrderSuperviseDto.cs

@@ -81,4 +81,82 @@ namespace Hotline.Share.Dtos.Order
 	}
 
 
+	public class ProvinceOrderSuperviseDto
+	{
+		/// <summary>
+		/// 督办编号
+		/// </summary>
+		public string SuperviseSerial { get; set; }
+
+		/// <summary>
+		/// 省工单编号
+		/// </summary>
+		public string CaseSerial { get; set; }
+
+		/// <summary>
+		/// 督办标题
+		/// </summary>
+		public string SuperviseTitle { get; set; }
+
+		/// <summary>
+		/// 督办内容
+		/// </summary>
+		public string SuperviseContent { get; set; }
+
+		/// <summary>
+		/// 督办发起人
+		/// </summary>
+		public string SupervisePerson { get; set; }
+
+		/// <summary>
+		/// 督办发起时间
+		/// </summary>
+		public DateTime SuperviseTime { get; set; }
+
+		/// <summary>
+		/// 督办发起单位
+		/// </summary>
+		public string SuperviseSendDept { get; set; }
+
+		/// <summary>
+		/// 被督办单位
+		/// </summary>
+		public string SuperviseRsvDept { get; set; }
+
+		/// <summary>
+		/// 督办类型
+		/// </summary>
+		public string SuperviseType { get; set; }
+
+		/// <summary>
+		/// 督办反馈截止时间
+		/// </summary>
+		public DateTime SuperviseReturnDate { get; set; }
+
+		/// <summary>
+		/// 行政区划代码
+		/// </summary>
+		public string AreaCode { get; set; }
+
+		/// <summary>
+		/// 材料标识
+		/// </summary>
+		public string CliengGuid { get; set; }
+	}
+	public class PublishSuperviseDto
+	{
+		// <summary>
+		/// 工单对象
+		/// </summary>
+		public OrderDto Order { get; set; }
+
+
+		public SuperviseOrderDto Supervise { get; set; }
+
+		/// <summary>
+		/// 附件
+		/// </summary>
+		public string ClientGuid { get; set; }
+	}
+
 }

+ 47 - 0
src/Hotline.Share/Dtos/Order/OrderUrgeDto.cs

@@ -76,4 +76,51 @@ namespace Hotline.Share.Dtos.Order
 		public string OrgName { get; set; }
 
 	}
+
+	public class ProvinceOrderUrgeDto 
+	{
+		/// <summary>
+		/// 省工单编号
+		/// </summary>
+		public string CaseSerial { get; set; }
+
+		/// <summary>
+		/// 催单时间
+		/// </summary>
+		public DateTime RemindTime { get; set; }
+
+		/// <summary>
+		/// 操作人员
+		/// </summary>
+		public string RemindName { get; set; }
+
+		/// <summary>
+		/// 催单理由
+		/// </summary>
+		public string RemindReasion { get; set; }
+
+		/// <summary>
+		/// 行政区划代码
+		/// </summary>
+		public string AreaCode { get; set; }
+
+		/// <summary>
+		/// 材料标识
+		/// </summary>
+		public string CliengGuid { get; set; }
+	}
+	public class PublishUrgeDto
+	{
+		// <summary>
+		/// 工单对象
+		/// </summary>
+		public OrderDto Order { get; set; }
+
+		public UrgeOrderDto Urge { get; set; }
+
+		/// <summary>
+		/// 附件
+		/// </summary>
+		public string ClientGuid { get; set; }
+	}
 }

+ 1 - 1
src/Hotline.Share/Hotline.Share.csproj

@@ -7,7 +7,7 @@
     <GenerateDocumentationFile>True</GenerateDocumentationFile>
     <NoWarn>$(NoWarn);1591;8618;</NoWarn>
     <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
-    <Version>1.0.34</Version>
+    <Version>1.0.35</Version>
   </PropertyGroup>
 
   <ItemGroup>

+ 3 - 3
src/Hotline/Orders/OrderSupervise.cs

@@ -32,10 +32,10 @@ namespace Hotline.Orders {
 		public string OrgName { get; set; }
 
 		/// <summary>
-		/// 创建部门名称
+		/// 发起部门名称
 		/// </summary>
-		[SugarColumn(ColumnDescription = "创建部门名称")]
-		public string? CreatorOrgName { get; set; }
+		[SugarColumn(ColumnDescription = "发起部门名称")]
+		public string? LaunchOrgName { get; set; }
 
 		/// <summary>
 		/// 督办状态