using Hotline.Share.Dtos.File; using Hotline.Share.Dtos.FlowEngine.Workflow; using Hotline.Share.Dtos.Hotspots; using Hotline.Share.Enums.FlowEngine; using Hotline.Share.Enums.Order; using Hotline.Share.Enums.Settings; using Hotline.Share.Requests; using XF.Utility.EnumExtensions; namespace Hotline.Share.Dtos.Order { public class OrderDto : UpdateOrderDto { #region 工单属性 /// /// 工单状态 /// public EOrderStatus Status { get; set; } public string StatusText => Status.GetDescription(); /// /// 过期状态 /// public EExpiredStatus? ExpiredStatus => CalculateExpiredState(); /// /// 过期状态 /// public string ExpiredStatusText => ExpiredStatus?.GetDescription() ?? string.Empty; /// /// 处理方式(直办、交办) /// public EProcessType ProcessType { get; set; } ///// ///// 进展情况 ///// //public EProgress Progress { get; set; } /// /// 是否公开 /// public bool IsPublicity { get; set; } /// /// 工单编码(20220101000001) /// public string No { get; set; } /// /// 是否110来的工单 /// public bool IsNo110 { get; set; } public string? TagNames { get; set; } #region 流程信息 /// /// 工单开始时间(受理/接办时间=流程开启时间) /// public DateTime? StartTime { get; set; } /// /// 交办时间(中心交部门办理时间) /// public DateTime? CenterToOrgTime { get; set; } /// /// 归档时间(暂为流程结束时间,因流程结束自动归档) /// public DateTime? FiledTime { get; set; } /// /// 归档意见 /// public string? FileOpinion { get; set; } /// /// 办结时长(分钟) /// 办结时间-交办时间 /// public double HandleDuration { get; set; } /// /// 办结工作日时长(分钟) /// public double HandleDurationWorkday { get; set; } /// /// 全流程时长(分钟) /// 归档时间-创建时间 /// public double AllDuration { get; set; } /// /// 办结时长(秒) 归档时间-受理时间(工单创建时间) /// public double? CreationTimeHandleDuration { get; set; } /// /// 办结工作日时长(秒)归档时间-受理时间(工单创建时间) /// public double? CreationTimeHandleDurationWorkday { get; set; } /// /// 办结时长(秒) 归档时间-派单时间(中心到部门时间) /// public double? CenterToOrgHandleDuration { get; set; } /// /// 办结工作日时长(秒)归档时间-派单时间(中心到部门时间) /// public double? CenterToOrgHandleDurationWorkday { get; set; } #region 实际办理信息(节点,部门,意见) /// /// 实际办理节点code(会签状态此字段保存最外层会签发起节点code) /// public string? ActualHandleStepCode { get; set; } /// /// 实际办理节点名称(会签状态此字段保存最外层会签发起节点名称) /// public string? ActualHandleStepName { get; set; } /// /// 到达实际办理节点时间(stepBox创建时间) /// public DateTime? ActualHandleStepCreateTime { get; set; } /// /// 实际办理节点签收时间 /// public DateTime? ActualHandleStepAcceptTime { get; set; } /// /// 实际办理时间 /// public DateTime? ActualHandleTime { get; set; } /// /// 实际办理人id /// public string? ActualHandlerId { get; set; } /// /// 实际办理人名称 /// public string? ActualHandlerName { get; set; } /// /// 实际办理部门名称 /// public string? ActualHandleOrgName { get; set; } /// /// 实际办理部门编码 /// public string? ActualHandleOrgCode { get; set; } /// /// 实际办理部门行政区划编码 /// public string? ActualHandleOrgAreaCode { get; set; } /// /// 实际办理部门行政区划名称 /// public string? ActualHandleOrgAreaName { get; set; } /// /// 实际办理对象(会签停留在顶级发起节点) /// 办理时选择的办理对象,可能是部门也可能是用户 /// public string? ActualHandlerValue { get; set; } public string? ActualHandlerKey { get; set; } public EHandlerType? ActualHandlerType { get; set; } /// /// 实际办理意见(办理中...or 最终办理意见) /// public string ActualOpinion { get; set; } = "办理中..."; /// /// 真实办理人姓名(手动填写) /// public string? RealHandlerName { get; set; } /// /// 真实办理人电话(手动填写) /// public string? RealHandlerPhone { get; set; } /// /// 沟通方式(手动填写) /// public ERealCommunicationMode? RealCommunicationMode { get; set; } /// /// 沟通时间(手动填写) /// public DateTime? RealCommunicationTime { get; set; } /// /// 沟通地点(手动填写) /// public string? RealCommunicationAddress { get; set; } /// /// 已与市民沟通 /// public bool? RealIsContacted { get; set; } /// /// 已与市民现场沟通 /// public bool? RealContactLocale { get; set; } #endregion #region 当前办理节点信息(指派时赋值) public string? CurrentStepId { get; set; } /// /// 当前办理节点code(非会签:当前被指派节点,会签:会签发起节点) /// public string? CurrentStepCode { get; set; } /// /// 当前节点名称 /// public string? CurrentStepName { get; set; } /// /// 到达当前节点时间 /// public DateTime? CurrentStepCreateTime { get; set; } /// /// 当前办理节点签收时间 /// public DateTime? CurrentStepAcceptTime { get; set; } public string CurrentStepAcceptText => CurrentStepAcceptTime.HasValue ? "已签收" : "未签收"; /// /// 当前办理时间 /// public DateTime? CurrentHandleTime { get; set; } /// /// 当前办理人id /// public string? CurrentHandlerId { get; set; } /// /// 当前办理人名称 /// public string? CurrentHandlerName { get; set; } /// /// 当前办理部门名称 /// public string? CurrentHandleOrgName { get; set; } /// /// 当前办理部门编码 /// public string? CurrentHandleOrgId { get; set; } /// /// 当前办理部门等级 /// public int? CurrentHandleOrgLevel { get; set; } /// /// 当前办理部门行政区划编码 /// public string? CurrentHandleOrgAreaCode { get; set; } /// /// 当前办理部门行政区划名称 /// public string? CurrentHandleOrgAreaName { get; set; } #endregion #region 一级部门 /// /// 一级部门code /// public string? OrgLevelOneCode { get; set; } /// /// 一级部门名称 /// public string? OrgLevelOneName { get; set; } #endregion #region 受理人(开启流程的话务员) /// /// 受理人id /// public string? AcceptorId { get; set; } /// /// 受理人名称 /// public string? AcceptorName { get; set; } /// /// 受理人工号 /// public string? AcceptorStaffNo { get; set; } /// /// 受理人部门编码 /// public string? AcceptorOrgCode { get; set; } /// /// 受理人部门名称 /// public string? AcceptorOrgName { get; set; } #endregion /// /// 会签类型 /// public ECounterSignType? CounterSignType { get; set; } public string? CounterSignTypeText => CounterSignType?.GetDescription() ?? "未会签"; #region 签收 /// /// 签收人id /// public string? SignerId { get; set; } /// /// 签收人名称 /// public string? SignerName { get; set; } #endregion #endregion #endregion public DateTime CreationTime { get; set; } public string? ContactMask { get; set; } public string SmsSendedText => SmsSended ? "已发送" : "未发送"; /// /// 市民查询密码 /// public string? Password { get; set; } //public string? HotspotCodeLv1 { get; set; } public string WorkflowId { get; set; } public WorkflowDto Workflow { get; set; } /// /// 来电/信人性别 /// public string FromGenderText => FromGender.GetDescription(); /// /// 来电/信人身份 /// public string IdentityTypeText => IdentityType?.GetDescription(); ///// ///// 受理类型 ///// ////public string AcceptTypeText => AcceptType.GetDescription(); ///// ///// 紧急程度 ///// //public string EmergencyLevelText => EmergencyLevel.GetDescription(); /// /// 紧急程度 /// //public EEmergencyLevel EmergencyLevel { get; set; } public EEmergencyLevel EmergencyLevel => IsUrgent ? EEmergencyLevel.Emergency : EEmergencyLevel.UnEmergency; ///// ///// 超期时间描述(需求:超期3天、0.5天后超期) ///// //public string ExpiredText => CalculateExpiredText(); /// /// 是否可编辑 /// public bool CanEdit => !string.IsNullOrEmpty(SignerId) && (Status is EOrderStatus.WaitForAccept or EOrderStatus.BackToUnAccept or EOrderStatus.SpecialToUnAccept or EOrderStatus.HandOverToUnAccept); /// /// 是否可签收 /// public bool CanSign => string.IsNullOrEmpty(SignerId); /// /// 待结束会签编号 /// public string? CountersignId { get; set; } /// /// 是否可以延期 /// public bool IsCanDelay { get; set; } /// /// 是否可以取消延期 /// public bool IsCanCancelDelay { get; set; } /// /// 最后一次延期天数 /// public string? DelayString { get; set; } /// /// 是否可退回 /// public bool CanPrevious { get; set; } /// /// 是否可办理 /// public bool CanHandle { get; set; } /// /// 退回意见 /// public string? PreviousOpinion { get; set; } /// /// 是否可代办 /// public bool CanInsteadHandle { get; set; } /// /// 延期申请数量 /// public int DelayingCount => OrderDelays?.Count ?? 0; /// /// 是否紧急 /// public bool IsUrgent { get; set; } public string IsUrgentText => IsUrgent ? "紧急" : ""; /// /// 发布范围 /// public bool? PublishState { get; set; } /// /// 是否延期 /// public string? DelayText => DelayingCount > 0 ? "是" : "否"; /// /// 特提次数 /// public int SpecialNum { get; set; } private string CalculateExpiredText() { //todo 完整处理方案:1.创建待过期表,Id,过期时间,即将过期时间等字段。2.延迟消息通知处理过期,删除子表数据,处理order过期状态字段。3.此处即可采用expiredStatus进行判断 //todo 目前暂时采用过期时间计算 if (!ExpiredTime.HasValue) return string.Empty; var days = (DateTime.Now - ExpiredTime.Value).TotalDays; switch (days) { case > 0: return $"超期{days:N1}天"; case < 0: return $"{days:N1}天后超期"; default: return "超期不到1天"; } } /// /// 超期天数 /// public string DaysOverdue => DaysOverdueText(); private string DaysOverdueText() { DateTime? dateTime = DateTime.Now; if (Status >= EOrderStatus.Filed && ExpiredTime.HasValue && FiledTime.HasValue) { var days = (FiledTime.Value - ExpiredTime.Value).TotalDays; return $"超期{days:N1}天"; } if (ExpiredTime.HasValue) { var days = (dateTime.Value - ExpiredTime.Value).TotalDays; return $"超期{days:N1}天"; } return string.Empty; } /// /// 超期部门 /// public string DaysOverdueOrgName { get; set; } public EExpiredStatus? CalculateExpiredState() { DateTime? dateTime = DateTime.Now; if (Status >= EOrderStatus.Filed) { dateTime = FiledTime; } //ExpiredStatus if (ExpiredTime.HasValue) { if (NearlyExpiredTimeOne.HasValue && dateTime < NearlyExpiredTimeOne) { return EExpiredStatus.Normal; } else if (!NearlyExpiredTimeOne.HasValue && dateTime < NearlyExpiredTime) { return EExpiredStatus.Normal; } else if (NearlyExpiredTimeOne.HasValue && dateTime > NearlyExpiredTimeOne && dateTime < NearlyExpiredTime) { return EExpiredStatus.GoingToExpiredOne; } else if (dateTime > NearlyExpiredTime && dateTime < ExpiredTime) { return EExpiredStatus.GoingToExpired; } else { return EExpiredStatus.Expired; } } return null; } public OrderExtensionDto OrderExtension { get; set; } public HotspotDto? Hotspot { get; set; } /// /// 延期 /// public List OrderDelays { get; set; } /// /// 甄别 /// public List OrderScreens { get; set; } public List RepeatableEventDetails { get; set; } = new(); public List OrderVisits { get; set; } public List? FileJson { get; set; } /// /// 可直接访问的通话录音地址 /// public string? RecordingBaseAddress { get; set; } public string? RecordingAbsolutePath { get; set; } public int ReTransactNum { get; set; } /// /// 敏感标签 /// public List? Sensitive { get; set; } public string? SensitiveText => (Sensitive != null && Sensitive.Any()) ? string.Join(',', Sensitive) : ""; public string IsProvinceText => IsProvince ? "省工单" : "市工单"; /// /// 部门是否解决 /// public bool IsResolved { get; set; } public string IsResolvedText => IsResolved ? "已解决" : "未解决"; #region 副本工单 /// /// 修改人 /// public string AuditUserName { get; set; } public string AuditUserId { get; set; } /// /// 修改时间 /// public DateTime AuditTime { get; set; } #endregion public string OverDays => GetOverDays(); public string GetOverDays() { var overDays = "0天"; if (ExpiredTime.HasValue) { if (FiledTime.HasValue && ExpiredTime < FiledTime) { overDays = (FiledTime - ExpiredTime).Value.Days + "天"; } else if (ExpiredTime < DateTime.Now) { overDays = (DateTime.Now - ExpiredTime).Value.Days + "天"; } } return overDays; } /// /// 中心意见 /// public string CenterOpinion { get; set; } /// /// 退回原因 /// public string SendBackOpinion { get; set; } /// /// 退回原因 /// public string SendBackRefuseOpinion { get; set; } /// /// 审批时间 /// public DateTime? SendBackAuditTime { get; set; } /// /// 退回意见 /// public List OrderRemarks { get; set; } /// /// 交办人(派单员) /// public string? CenterToOrgHandlerId { get; set; } /// /// 交办人(派单员) /// public string? CenterToOrgHandlerName { get; set; } /// /// 是否退回审批中 /// public bool IsReturnUnderApproval { get; set; } /// /// 退回截至时间 /// public DateTime? SendBackAuditEndTime { get; set; } /// /// 省退回信息 /// public string ProvinceSendBackString { get; set; } /// /// 省撤单信息 /// public string ProvinceRevokeString { get; set; } } public class UpdateOrderDto : AddOrderDto { public string Id { get; set; } } public class AddOrderDto : Position { #region 来电信息 /// /// 来源渠道 /// public string? SourceChannel { get; set; } public string? SourceChannelCode { get; set; } /// /// 渠道为电话时,此字段存在 /// public string? CallId { get; set; } /// /// 来电归属地 /// public string? CallAddress { get; set; } /// /// 来电号码 /// public string? FromPhone { get; set; } /// /// 转接号码(转接来源) /// public string? TransferPhone { get; set; } /// /// 来电/信人姓名 /// public string? FromName { get; set; } /// /// 来电/信人性别 /// public EGender FromGender { get; set; } /// /// 来电/信人身份 /// public EIdentityType? IdentityType { get; set; } /// /// 证件类型 /// public string? LicenceTypeCode { get; set; } public string? LicenceType { get; set; } /// /// 证件号码 /// public string? LicenceNo { get; set; } /// /// 年龄段 /// public string? AgeRangeCode { get; set; } public string? AgeRange { get; set; } /// /// 联系电话 /// public string? Contact { get; set; } /// /// 是否接受短信,勾选校验手机号 /// public bool AcceptSms { get; set; } /// /// 是否已发送短信 /// public bool SmsSended { get; set; } /// /// 是否保密 /// public bool IsSecret { get; set; } /// /// 工作单位(当“来电/信人身份”为“企业”时必填,其他情况非必填) /// public string? Company { get; set; } #endregion #region 诉求信息 /// /// 受理类型 /// public string? AcceptType { get; set; } public string? AcceptTypeCode { get; set; } public string Title { get; set; } /// /// 工单标签(自贡) /// public string? OrderTag { get; set; } public string? OrderTagCode { get; set; } #region 热点 /// /// 热点 /// public string? HotspotId { get; set; } //public string? HotspotCode { get; set; } public string? HotspotName { get; set; } public string? HotspotSpliceName { get; set; } /// /// 外部数据(为前端提供级联功能) /// public string? HotspotExternal { get; set; } #endregion #region 事件分类 public string? EventCategoryId { get; set; } public string? EventCategoryName { get; set; } public string? EventCategorySpliceName { get; set; } public string? EventCategoryExternal { get; set; } #endregion /// /// 事发时间 /// public DateTime? IncidentTime { get; set; } /// /// 事件目的 /// public string? IncidentPurpose { get; set; } /// /// 重复工单Id /// public List? DuplicateIds { get; set; } /// /// 推送分类 -- 弃用 转为表存储 /// public string? PushTypeCode { get; set; } /// /// 推送分类 -- 弃用 转为表存储 /// public string? PushType { get; set; } /// /// 附件 /// public List Additions { get; set; } = new(); /// /// 诉求内容 /// public string Content { get; set; } #endregion /// /// 来源,区分省平台或110等其他平台同步过来的工单 /// public ESource Source { get; set; } = ESource.Hotline; /// /// 扩展信息 /// public OrderExtensionDto? OrderExtension { get; set; } /// /// 附件列表 /// public List Files { get; set; } = new(); /// /// 企业名称 /// public string? EnterpriseName { get; set; } /// /// 企业Code /// public string? EnterpriseCode { get; set; } /// /// 专班名称 /// public string? ZhuanBanMingCheng { get; set; } /// /// 专班Code /// public string? ZhuanBanCode { get; set; } #region 重复性事件 public List RepeatableEventDetails { get; set; } = new(); #endregion /// /// 是否为省工单 /// public bool IsProvince { get; set; } /// /// 省本地编号 /// public string? ProvinceNo { get; set; } /// /// 省交办编号 /// public string? ReceiveProvinceNo { get; set; } /// /// 省过期时间(省工单才有) /// public DateTime? ExpiredTimeProvince { get; set; } /// /// 外部工单唯一标识 /// public string? ExternalId { get; set; } #region 期满时间 /// /// 过期时间 /// public DateTime? ExpiredTime { get; set; } /// /// 即将超期时间 /// public DateTime? NearlyExpiredTime { get; set; } /// /// 即将超期第一级 /// public DateTime? NearlyExpiredTimeOne { get; set; } /// /// 办理时间限制(如:24小时、7个工作日) /// public string? TimeLimit { get; set; } public int? TimeLimitCount { get; set; } public ETimeType? TimeLimitUnit { get; set; } #endregion #region 市州工单互转 /// /// 是否转发 /// public bool? Transpond { get; set; } /// /// 转发市州Id /// public string? TranspondCityId { get; set; } /// /// 转发市州名称 /// public string? TranspondCityName { get; set; } /// /// 转发市州Value /// public string? TranspondCityValue { get; set; } #endregion /// /// 是否行政执法类 /// public bool? IsEnforcementOrder { get; set; } /// /// 形式主义工单 /// public bool IsFormalistWorkOrder { get; set; } /// /// 敏感类工单 /// public bool IsSensitiveWorkOrders { get; set; } /// /// 24小时办结 /// public bool Is24HoursComplete { get; set; } /// /// 重点关注事件,保存前端选择,用于返回前端数据 /// public string? FocusOnEvents { get; set; } /// /// 是否紧急 /// public bool IsUrgent { get; set; } /// /// 是否三方通话 /// public bool IsThreePartyConference { get; set; } /// /// 是否政民互动公开 /// public bool IsProvinceZmhd { get; set; } /// /// 初审人姓名 /// public string? AuditFirstName { get; set; } /// /// 初审时间 /// public DateTime? AuditFirstTime { get; set; } /// /// 政民互动公开ID /// public string? OrderProvinceZmhdId { get; set; } /// /// 工单推送分类 /// public List? OrderPushTypes { get; set; } } public record CanLinkCallRecordOrderDto : PagedKeywordRequest { } /// /// 修改工单受理附件 /// public class UpdateOrderFilesDto { public string Id { get; set; } public string OrderNo { get; set; } /// /// 附件 /// public List Files { get; set; } = new List(); } public record OrderCopyListDto : PagedKeywordRequest { public string OrderId { get; set; } } public class UnsignedOrderDto { public OrderDto Order { get; set; } public WorkflowStepDto WorkflowStep { get; set; } public decimal UnsignedTime { get; set; } } public class OrderRemarksDto { /// /// 备注信息 /// public string? Remark { get; set; } /// /// 备注人 /// public string? RemarkUser { get; set; } /// /// 备注时间 /// public DateTime RemarkTime { get; set; } } public class PublishNearlyExpiredTimeSmsDto { public string OrderId { get; set; } } public class OverTimeOrderDto { public string OrgId { get; set; } public int NearlyOrderCount { get; set; } public int ExpiredTimeOrderCount { get; set; } } }