Order.cs 34 KB

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