Order.cs 31 KB

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