Order.cs 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207
  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. /// <summary>
  113. /// 受理类型代码
  114. /// </summary>
  115. public string? AcceptTypeCode { get; set; }
  116. public string Title { get; set; }
  117. /// <summary>
  118. /// 工单标签(自贡)
  119. /// </summary>
  120. public string? OrderTag { get; set; }
  121. public string? OrderTagCode { get; set; }
  122. #region 热点
  123. /// <summary>
  124. /// 热点
  125. /// </summary>
  126. public string? HotspotId { get; set; }
  127. //public string? HotspotCode { get; set; }
  128. //public string? HotspotCodeLv1 { get; set; }
  129. public string? HotspotName { get; set; }
  130. /// <summary>
  131. /// 热点分类类目名称
  132. /// </summary>
  133. public string? HotspotSpliceName { get; set; }
  134. /// <summary>
  135. /// 外部数据(为前端提供级联功能)
  136. /// </summary>
  137. public string? HotspotExternal { get; set; }
  138. #endregion
  139. #region 事件分类
  140. public string? EventCategoryId { get; set; }
  141. public string? EventCategoryName { get; set; }
  142. public string? EventCategorySpliceName { get; set; }
  143. public string? EventCategoryExternal { get; set; }
  144. #endregion
  145. /// <summary>
  146. /// 事发时间
  147. /// </summary>
  148. public DateTime? IncidentTime { get; set; }
  149. /// <summary>
  150. /// 事件目的
  151. /// </summary>
  152. public string? IncidentPurpose { get; set; }
  153. /// <summary>
  154. /// 重复工单Id
  155. /// </summary>
  156. [SugarColumn(ColumnDescription = "重复工单Id", ColumnDataType = "json", IsJson = true)]
  157. public List<string>? DuplicateIds { get; set; }
  158. /// <summary>
  159. /// 推送分类 -- 弃用 转为表存储
  160. /// </summary>
  161. public string? PushTypeCode { get; set; }
  162. /// <summary>
  163. /// 推送分类 -- 冗余 多选存储 ,分割
  164. /// </summary>
  165. public string? PushType { get; set; }
  166. /// <summary>
  167. /// 附件
  168. /// </summary>
  169. [SugarColumn(ColumnDataType = "json", IsJson = true)]
  170. public List<FileDto>? Additions { get; set; } = new();
  171. /// <summary>
  172. /// 诉求内容
  173. /// </summary>
  174. [SugarColumn(ColumnDataType = "varchar(8000)")]
  175. public string Content { get; set; }
  176. #endregion
  177. #region 工单属性
  178. /// <summary>
  179. /// 工单状态
  180. /// </summary>
  181. public EOrderStatus Status { get; set; }
  182. /// <summary>
  183. /// 过期状态 //todo 延迟消息更新此字段
  184. /// </summary>
  185. public EExpiredStatus ExpiredStatus { get; set; }
  186. /// <summary>
  187. /// 来源,区分省平台或110等其他平台同步过来的工单
  188. /// </summary>
  189. public ESource Source { get; set; }
  190. /// <summary>
  191. /// 处理方式(直办、交办)
  192. /// </summary>
  193. public EProcessType ProcessType { get; set; } = EProcessType.Zhiban;
  194. ///// <summary>
  195. ///// 进展情况
  196. ///// </summary>
  197. //[SugarColumn(DefaultValue = "0")]
  198. //public EProgress Progress { get; set; }
  199. /// <summary>
  200. /// 是否公开
  201. /// </summary>
  202. public bool IsPublicity { get; set; }
  203. /// <summary>
  204. /// 是否为省工单(省派发工单非政民互动直派的为省工单)
  205. /// </summary>
  206. public bool IsProvince { get; set; }
  207. /// <summary>
  208. /// 工单编码(20220101000001)
  209. /// </summary>
  210. public string? No { get; set; }
  211. /// <summary>
  212. /// 是否已撤销
  213. /// </summary>
  214. public bool IsCancel { get; set; }
  215. /// <summary>
  216. /// 市民查询密码
  217. /// </summary>
  218. public string? Password { get; set; }
  219. /// <summary>
  220. /// 企业名称
  221. /// </summary>
  222. public string? EnterpriseName { get; set; }
  223. /// <summary>
  224. /// 企业Code
  225. /// </summary>
  226. public string? EnterpriseCode { get; set; }
  227. /// <summary>
  228. /// 专班名称
  229. /// </summary>
  230. public string? ZhuanBanMingCheng { get; set; }
  231. /// <summary>
  232. /// 专班Code
  233. /// </summary>
  234. public string? ZhuanBanCode { get; set; }
  235. #endregion
  236. #region 流程信息
  237. /// <summary>
  238. /// 工单开始时间(受理/接办时间=流程开启时间)
  239. /// </summary>
  240. public DateTime? StartTime { get; set; }
  241. /// <summary>
  242. /// 超期时间(期满时间)
  243. /// </summary>
  244. public DateTime? ExpiredTime { get; set; }
  245. /// <summary>
  246. /// 即将超期时间
  247. /// </summary>
  248. public DateTime? NearlyExpiredTime { get; set; }
  249. /// <summary>
  250. /// 即将超期时间第一级
  251. /// </summary>
  252. public DateTime? NearlyExpiredTimeOne { get; set; }
  253. /// <summary>
  254. /// 交办时间(中心交部门办理时间)
  255. /// </summary>
  256. public DateTime? CenterToOrgTime { get; set; }
  257. /// <summary>
  258. /// 交办意见
  259. /// </summary>
  260. [SugarColumn(Length = 8000)]
  261. public string? CenterToOrgOpinion { get; set; }
  262. /// <summary>
  263. /// 交办人
  264. /// </summary>
  265. public string? CenterToOrgHandlerId { get; set; }
  266. public string? CenterToOrgHandlerName { get; set; }
  267. /// <summary>
  268. /// 归档时间(暂为流程结束时间,因流程结束自动归档)
  269. /// </summary>
  270. public DateTime? FiledTime { get; set; }
  271. /// <summary>
  272. /// 办结时长(秒)
  273. /// 办结时间-交办时间
  274. /// </summary>
  275. public double? HandleDuration { get; set; }
  276. /// <summary>
  277. /// 办结工作日时长(秒)
  278. /// </summary>
  279. public double? HandleDurationWorkday { get; set; }
  280. /// <summary>
  281. /// 办结时长(秒)归档时间-受理时间(工单创建时间)
  282. /// </summary>
  283. public double? CreationTimeHandleDuration { get; set; }
  284. /// <summary>
  285. /// 办结工作日时长(秒)归档时间-受理时间(工单创建时间)
  286. /// </summary>
  287. public double? CreationTimeHandleDurationWorkday { get; set; }
  288. /// <summary>
  289. /// 办结时长(秒) 归档时间-派单时间(中心到部门时间)
  290. /// </summary>
  291. public double? CenterToOrgHandleDuration { get; set; }
  292. /// <summary>
  293. /// 办结工作日时长(秒)归档时间-派单时间(中心到部门时间)
  294. /// </summary>
  295. public double? CenterToOrgHandleDurationWorkday { get; set; }
  296. /// <summary>
  297. /// 归档时长(秒)
  298. /// 归档时间-交办时间
  299. /// </summary>
  300. public double? FileDuration { get; set; }
  301. /// <summary>
  302. /// 归档工作时长(秒)
  303. /// </summary>
  304. public double? FileDurationWorkday { get; set; }
  305. /// <summary>
  306. /// 全流程时长(秒)
  307. /// 归档时间-创建时间
  308. /// </summary>
  309. public double? AllDuration { get; set; }
  310. public double? AllDurationWorkday { get; set; }
  311. /// <summary>
  312. /// 办理时间限制(如:24小时、7个工作日)
  313. /// </summary>
  314. public string? TimeLimit { get; set; }
  315. public int? TimeLimitCount { get; set; }
  316. public ETimeType? TimeLimitUnit { get; set; }
  317. #region 会签实际办理对象
  318. [SugarColumn(ColumnDataType = "json", IsJson = true)]
  319. public List<string>? CsActualHandleOrgIds { get; set; }
  320. [SugarColumn(ColumnDataType = "json", IsJson = true)]
  321. public List<string>? CsActualHandleUserIds { get; set; }
  322. #endregion
  323. #region 实际办理信息(节点,部门,意见)
  324. public string? ActualHandleStepId { get; set; }
  325. /// <summary>
  326. /// 实际办理节点code(会签状态此字段保存最外层会签发起节点code)
  327. /// </summary>
  328. public string? ActualHandleStepCode { get; set; }
  329. /// <summary>
  330. /// 实际办理节点名称(会签状态此字段保存最外层会签发起节点名称)
  331. /// </summary>
  332. public string? ActualHandleStepName { get; set; }
  333. /// <summary>
  334. /// 到达实际办理节点时间(stepBox创建时间)
  335. /// </summary>
  336. public DateTime? ActualHandleStepCreateTime { get; set; }
  337. /// <summary>
  338. /// 实际办理节点签收时间
  339. /// </summary>
  340. public DateTime? ActualHandleStepAcceptTime { get; set; }
  341. /// <summary>
  342. /// 实际办理时间
  343. /// </summary>
  344. public DateTime? ActualHandleTime { get; set; }
  345. /// <summary>
  346. /// 实际办理人id
  347. /// </summary>
  348. public string? ActualHandlerId { get; set; }
  349. /// <summary>
  350. /// 实际办理人名称
  351. /// </summary>
  352. public string? ActualHandlerName { get; set; }
  353. /// <summary>
  354. /// 实际办理部门名称
  355. /// </summary>
  356. public string? ActualHandleOrgName { get; set; }
  357. /// <summary>
  358. /// 实际办理部门编码
  359. /// </summary>
  360. public string? ActualHandleOrgCode { get; set; }
  361. /// <summary>
  362. /// 实际办理部门行政区划编码
  363. /// </summary>
  364. public string? ActualHandleOrgAreaCode { get; set; }
  365. /// <summary>
  366. /// 实际办理部门行政区划名称
  367. /// </summary>
  368. public string? ActualHandleOrgAreaName { get; set; }
  369. ///// <summary>
  370. ///// 实际办理对象(会签停留在顶级发起节点)
  371. ///// 办理时选择的办理对象,可能是部门也可能是用户
  372. ///// </summary>
  373. //public string? ActualHandlerValue { get; set; }
  374. //public string? ActualHandlerKey { get; set; }
  375. //public EHandlerType? ActualHandlerType { get; set; }
  376. /// <summary>
  377. /// 实际办理意见(办理中...or 最终办理意见)
  378. /// </summary>
  379. [SugarColumn(Length = 8000)]
  380. public string ActualOpinion { get; set; } = "办理中...";
  381. /// <summary>
  382. /// 真实办理人姓名(手动填写)
  383. /// </summary>
  384. public string? RealHandlerName { get; set; }
  385. /// <summary>
  386. /// 真实办理人电话(手动填写)
  387. /// </summary>
  388. public string? RealHandlerPhone { get; set; }
  389. /// <summary>
  390. /// 沟通方式(手动填写)
  391. /// </summary>
  392. public ERealCommunicationMode? RealCommunicationMode { get; set; }
  393. /// <summary>
  394. /// 沟通时间(手动填写)
  395. /// </summary>
  396. public DateTime? RealCommunicationTime { get; set; }
  397. /// <summary>
  398. /// 沟通地点(手动填写)
  399. /// </summary>
  400. public string? RealCommunicationAddress { get; set; }
  401. /// <summary>
  402. /// 已与市民沟通
  403. /// </summary>
  404. public bool? RealIsContacted { get; set; }
  405. /// <summary>
  406. /// 已与市民现场沟通
  407. /// </summary>
  408. public bool? RealContactLocale { get; set; }
  409. #endregion
  410. #region 当前办理节点信息(指派时赋值)
  411. public string? CurrentStepId { get; set; }
  412. /// <summary>
  413. /// 当前办理节点code(非会签:当前被指派节点,会签:会签发起节点)
  414. /// </summary>
  415. public string? CurrentStepCode { get; set; }
  416. /// <summary>
  417. /// 当前节点名称
  418. /// </summary>
  419. public string? CurrentStepName { get; set; }
  420. /// <summary>
  421. /// 到达当前节点时间
  422. /// </summary>
  423. public DateTime? CurrentStepCreateTime { get; set; }
  424. /// <summary>
  425. /// 当前办理节点签收时间
  426. /// </summary>
  427. public DateTime? CurrentStepAcceptTime { get; set; }
  428. /// <summary>
  429. /// 当前办理时间
  430. /// </summary>
  431. public DateTime? CurrentHandleTime { get; set; }
  432. /// <summary>
  433. /// 当前办理人id
  434. /// </summary>
  435. public string? CurrentHandlerId { get; set; }
  436. /// <summary>
  437. /// 当前办理人名称
  438. /// </summary>
  439. public string? CurrentHandlerName { get; set; }
  440. /// <summary>
  441. /// 当前办理部门名称
  442. /// </summary>
  443. public string? CurrentHandleOrgName { get; set; }
  444. /// <summary>
  445. /// 当前办理部门编码
  446. /// </summary>
  447. public string? CurrentHandleOrgId { get; set; }
  448. /// <summary>
  449. /// 当前办理部门等级
  450. /// </summary>
  451. public int? CurrentHandleOrgLevel { get; set; }
  452. /// <summary>
  453. /// 当前办理部门行政区划编码
  454. /// </summary>
  455. public string? CurrentHandleOrgAreaCode { get; set; }
  456. /// <summary>
  457. /// 当前办理部门行政区划名称
  458. /// </summary>
  459. public string? CurrentHandleOrgAreaName { get; set; }
  460. #endregion
  461. #region 一级部门
  462. /// <summary>
  463. /// 一级部门code
  464. /// </summary>
  465. [SugarColumn(IsNullable = true)]
  466. public string? OrgLevelOneCode { get; set; }
  467. /// <summary>
  468. /// 一级部门名称
  469. /// </summary>
  470. [SugarColumn(IsNullable = true)]
  471. public string? OrgLevelOneName { get; set; }
  472. #endregion
  473. #region 二级部门
  474. /// <summary>
  475. /// 二级部门code
  476. /// </summary>
  477. [SugarColumn(IsNullable = true)]
  478. public string? OrgLevelTwoCode { get; set; }
  479. /// <summary>
  480. /// 二级部门名称
  481. /// </summary>
  482. [SugarColumn(IsNullable = true)]
  483. public string? OrgLevelTwoName { get; set; }
  484. #endregion
  485. #region 受理人(开启流程的话务员)
  486. /// <summary>
  487. /// 受理人id
  488. /// </summary>
  489. public string? AcceptorId { get; set; }
  490. /// <summary>
  491. /// 受理人名称
  492. /// </summary>
  493. public string? AcceptorName { get; set; }
  494. /// <summary>
  495. /// 受理人工号
  496. /// </summary>
  497. public string? AcceptorStaffNo { get; set; }
  498. /// <summary>
  499. /// 受理人部门编码
  500. /// </summary>
  501. public string? AcceptorOrgCode { get; set; }
  502. /// <summary>
  503. /// 受理人部门名称
  504. /// </summary>
  505. public string? AcceptorOrgName { get; set; }
  506. #endregion
  507. #region 派单人
  508. /// <summary>
  509. /// 派单次数
  510. /// </summary>
  511. public int? SendOrderNumber { get; set; } = 0;
  512. #endregion
  513. /// <summary>
  514. /// 会签类型
  515. /// </summary>
  516. public ECounterSignType? CounterSignType { get; set; }
  517. #region 签收
  518. /// <summary>
  519. /// 签收人id
  520. /// </summary>
  521. public string? SignerId { get; set; }
  522. /// <summary>
  523. /// 签收人名称
  524. /// </summary>
  525. public string? SignerName { get; set; }
  526. #endregion
  527. #region 归档冗余字段
  528. /// <summary>
  529. /// 归档人名称
  530. /// </summary>
  531. public string? FileUserName { get; set; }
  532. /// <summary>
  533. /// 归档人ID
  534. /// </summary>
  535. public string? FileUserId { get; set; }
  536. /// <summary>
  537. /// 归档人部门Id
  538. /// </summary>
  539. public string? FileUserOrgId { get; set; }
  540. /// <summary>
  541. /// 归档人部门名称
  542. /// </summary>
  543. public string? FileUserOrgName { get; set; }
  544. /// <summary>
  545. /// 归档人部门是否属于中心
  546. /// </summary>
  547. public bool? FileOrgIsCenter { get; set; }
  548. /// <summary>
  549. /// 归档人类型
  550. /// </summary>
  551. public EFileUserType? FileUserRole { get; set; }
  552. /// <summary>
  553. /// 归档意见
  554. /// </summary>
  555. [SugarColumn(ColumnDataType = "varchar(8000)")]
  556. public string? FileOpinion { get; set; }
  557. #endregion
  558. #endregion
  559. #region 省工单字段
  560. /// <summary>
  561. /// 省期满时间(省工单才有)
  562. /// </summary>
  563. public DateTime? ExpiredTimeProvince { get; set; }
  564. /// <summary>
  565. /// 同步省工单编号和省上传下来的工单都用这个字段
  566. /// </summary>
  567. public string? ProvinceNo { get; set; }
  568. /// <summary>
  569. /// 外部工单唯一标识
  570. /// </summary>
  571. public string? ExternalId { get; set; }
  572. /// <summary>
  573. /// 工单标签
  574. /// </summary>
  575. public string? TagNames { get; set; }
  576. #endregion
  577. #region 附件冗余
  578. [SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
  579. public List<FileJson>? FileJson { get; set; }
  580. #endregion
  581. #region 市州工单互转
  582. /// <summary>
  583. /// 是否转发
  584. /// </summary>
  585. public bool? Transpond { get; set; }
  586. /// <summary>
  587. /// 转发市州Id
  588. /// </summary>
  589. public string? TranspondCityId { get; set; }
  590. /// <summary>
  591. /// 转发市州名称
  592. /// </summary>
  593. public string? TranspondCityName { get; set; }
  594. /// <summary>
  595. /// 转发市州Value
  596. /// </summary>
  597. public string? TranspondCityValue { get; set; }
  598. #endregion
  599. #region 重办
  600. /// <summary>
  601. /// 重办次数
  602. /// </summary>
  603. public int? ReTransactNum { get; set; }
  604. /// <summary>
  605. /// 派单退回次数
  606. /// </summary>
  607. public int? SendBackNum { get; set; }
  608. #endregion
  609. /// <summary>
  610. /// 敏感标签
  611. /// </summary>
  612. [SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
  613. public List<string>? Sensitive { get; set; }
  614. /// <summary>
  615. /// 是否行政执法类
  616. /// </summary>
  617. public bool? IsEnforcementOrder { get; set; }
  618. /// <summary>
  619. /// 形式主义工单
  620. /// </summary>
  621. [SugarColumn(DefaultValue = "f")]
  622. public bool IsFormalistWorkOrder { get; set; }
  623. /// <summary>
  624. /// 敏感类工单
  625. /// </summary>
  626. [SugarColumn(DefaultValue = "f")]
  627. public bool IsSensitiveWorkOrders { get; set; }
  628. /// <summary>
  629. /// 24小时办结
  630. /// </summary>
  631. [SugarColumn(DefaultValue = "f")]
  632. public bool Is24HoursComplete { get; set; }
  633. /// <summary>
  634. /// 部门是否解决
  635. /// </summary>
  636. [SugarColumn(DefaultValue = "f")]
  637. public bool IsResolved { get; set; }
  638. /// <summary>
  639. /// 是否紧急
  640. /// </summary>
  641. [SugarColumn(DefaultValue = "f")]
  642. public bool IsUrgent { get; set; }
  643. /// <summary>
  644. /// 是否三方通话
  645. /// </summary>
  646. [SugarColumn(DefaultValue = "f")]
  647. public bool IsThreePartyConference { get; set; }
  648. /// <summary>
  649. /// 重点关注事件,保存前端选择,用于返回前端数据
  650. /// </summary>
  651. public string? FocusOnEvents { get; set; }
  652. /// <summary>
  653. /// 待发布人Id
  654. /// </summary>
  655. public string? WaitForPublisherId { get; set; }
  656. /// <summary>
  657. /// 是否政民互动公开
  658. /// </summary>
  659. [SugarColumn(DefaultValue = "f")]
  660. public bool IsProvinceZmhd { get; set; }
  661. /// <summary>
  662. /// 初审人姓名
  663. /// </summary>
  664. [SugarColumn(ColumnDescription = "初审人姓名")]
  665. public string? AuditFirstName { get; set; }
  666. /// <summary>
  667. /// 初审时间
  668. /// </summary>
  669. [SugarColumn(ColumnDescription = "初审时间")]
  670. public DateTime? AuditFirstTime { get; set; }
  671. /// <summary>
  672. /// 政民互动公开ID
  673. /// </summary>
  674. [SugarColumn(ColumnDescription = "政民互动公开ID")]
  675. public string? OrderProvinceZmhdId { get; set; }
  676. /// <summary>
  677. /// 超期部门
  678. /// </summary>
  679. [SugarColumn(IsIgnore = true)]
  680. public string? DaysOverdueOrgName { get; set; }
  681. /// <summary>
  682. /// 退回截至时间
  683. /// </summary>
  684. [SugarColumn(ColumnDescription = "退回截至时间")]
  685. public DateTime? SendBackAuditEndTime { get; set; }
  686. }
  687. public partial class Order
  688. {
  689. /// <summary>
  690. /// 受理人
  691. /// </summary>
  692. [Navigate(NavigateType.OneToOne, nameof(AcceptorId))]
  693. public User Acceptor { get; set; }
  694. /// <summary>
  695. /// 热点
  696. /// </summary>
  697. [Navigate(NavigateType.OneToOne, nameof(HotspotId))]
  698. public Hotspot Hotspot { get; set; }
  699. /// <summary>
  700. /// 办理流程
  701. /// </summary>
  702. [Navigate(NavigateType.OneToOne, nameof(WorkflowId))]
  703. public Workflow Workflow { get; set; }
  704. /// <summary>
  705. /// 工单扩展信息
  706. /// </summary>
  707. [Navigate(NavigateType.OneToOne, nameof(Id))]
  708. public OrderExtension OrderExtension { get; set; }
  709. /// <summary>
  710. /// 已发布工单
  711. /// </summary>
  712. [Navigate(NavigateType.OneToOne, nameof(Id), nameof(Orders.OrderPublish.OrderId))]
  713. public OrderPublish OrderPublish { get; set; }
  714. /// <summary>
  715. /// 已回访工单
  716. /// </summary>
  717. [Navigate(NavigateType.OneToMany, nameof(OrderVisit.OrderId))]
  718. public List<OrderVisit> OrderVisits { get; set; }
  719. /// <summary>
  720. /// 甄别
  721. /// </summary>
  722. [Navigate(NavigateType.OneToMany, nameof(OrderScreen.OrderId))]
  723. public List<OrderScreen> OrderScreens { get; set; }
  724. /// <summary>
  725. ///
  726. /// </summary>
  727. [Navigate(NavigateType.OneToMany, nameof(OrderSpecial.OrderId))]
  728. public List<OrderSpecial> OrderSpecials { get; set; }
  729. /// <summary>
  730. /// 延期
  731. /// </summary>
  732. [Navigate(NavigateType.OneToMany, nameof(OrderDelay.OrderId))]
  733. public List<OrderDelay> OrderDelays { get; set; }
  734. /// <summary>
  735. /// 工单补充
  736. /// </summary>
  737. [Navigate(NavigateType.OneToMany, nameof(OrderComplement.OrderId))]
  738. public List<OrderComplement> OrderComplements { get; set; }
  739. /// <summary>
  740. /// 工单推送分类
  741. /// </summary>
  742. [Navigate(NavigateType.OneToMany, nameof(OrderPushType.OrderId))]
  743. public List<OrderPushType> OrderPushTypes { get; set; }
  744. /// <summary>
  745. /// 通话记录
  746. /// </summary>
  747. //[Navigate(NavigateType.OneToOne, nameof(CallId), nameof(TrCallRecord.CallAccept))] //由CallAccept改成OtherAccept
  748. [Navigate(NavigateType.OneToOne, nameof(CallId), nameof(TrCallRecord.OtherAccept))]
  749. public TrCallRecord CallRecord { get; set; }
  750. #region Method
  751. public void Cancel()
  752. {
  753. IsCancel = true;
  754. }
  755. public void Redo()
  756. {
  757. Status = EOrderStatus.Handling;
  758. ExpiredStatus = EExpiredStatus.Normal;
  759. }
  760. public void CheckIfFiled()
  761. {
  762. if (Status is EOrderStatus.Filed)
  763. throw UserFriendlyException.SameMessage("工单已归档");
  764. }
  765. public void Init()
  766. {
  767. if (!string.IsNullOrEmpty(Contact))
  768. ContactMask = Contact.MaskPhoneNumber();
  769. Status = EOrderStatus.WaitForAccept;
  770. ExpiredStatus = EExpiredStatus.Normal;
  771. }
  772. public void AutoAccept(string userId, string? userName, string? staffNo)
  773. {
  774. AcceptorId = userId;
  775. AcceptorName = userName;
  776. AcceptorStaffNo = staffNo;
  777. }
  778. /// <summary>
  779. /// 开始工单办理流程
  780. /// </summary>
  781. public void StartManageFlow() => Status = EOrderStatus.Handling;
  782. /// <summary>
  783. /// 更新工单办理中状态
  784. /// </summary>
  785. public void UpdateHandlingStatus(bool isInCountersign) =>
  786. Status = isInCountersign && Status < EOrderStatus.Filed ? EOrderStatus.Countersigning : EOrderStatus.Handling;
  787. /// <summary>
  788. /// 归档
  789. /// </summary>
  790. public void File(DateTime filedTime, double handleDurationWorkday, double fileDurationWorkday, double allDurationWorkday
  791. , double creationTimeHandleDurationWorkday, double centerToOrgHandleDurationWorkday)
  792. {
  793. if (Status is EOrderStatus.Filed) return;
  794. Status = EOrderStatus.Filed;
  795. FiledTime = filedTime;
  796. HandleDurationWorkday = handleDurationWorkday;
  797. FileDurationWorkday = fileDurationWorkday;
  798. AllDurationWorkday = allDurationWorkday;
  799. CreationTimeHandleDurationWorkday = creationTimeHandleDurationWorkday;
  800. CenterToOrgHandleDurationWorkday = centerToOrgHandleDurationWorkday;
  801. //计算实际办结时长
  802. SetHandleDuration();
  803. SetFileDuration();
  804. SetAllDuration();
  805. SetCreationTimeHandleDurationWorkday();
  806. SetCenterToOrgHandleDurationWorkday();
  807. }
  808. /// <summary>
  809. /// 特提之后 归档信息清空
  810. /// </summary>
  811. public void FileEmpty()
  812. {
  813. FiledTime = null;
  814. HandleDurationWorkday = 0;
  815. HandleDuration = 0;
  816. FileDurationWorkday = 0;
  817. FileDuration = 0;
  818. AllDurationWorkday = 0;
  819. AllDuration = 0;
  820. CreationTimeHandleDurationWorkday = 0;
  821. CreationTimeHandleDuration = 0;
  822. CenterToOrgHandleDurationWorkday = 0;
  823. CenterToOrgHandleDuration = 0;
  824. }
  825. /// <summary>
  826. /// 发布
  827. /// </summary>
  828. /// <param name="isPublicity"></param>
  829. public void Publish(bool isPublicity)
  830. {
  831. //Progress = EProgress.Published;
  832. Status = EOrderStatus.Published;
  833. IsPublicity = isPublicity;
  834. }
  835. /// <summary>
  836. /// 已回访
  837. /// </summary>
  838. public void Visited(string resultCode, string result)
  839. {
  840. if (string.IsNullOrEmpty(resultCode) || string.IsNullOrEmpty(result))
  841. return;
  842. if (!string.IsNullOrEmpty(FirstVisitResultCode)) return;
  843. FirstVisitResultCode = resultCode;
  844. FirstVisitResult = result;
  845. //Progress = EProgress.Visited;
  846. Status = EOrderStatus.Visited;
  847. }
  848. public void CenterToOrg(string timelimit, int timelimitCount, ETimeType timilimitUnit,
  849. DateTime expiredTime, DateTime nearlyExpiredTime, DateTime nearlyExpiredTimeOne,
  850. string opinion, string handlerId, string handlerName,
  851. bool canUpdateOrderSender)
  852. {
  853. ProcessType = EProcessType.Jiaoban;
  854. TimeLimit = timelimit;
  855. TimeLimitCount = timelimitCount;
  856. TimeLimitUnit = timilimitUnit;
  857. ExpiredTime = expiredTime;
  858. if (CenterToOrgTime is null || canUpdateOrderSender)
  859. {
  860. CenterToOrgTime = DateTime.Now;
  861. CenterToOrgOpinion = opinion;
  862. CenterToOrgHandlerId = handlerId;
  863. CenterToOrgHandlerName = handlerName;
  864. }
  865. NearlyExpiredTime = nearlyExpiredTime;
  866. NearlyExpiredTimeOne = nearlyExpiredTimeOne;
  867. SendOrderNumber += 1;
  868. if (string.IsNullOrEmpty(WaitForPublisherId))
  869. WaitForPublisherId = handlerId;
  870. }
  871. public void OrgToCenter(string timelimit, int timelimitCount, ETimeType timilimitUnit, DateTime expiredTime, DateTime nearlyExpiredTime, DateTime nearlyExpiredTimeOne)
  872. {
  873. ProcessType = EProcessType.Zhiban;
  874. TimeLimit = timelimit;
  875. TimeLimitCount = timelimitCount;
  876. TimeLimitUnit = timilimitUnit;
  877. ExpiredTime = expiredTime;
  878. NearlyExpiredTime = nearlyExpiredTime;
  879. NearlyExpiredTimeOne = nearlyExpiredTimeOne;
  880. CenterToOrgTime = null;
  881. CenterToOrgOpinion = null;
  882. CenterToOrgHandlerId = null;
  883. CenterToOrgHandlerName = null;
  884. }
  885. public void CenterToCenter(string timelimit, int timelimitCount, ETimeType timilimitUnit, DateTime expiredTime, DateTime nearlyExpiredTime, DateTime nearlyExpiredTimeOne)
  886. {
  887. TimeLimit = timelimit;
  888. TimeLimitCount = timelimitCount;
  889. TimeLimitUnit = timilimitUnit;
  890. ExpiredTime = expiredTime;
  891. NearlyExpiredTime = nearlyExpiredTime;
  892. NearlyExpiredTimeOne = nearlyExpiredTimeOne;
  893. }
  894. public void SetHandleDuration()
  895. {
  896. if (!ActualHandleTime.HasValue) return;
  897. if (!CenterToOrgTime.HasValue) return;
  898. HandleDuration = Math.Round((ActualHandleTime - CenterToOrgTime).Value.TotalSeconds);
  899. }
  900. public void SetAllDuration()
  901. {
  902. if (!FiledTime.HasValue) return;
  903. if (!StartTime.HasValue) return;
  904. AllDuration = Math.Round((FiledTime - StartTime).Value.TotalSeconds);
  905. }
  906. public void SetFileDuration()
  907. {
  908. if (!FiledTime.HasValue) return;
  909. if (!CenterToOrgTime.HasValue) return;
  910. FileDuration = Math.Round((FiledTime - CenterToOrgTime).Value.TotalSeconds);
  911. }
  912. /// <summary>
  913. /// 办结时长(秒) 归档时间-受理时间(工单创建时间)
  914. /// </summary>
  915. public void SetCreationTimeHandleDurationWorkday()
  916. {
  917. if (!FiledTime.HasValue)
  918. CreationTimeHandleDuration = 0;
  919. else
  920. {
  921. var count = Math.Round((FiledTime - CreationTime).Value.TotalSeconds);
  922. CreationTimeHandleDuration = count <= 0 ? 1 : count;
  923. }
  924. }
  925. /// <summary>
  926. /// 办结时长(秒) 归档时间-派单时间(工单创建时间)
  927. /// </summary>
  928. public void SetCenterToOrgHandleDurationWorkday()
  929. {
  930. if (FiledTime.HasValue && CenterToOrgTime.HasValue)
  931. {
  932. var count = Math.Round((FiledTime - CenterToOrgTime).Value.TotalSeconds);
  933. CenterToOrgHandleDuration = count <= 0 ? 1 : count;
  934. }
  935. else
  936. CenterToOrgHandleDuration = 0;
  937. }
  938. /// <summary>
  939. /// 是否已签收
  940. /// </summary>
  941. public bool IsSigned() => !string.IsNullOrEmpty(SignerId);
  942. /// <summary>
  943. /// 签收
  944. /// </summary>
  945. public void Sign(string userId, string userName)
  946. {
  947. if (string.IsNullOrEmpty(SignerId))
  948. {
  949. SignerId = userId;
  950. SignerName = userName;
  951. }
  952. }
  953. ///// <summary>
  954. ///// 返回未签收状态
  955. ///// </summary>
  956. //public void BackToUnsign()
  957. //{
  958. // SignerId = string.Empty;
  959. // SignerName = string.Empty;
  960. //}
  961. #endregion
  962. }
  963. public class UnsignedOrder
  964. {
  965. public Order Order { get; set; }
  966. public WorkflowStep WorkflowStep { get; set; }
  967. }
  968. }