Order.cs 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984
  1. using Hotline.CallCenter.Calls;
  2. using Hotline.File;
  3. using Hotline.FlowEngine.Workflows;
  4. using Hotline.Settings.Hotspots;
  5. using Hotline.Share.Dtos;
  6. using Hotline.Share.Dtos.File;
  7. using Hotline.Share.Enums.FlowEngine;
  8. using Hotline.Share.Enums.Order;
  9. using Hotline.Share.Enums.Settings;
  10. using Hotline.Users;
  11. using SqlSugar;
  12. using System.ComponentModel;
  13. using XF.Domain.Exceptions;
  14. using XF.Domain.Extensions;
  15. using XF.Domain.Repository;
  16. using XF.Utility.EnumExtensions;
  17. namespace Hotline.Orders
  18. {
  19. /// <summary>
  20. /// 工单
  21. /// </summary>
  22. [Description("工单")]
  23. [SugarIndex("unique_order_no", nameof(Order.No), OrderByType.Desc, true)]
  24. [SugarIndex("index_order_creationtime", nameof(Order.CreationTime), OrderByType.Asc)]
  25. public partial class Order : PositionWorkflowEntity
  26. {
  27. public Order()
  28. {
  29. //HotspotCodeLv1 ??= HotspotCode?[..2];
  30. }
  31. /// <summary>
  32. /// 第一次评价结果
  33. /// </summary>
  34. public string? FirstVisitResult { get; set; }
  35. public string? FirstVisitResultCode { get; set; }
  36. #region 来电信息
  37. /// <summary>
  38. /// 来源渠道(电话、网站、APP等)
  39. /// </summary>
  40. public string? SourceChannel { get; set; }
  41. public string? SourceChannelCode { get; set; }
  42. /// <summary>
  43. /// 渠道为电话时,此字段存在(Call.Id)
  44. /// </summary>
  45. public string? CallId { get; set; }
  46. /// <summary>
  47. /// 来电归属地
  48. /// </summary>
  49. public string? CallAddress { get; set; }
  50. /// <summary>
  51. /// 来电号码
  52. /// </summary>
  53. public string? FromPhone { get; set; }
  54. /// <summary>
  55. /// 转接号码(转接来源)
  56. /// </summary>
  57. public string? TransferPhone { get; set; }
  58. /// <summary>
  59. /// 来电/信人姓名
  60. /// </summary>
  61. public string? FromName { get; set; }
  62. /// <summary>
  63. /// 来电/信人性别
  64. /// </summary>
  65. public EGender FromGender { get; set; }
  66. /// <summary>
  67. /// 来电/信人身份
  68. /// </summary>
  69. public EIdentityType? IdentityType { get; set; }
  70. /// <summary>
  71. /// 证件类型
  72. /// </summary>
  73. public string? LicenceTypeCode { get; set; }
  74. public string? LicenceType { get; set; }
  75. /// <summary>
  76. /// 证件号码
  77. /// </summary>
  78. public string? LicenceNo { get; set; }
  79. /// <summary>
  80. /// 年龄段
  81. /// </summary>
  82. public string? AgeRangeCode { get; set; }
  83. public string? AgeRange { get; set; }
  84. /// <summary>
  85. /// 联系电话
  86. /// </summary>
  87. [SugarColumn(ColumnDescription = "联系电话", IsNullable = true)]
  88. public string? Contact { get; set; }
  89. [SugarColumn(ColumnDescription = "联系电话脱敏", IsNullable = true)]
  90. public string? ContactMask { get; set; }
  91. /// <summary>
  92. /// 是否接受短信,勾选校验手机号
  93. /// </summary>
  94. public bool AcceptSms { get; set; }
  95. /// <summary>
  96. /// 是否已发送短信
  97. /// </summary>
  98. public bool SmsSended { get; set; }
  99. /// <summary>
  100. /// 是否保密
  101. /// </summary>
  102. public bool IsSecret { get; set; }
  103. /// <summary>
  104. /// 工作单位(当“来电/信人身份”为“企业”时必填,其他情况非必填)
  105. /// </summary>
  106. [SugarColumn(ColumnDescription = "工作单位", IsNullable = true)]
  107. public string? Company { get; set; }
  108. #endregion
  109. #region 诉求信息
  110. /// <summary>
  111. /// 受理类型
  112. /// </summary>
  113. public string? AcceptType { get; set; }
  114. public string? AcceptTypeCode { get; set; }
  115. /// <summary>
  116. /// 紧急程度
  117. /// </summary>
  118. public EEmergencyLevel EmergencyLevel { get; set; } = EEmergencyLevel.Normal;
  119. public string Title { get; set; }
  120. #region 热点
  121. /// <summary>
  122. /// 热点
  123. /// </summary>
  124. public string? HotspotId { get; set; }
  125. //public string? HotspotCode { get; set; }
  126. //public string? HotspotCodeLv1 { get; set; }
  127. public string? HotspotName { get; set; }
  128. public string? HotspotSpliceName { get; set; }
  129. /// <summary>
  130. /// 外部数据(为前端提供级联功能)
  131. /// </summary>
  132. public string? HotspotExternal { get; set; }
  133. #endregion
  134. #region 事件分类
  135. public string? EventCategoryId { get; set; }
  136. public string? EventCategoryName { get; set; }
  137. public string? EventCategorySpliceName { get; set; }
  138. public string? EventCategoryExternal { get; set; }
  139. #endregion
  140. /// <summary>
  141. /// 事发时间
  142. /// </summary>
  143. public DateTime? IncidentTime { get; set; }
  144. /// <summary>
  145. /// 事件目的
  146. /// </summary>
  147. public string? IncidentPurpose { get; set; }
  148. /// <summary>
  149. /// 重复工单Id
  150. /// </summary>
  151. [SugarColumn(ColumnDescription = "重复工单Id", ColumnDataType = "json", IsJson = true)]
  152. public List<string>? DuplicateIds { get; set; }
  153. /// <summary>
  154. /// 推送分类
  155. /// </summary>
  156. public string? PushTypeCode { get; set; }
  157. public string? PushType { get; set; }
  158. /// <summary>
  159. /// 附件
  160. /// </summary>
  161. [SugarColumn(ColumnDataType = "json", IsJson = true)]
  162. public List<FileDto>? Additions { get; set; } = new();
  163. /// <summary>
  164. /// 诉求内容
  165. /// </summary>
  166. [SugarColumn(ColumnDataType = "varchar(2000)")]
  167. public string Content { get; set; }
  168. #endregion
  169. #region 工单属性
  170. /// <summary>
  171. /// 工单状态
  172. /// </summary>
  173. public EOrderStatus Status { get; set; }
  174. /// <summary>
  175. /// 过期状态 //todo 延迟消息更新此字段
  176. /// </summary>
  177. public EExpiredStatus ExpiredStatus { get; set; }
  178. /// <summary>
  179. /// 来源,区分省平台或110等其他平台同步过来的工单
  180. /// </summary>
  181. public ESource Source { get; set; }
  182. /// <summary>
  183. /// 处理方式(直办、交办)
  184. /// </summary>
  185. public EProcessType ProcessType { get; set; } = EProcessType.Zhiban;
  186. ///// <summary>
  187. ///// 进展情况
  188. ///// </summary>
  189. //[SugarColumn(DefaultValue = "0")]
  190. //public EProgress Progress { get; set; }
  191. /// <summary>
  192. /// 是否公开
  193. /// </summary>
  194. public bool IsPublicity { get; set; }
  195. /// <summary>
  196. /// 是否为省工单(省派发工单非政民互动直派的为省工单)
  197. /// </summary>
  198. public bool IsProvince { get; set; }
  199. /// <summary>
  200. /// 工单编码(20220101000001)
  201. /// </summary>
  202. public string? No { get; set; }
  203. /// <summary>
  204. /// 是否已撤销
  205. /// </summary>
  206. public bool IsCancel { get; set; }
  207. /// <summary>
  208. /// 市民查询密码
  209. /// </summary>
  210. public string? Password { get; set; }
  211. /// <summary>
  212. /// 企业名称
  213. /// </summary>
  214. public string? EnterpriseName { get; set; }
  215. /// <summary>
  216. /// 企业Code
  217. /// </summary>
  218. public string? EnterpriseCode { get; set; }
  219. /// <summary>
  220. /// 专班名称
  221. /// </summary>
  222. public string? ZhuanBanMingCheng { get; set; }
  223. /// <summary>
  224. /// 专班Code
  225. /// </summary>
  226. public string? ZhuanBanCode { get; set; }
  227. #endregion
  228. #region 流程信息
  229. /// <summary>
  230. /// 工单开始时间(受理/接办时间=流程开启时间)
  231. /// </summary>
  232. public DateTime? StartTime { get; set; }
  233. /// <summary>
  234. /// 超期时间(期满时间)
  235. /// </summary>
  236. public DateTime? ExpiredTime { get; set; }
  237. /// <summary>
  238. /// 即将超期时间
  239. /// </summary>
  240. public DateTime? NearlyExpiredTime { get; set; }
  241. /// <summary>
  242. /// 交办时间(中心交部门办理时间)
  243. /// </summary>
  244. public DateTime? CenterToOrgTime { get; set; }
  245. /// <summary>
  246. /// 交办意见
  247. /// </summary>
  248. public string? CenterToOrgOpinion { get; set; }
  249. /// <summary>
  250. /// 交班人
  251. /// </summary>
  252. public string? CenterToOrgHandlerId { get; set; }
  253. public string? CenterToOrgHandlerName { get; set; }
  254. /// <summary>
  255. /// 归档时间(暂为流程结束时间,因流程结束自动归档)
  256. /// </summary>
  257. public DateTime? FiledTime { get; set; }
  258. /// <summary>
  259. /// 办结时长(秒)
  260. /// 办结时间-交办时间
  261. /// </summary>
  262. public double? HandleDuration { get; set; }
  263. /// <summary>
  264. /// 办结工作日时长(秒)
  265. /// </summary>
  266. public double? HandleDurationWorkday { get; set; }
  267. /// <summary>
  268. /// 归档时长(秒)
  269. /// 归档时间-交办时间
  270. /// </summary>
  271. public double? FileDuration { get; set; }
  272. /// <summary>
  273. /// 归档工作时长(秒)
  274. /// </summary>
  275. public double? FileDurationWorkday { get; set; }
  276. /// <summary>
  277. /// 全流程时长(秒)
  278. /// 归档时间-创建时间
  279. /// </summary>
  280. public double? AllDuration { get; set; }
  281. public double? AllDurationWorkday { get; set; }
  282. /// <summary>
  283. /// 办理时间限制(如:24小时、7个工作日)
  284. /// </summary>
  285. public string? TimeLimit { get; set; }
  286. public int? TimeLimitCount { get; set; }
  287. public ETimeType? TimeLimitUnit { get; set; }
  288. #region 会签实际办理对象
  289. [SugarColumn(ColumnDataType = "json", IsJson = true)]
  290. public List<string>? CsActualHandleOrgIds { get; set; }
  291. [SugarColumn(ColumnDataType = "json", IsJson = true)]
  292. public List<string>? CsActualHandleUserIds { get; set; }
  293. #endregion
  294. #region 实际办理信息(节点,部门,意见)
  295. /// <summary>
  296. /// 实际办理节点code(会签状态此字段保存最外层会签发起节点code)
  297. /// </summary>
  298. public string? ActualHandleStepCode { get; set; }
  299. /// <summary>
  300. /// 实际办理节点名称(会签状态此字段保存最外层会签发起节点名称)
  301. /// </summary>
  302. public string? ActualHandleStepName { get; set; }
  303. /// <summary>
  304. /// 到达实际办理节点时间(stepBox创建时间)
  305. /// </summary>
  306. public DateTime? ActualHandleStepCreateTime { get; set; }
  307. /// <summary>
  308. /// 实际办理节点签收时间
  309. /// </summary>
  310. public DateTime? ActualHandleStepAcceptTime { get; set; }
  311. /// <summary>
  312. /// 实际办理时间
  313. /// </summary>
  314. public DateTime? ActualHandleTime { get; set; }
  315. /// <summary>
  316. /// 实际办理人id
  317. /// </summary>
  318. public string? ActualHandlerId { get; set; }
  319. /// <summary>
  320. /// 实际办理人名称
  321. /// </summary>
  322. public string? ActualHandlerName { get; set; }
  323. /// <summary>
  324. /// 实际办理部门名称
  325. /// </summary>
  326. public string? ActualHandleOrgName { get; set; }
  327. /// <summary>
  328. /// 实际办理部门编码
  329. /// </summary>
  330. public string? ActualHandleOrgCode { get; set; }
  331. /// <summary>
  332. /// 实际办理部门行政区划编码
  333. /// </summary>
  334. public string? ActualHandleOrgAreaCode { get; set; }
  335. /// <summary>
  336. /// 实际办理部门行政区划名称
  337. /// </summary>
  338. public string? ActualHandleOrgAreaName { get; set; }
  339. ///// <summary>
  340. ///// 实际办理对象(会签停留在顶级发起节点)
  341. ///// 办理时选择的办理对象,可能是部门也可能是用户
  342. ///// </summary>
  343. //public string? ActualHandlerValue { get; set; }
  344. //public string? ActualHandlerKey { get; set; }
  345. //public EHandlerType? ActualHandlerType { get; set; }
  346. /// <summary>
  347. /// 实际办理意见(办理中...or 最终办理意见)
  348. /// </summary>
  349. [SugarColumn(Length = 2000)]
  350. public string ActualOpinion { get; set; } = "办理中...";
  351. /// <summary>
  352. /// 真实办理人姓名(手动填写)
  353. /// </summary>
  354. public string? RealHandlerName { get; set; }
  355. /// <summary>
  356. /// 真实办理人电话(手动填写)
  357. /// </summary>
  358. public string? RealHandlerPhone { get; set; }
  359. /// <summary>
  360. /// 沟通方式(手动填写)
  361. /// </summary>
  362. public ERealCommunicationMode? RealCommunicationMode { get; set; }
  363. /// <summary>
  364. /// 沟通时间(手动填写)
  365. /// </summary>
  366. public DateTime? RealCommunicationTime { get; set; }
  367. /// <summary>
  368. /// 沟通地点(手动填写)
  369. /// </summary>
  370. public string? RealCommunicationAddress { get; set; }
  371. /// <summary>
  372. /// 已与市民沟通
  373. /// </summary>
  374. public bool? RealIsContacted { get; set; }
  375. /// <summary>
  376. /// 已与市民现场沟通
  377. /// </summary>
  378. public bool? RealContactLocale { get; set; }
  379. #endregion
  380. #region 当前办理节点信息
  381. ///// <summary>
  382. ///// 当前办理节点code(非会签:当前被指派节点,会签:会签发起节点)
  383. ///// </summary>
  384. //public string? CurrentStepCode { get; set; }
  385. ///// <summary>
  386. ///// 当前节点名称
  387. ///// </summary>
  388. //public string? CurrentStepName { get; set; }
  389. ///// <summary>
  390. ///// 到达当前节点时间
  391. ///// </summary>
  392. //public DateTime? CurrentStepCreateTime { get; set; }
  393. ///// <summary>
  394. ///// 当前办理节点签收时间
  395. ///// </summary>
  396. //public DateTime? CurrentHandleStepAcceptTime { get; set; }
  397. ///// <summary>
  398. ///// 当前办理时间
  399. ///// </summary>
  400. //public DateTime? CurrentHandleTime { get; set; }
  401. ///// <summary>
  402. ///// 当前办理人id
  403. ///// </summary>
  404. //public string? CurrentHandlerId { get; set; }
  405. ///// <summary>
  406. ///// 当前办理人名称
  407. ///// </summary>
  408. //public string? CurrentHandlerName { get; set; }
  409. ///// <summary>
  410. ///// 当前办理部门名称
  411. ///// </summary>
  412. //public string? CurrentHandleOrgName { get; set; }
  413. ///// <summary>
  414. ///// 当前办理部门编码
  415. ///// </summary>
  416. //public string? CurrentHandleOrgCode { get; set; }
  417. ///// <summary>
  418. ///// 当前办理部门行政区划编码
  419. ///// </summary>
  420. //public string? CurrentHandleOrgAreaCode { get; set; }
  421. ///// <summary>
  422. ///// 当前办理部门行政区划名称
  423. ///// </summary>
  424. //public string? CurrentHandleOrgAreaName { get; set; }
  425. #endregion
  426. #region 一级部门
  427. /// <summary>
  428. /// 一级部门code
  429. /// </summary>
  430. [SugarColumn(IsNullable = true)]
  431. public string? OrgLevelOneCode { get; set; }
  432. /// <summary>
  433. /// 一级部门名称
  434. /// </summary>
  435. [SugarColumn(IsNullable = true)]
  436. public string? OrgLevelOneName { get; set; }
  437. #endregion
  438. #region 受理人(开启流程的话务员)
  439. /// <summary>
  440. /// 受理人id
  441. /// </summary>
  442. public string? AcceptorId { get; set; }
  443. /// <summary>
  444. /// 受理人名称
  445. /// </summary>
  446. public string? AcceptorName { get; set; }
  447. /// <summary>
  448. /// 受理人工号
  449. /// </summary>
  450. public string? AcceptorStaffNo { get; set; }
  451. /// <summary>
  452. /// 受理人部门编码
  453. /// </summary>
  454. public string? AcceptorOrgCode { get; set; }
  455. /// <summary>
  456. /// 受理人部门名称
  457. /// </summary>
  458. public string? AcceptorOrgName { get; set; }
  459. #endregion
  460. #region 派单人
  461. /// <summary>
  462. /// 派单人id
  463. /// </summary>
  464. public string? SendOrderId { get; set; }
  465. /// <summary>
  466. /// 派单人名称
  467. /// </summary>
  468. public string? SendOrderName { get; set; }
  469. /// <summary>
  470. /// 派单次数
  471. /// </summary>
  472. public int? SendOrderNumber { get; set; } = 0;
  473. #endregion
  474. /// <summary>
  475. /// 会签类型
  476. /// </summary>
  477. public ECounterSignType? CounterSignType { get; set; }
  478. #region 签收
  479. /// <summary>
  480. /// 签收人id
  481. /// </summary>
  482. public string? SignerId { get; set; }
  483. /// <summary>
  484. /// 签收人名称
  485. /// </summary>
  486. public string? SignerName { get; set; }
  487. #endregion
  488. #region 归档冗余字段
  489. /// <summary>
  490. /// 归档人名称
  491. /// </summary>
  492. public string? FileUserName { get; set; }
  493. /// <summary>
  494. /// 归档人ID
  495. /// </summary>
  496. public string? FileUserId { get; set; }
  497. /// <summary>
  498. /// 归档人部门Id
  499. /// </summary>
  500. public string? FileUserOrgId { get; set; }
  501. /// <summary>
  502. /// 归档人部门名称
  503. /// </summary>
  504. public string? FileUserOrgName { get; set; }
  505. /// <summary>
  506. /// 归档人类型
  507. /// </summary>
  508. public EFileUserType? FileUserRole { get; set; }
  509. #endregion
  510. #endregion
  511. #region 省工单字段
  512. /// <summary>
  513. /// 省期满时间(省工单才有)
  514. /// </summary>
  515. public DateTime? ExpiredTimeProvince { get; set; }
  516. /// <summary>
  517. /// 同步省工单编号和省上传下来的工单都用这个字段
  518. /// </summary>
  519. public string? ProvinceNo { get; set; }
  520. /// <summary>
  521. /// 外部工单唯一标识
  522. /// </summary>
  523. public string? ExternalId { get; set; }
  524. /// <summary>
  525. /// 工单标签
  526. /// </summary>
  527. public string? TagNames { get; set; }
  528. #endregion
  529. #region 附件冗余
  530. [SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
  531. public List<FileJson>? FileJson { get; set; }
  532. #endregion
  533. #region 市州工单互转
  534. /// <summary>
  535. /// 是否转发
  536. /// </summary>
  537. public bool? Transpond { get; set; }
  538. /// <summary>
  539. /// 转发市州Id
  540. /// </summary>
  541. public string? TranspondCityId { get; set; }
  542. /// <summary>
  543. /// 转发市州名称
  544. /// </summary>
  545. public string? TranspondCityName { get; set; }
  546. /// <summary>
  547. /// 转发市州Value
  548. /// </summary>
  549. public string? TranspondCityValue { get; set; }
  550. #endregion
  551. #region 重办
  552. /// <summary>
  553. /// 重办次数
  554. /// </summary>
  555. public int? ReTransactNum { get; set; }
  556. #endregion
  557. /// <summary>
  558. /// 敏感标签
  559. /// </summary>
  560. [SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
  561. public List<string>? Sensitive { get; set; }
  562. /// <summary>
  563. /// 是否行政执法类
  564. /// </summary>
  565. public bool? IsEnforcementOrder { get; set; }
  566. /// <summary>
  567. /// 部门是否解决
  568. /// </summary>
  569. [SugarColumn(DefaultValue = "f")]
  570. public bool IsResolved { get; set; }
  571. }
  572. public partial class Order
  573. {
  574. /// <summary>
  575. /// 受理人
  576. /// </summary>
  577. [Navigate(NavigateType.OneToOne, nameof(AcceptorId))]
  578. public User Acceptor { get; set; }
  579. /// <summary>
  580. /// 热点
  581. /// </summary>
  582. [Navigate(NavigateType.OneToOne, nameof(HotspotId))]
  583. public Hotspot Hotspot { get; set; }
  584. /// <summary>
  585. /// 办理流程
  586. /// </summary>
  587. [Navigate(NavigateType.OneToOne, nameof(WorkflowId))]
  588. public Workflow Workflow { get; set; }
  589. /// <summary>
  590. /// 工单扩展信息
  591. /// </summary>
  592. [Navigate(NavigateType.OneToOne, nameof(Id))]
  593. public OrderExtension OrderExtension { get; set; }
  594. /// <summary>
  595. /// 已发布工单
  596. /// </summary>
  597. [Navigate(NavigateType.OneToOne, nameof(Id))]
  598. public OrderPublish OrderPublish { get; set; }
  599. /// <summary>
  600. /// 已回访工单
  601. /// </summary>
  602. [Navigate(NavigateType.OneToMany, nameof(OrderVisit.OrderId))]
  603. public List<OrderVisit> OrderVisits { get; set; }
  604. /// <summary>
  605. /// 甄别
  606. /// </summary>
  607. [Navigate(NavigateType.OneToMany, nameof(OrderScreen.OrderId))]
  608. public List<OrderScreen> OrderScreens { get; set; }
  609. /// <summary>
  610. ///
  611. /// </summary>
  612. [Navigate(NavigateType.OneToMany, nameof(OrderSpecial.OrderId))]
  613. public List<OrderSpecial> OrderSpecials { get; set; }
  614. /// <summary>
  615. /// 延期
  616. /// </summary>
  617. [Navigate(NavigateType.OneToMany, nameof(OrderDelay.OrderId))]
  618. public List<OrderDelay> OrderDelays { get; set; }
  619. /// <summary>
  620. /// 工单补充
  621. /// </summary>
  622. [Navigate(NavigateType.OneToMany, nameof(OrderComplement.OrderId))]
  623. public List<OrderComplement> OrderComplements { get; set; }
  624. /// <summary>
  625. /// 通话记录
  626. /// </summary>
  627. [Navigate(NavigateType.OneToOne, nameof(CallId), nameof(TrCallRecord.CallAccept))]
  628. public TrCallRecord CallRecord { get; set; }
  629. #region Method
  630. public void Cancel()
  631. {
  632. IsCancel = true;
  633. }
  634. public void Redo()
  635. {
  636. Status = EOrderStatus.Handling;
  637. ExpiredStatus = EExpiredStatus.Normal;
  638. }
  639. public void CheckIfFiled()
  640. {
  641. if (Status is EOrderStatus.Filed)
  642. throw UserFriendlyException.SameMessage("工单已归档");
  643. }
  644. public void Init()
  645. {
  646. if (!string.IsNullOrEmpty(Contact))
  647. ContactMask = Contact.MaskPhoneNumber();
  648. Status = EOrderStatus.WaitForAccept;
  649. ExpiredStatus = EExpiredStatus.Normal;
  650. }
  651. public void AutoAccept(string userId, string? userName, string? staffNo)
  652. {
  653. AcceptorId = userId;
  654. AcceptorName = userName;
  655. AcceptorStaffNo = staffNo;
  656. }
  657. /// <summary>
  658. /// 开始工单办理流程
  659. /// </summary>
  660. public void StartManageFlow() => Status = EOrderStatus.Handling;
  661. /// <summary>
  662. /// 更新工单办理中状态
  663. /// </summary>
  664. public void UpdateHandlingStatus(bool isInCountersign) =>
  665. Status = isInCountersign ? EOrderStatus.Countersigning : EOrderStatus.Handling;
  666. /// <summary>
  667. /// 归档
  668. /// </summary>
  669. public void File(DateTime filedTime, double handleDurationWorkday, double fileDurationWorkday, double allDurationWorkday)
  670. {
  671. if (Status is EOrderStatus.Filed) return;
  672. Status = EOrderStatus.Filed;
  673. FiledTime = filedTime;
  674. HandleDurationWorkday = handleDurationWorkday;
  675. FileDurationWorkday = fileDurationWorkday;
  676. AllDurationWorkday = allDurationWorkday;
  677. //计算实际办结时长
  678. SetHandleDuration();
  679. SetFileDuration();
  680. SetAllDuration();
  681. }
  682. /// <summary>
  683. /// 发布
  684. /// </summary>
  685. /// <param name="isPublicity"></param>
  686. public void Publish(bool isPublicity)
  687. {
  688. //Progress = EProgress.Published;
  689. Status = EOrderStatus.Published;
  690. IsPublicity = isPublicity;
  691. }
  692. /// <summary>
  693. /// 已回访
  694. /// </summary>
  695. public void Visited(string resultCode, string result)
  696. {
  697. if (string.IsNullOrEmpty(resultCode) || string.IsNullOrEmpty(result))
  698. throw new UserFriendlyException("无效参数");
  699. if (!string.IsNullOrEmpty(FirstVisitResultCode)) return;
  700. FirstVisitResultCode = resultCode;
  701. FirstVisitResult = result;
  702. //Progress = EProgress.Visited;
  703. Status = EOrderStatus.Visited;
  704. }
  705. public void CenterToOrg(string timelimit, int timelimitCount, ETimeType timilimitUnit,
  706. DateTime expiredTime, DateTime nearlyExpiredTime,
  707. string opinion, string handlerId, string handlerName)
  708. {
  709. ProcessType = EProcessType.Jiaoban;
  710. TimeLimit = timelimit;
  711. TimeLimitCount = timelimitCount;
  712. TimeLimitUnit = timilimitUnit;
  713. ExpiredTime = expiredTime;
  714. CenterToOrgTime = DateTime.Now;
  715. CenterToOrgOpinion = opinion;
  716. CenterToOrgHandlerId = handlerId;
  717. CenterToOrgHandlerName = handlerName;
  718. NearlyExpiredTime = nearlyExpiredTime;
  719. SendOrderNumber += 1;
  720. }
  721. public void OrgToCenter(string timelimit, int timelimitCount, ETimeType timilimitUnit, DateTime expiredTime, DateTime nearlyExpiredTime)
  722. {
  723. ProcessType = EProcessType.Zhiban;
  724. TimeLimit = timelimit;
  725. TimeLimitCount = timelimitCount;
  726. TimeLimitUnit = timilimitUnit;
  727. ExpiredTime = expiredTime;
  728. NearlyExpiredTime = nearlyExpiredTime;
  729. CenterToOrgTime = null;
  730. CenterToOrgOpinion = null;
  731. CenterToOrgHandlerId = null;
  732. CenterToOrgHandlerName = null;
  733. }
  734. public void CenterToCenter(string timelimit, int timelimitCount, ETimeType timilimitUnit, DateTime expiredTime, DateTime nearlyExpiredTime)
  735. {
  736. TimeLimit = timelimit;
  737. TimeLimitCount = timelimitCount;
  738. TimeLimitUnit = timilimitUnit;
  739. ExpiredTime = expiredTime;
  740. NearlyExpiredTime = nearlyExpiredTime;
  741. }
  742. public void SetHandleDuration()
  743. {
  744. if (!ActualHandleTime.HasValue) return;
  745. if (!CenterToOrgTime.HasValue) return;
  746. HandleDuration = Math.Round((ActualHandleTime - CenterToOrgTime).Value.TotalSeconds);
  747. }
  748. public void SetAllDuration()
  749. {
  750. if (!FiledTime.HasValue) return;
  751. if (!StartTime.HasValue) return;
  752. AllDuration = Math.Round((FiledTime - StartTime).Value.TotalSeconds);
  753. }
  754. public void SetFileDuration()
  755. {
  756. if (!FiledTime.HasValue) return;
  757. if (!CenterToOrgTime.HasValue) return;
  758. FileDuration = Math.Round((FiledTime - CenterToOrgTime).Value.TotalSeconds);
  759. }
  760. /// <summary>
  761. /// 是否已签收
  762. /// </summary>
  763. public bool IsSigned() => !string.IsNullOrEmpty(SignerId);
  764. /// <summary>
  765. /// 签收
  766. /// </summary>
  767. public void Sign(string userId, string userName)
  768. {
  769. SignerId = userId;
  770. SignerName = userName;
  771. }
  772. /// <summary>
  773. /// 返回未签收状态
  774. /// </summary>
  775. public void BackToUnsign()
  776. {
  777. SignerId = string.Empty;
  778. SignerName = string.Empty;
  779. }
  780. #endregion
  781. }
  782. }