JournalDataView.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. using OASystem.Domain.ViewModels.QiYeWeChat;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text.Json.Serialization;
  5. namespace OASystem.Domain.ViewModels.QiYeWeChat
  6. {
  7. /// <summary>
  8. /// 批量获取汇报记录单号 View
  9. /// </summary>
  10. public class JournalRecordListView : ResponseBase
  11. {
  12. /// <summary>
  13. /// 汇报记录id列表
  14. /// </summary>
  15. public List<string> journaluuid_list { get; set; }
  16. /// <summary>
  17. /// 下一次拉取游标
  18. /// </summary>
  19. public int next_cursor { get; set; }
  20. /// <summary>
  21. /// 0代表还有数据,1代表已无数据
  22. /// </summary>
  23. public int endflag { get; set; }
  24. }
  25. /// <summary>
  26. /// 汇报详情 View
  27. /// </summary>
  28. public class JournalDetailView : ResponseBase
  29. {
  30. /// <summary>
  31. /// 汇报详情信息
  32. /// </summary>
  33. public JournalRecordDetail info { get; set; }
  34. }
  35. /// <summary>
  36. /// 汇报记录详情
  37. /// </summary>
  38. public class JournalRecordDetail
  39. {
  40. /// <summary>
  41. /// 汇报记录单号
  42. /// </summary>
  43. public string journal_uuid { get; set; }
  44. /// <summary>
  45. /// 汇报模板名称
  46. /// </summary>
  47. public string template_name { get; set; }
  48. /// <summary>
  49. /// 汇报模板ID
  50. /// </summary>
  51. public string template_id { get; set; }
  52. /// <summary>
  53. /// 汇报提交时间,Unix时间戳
  54. /// </summary>
  55. public long report_time { get; set; }
  56. /// <summary>
  57. /// 汇报提交者(API 返回字段名为 submitter)
  58. /// </summary>
  59. [JsonPropertyName("submitter")]
  60. public JournalCreator creator { get; set; }
  61. /// <summary>
  62. /// 汇报接收人列表
  63. /// </summary>
  64. public List<JournalReceiver> receivers { get; set; }
  65. /// <summary>
  66. /// 已读汇报接收人列表
  67. /// </summary>
  68. public List<JournalReceiver> readed_receivers { get; set; }
  69. /// <summary>
  70. /// 汇报内容
  71. /// </summary>
  72. public JournalApplyData apply_data { get; set; }
  73. /// <summary>
  74. /// 汇报评论列表
  75. /// </summary>
  76. public List<JournalComment> comments { get; set; }
  77. }
  78. public class JournalCreator
  79. {
  80. public string userid { get; set; }
  81. public string name { get; set; }
  82. }
  83. public class JournalReceiver
  84. {
  85. public string userid { get; set; }
  86. public string name { get; set; }
  87. }
  88. public class JournalApplyData
  89. {
  90. public List<JournalContentItem> contents { get; set; }
  91. }
  92. public class JournalContentItem
  93. {
  94. /// <summary>
  95. /// 控件类型:Text, Textarea, Number, Money, Date, Selector, ...
  96. /// </summary>
  97. public string control { get; set; }
  98. public string id { get; set; }
  99. public List<TitleItem> title { get; set; }
  100. public JournalValue value { get; set; }
  101. }
  102. public class JournalValue
  103. {
  104. public string text { get; set; }
  105. public string new_number { get; set; }
  106. public string new_money { get; set; }
  107. public JournalDate date { get; set; }
  108. public JournalSelector selector { get; set; }
  109. public List<object> tips { get; set; }
  110. public List<JournalMember> members { get; set; }
  111. public List<JournalDepartment> departments { get; set; }
  112. public List<JournalFile> files { get; set; }
  113. /// <summary>
  114. /// 子控件列表,如 Table 的每一行,结构为 [{ "list": [ JournalContentItem, ... ] }]
  115. /// </summary>
  116. public List<JournalChild> children { get; set; }
  117. public List<object> stat_field { get; set; }
  118. public List<object> sum_field { get; set; }
  119. public List<object> related_approval { get; set; }
  120. public List<object> students { get; set; }
  121. public List<object> classes { get; set; }
  122. public List<object> docs { get; set; }
  123. public List<object> wedrive_files { get; set; }
  124. }
  125. /// <summary>
  126. /// 汇报子项容器,如 Table 控件的一行,包含 list 数组
  127. /// </summary>
  128. public class JournalChild
  129. {
  130. public List<JournalContentItem> list { get; set; }
  131. }
  132. public class JournalDate
  133. {
  134. public string type { get; set; }
  135. /// <summary>
  136. /// 时间戳,企业微信API可能返回字符串或数字
  137. /// </summary>
  138. public string s_timestamp { get; set; }
  139. /// <summary>
  140. /// 解析后的时间戳(秒),解析失败时为 null
  141. /// </summary>
  142. public long? s_timestamp_long => long.TryParse(s_timestamp, out var v) ? v : null;
  143. }
  144. public class JournalSelector
  145. {
  146. public string type { get; set; }
  147. public List<JournalSelectorOption> options { get; set; }
  148. public List<object> op_relations { get; set; }
  149. }
  150. public class JournalSelectorOption
  151. {
  152. public string key { get; set; }
  153. public List<TitleItem> value { get; set; }
  154. }
  155. public class JournalMember
  156. {
  157. public string userid { get; set; }
  158. public string name { get; set; }
  159. }
  160. public class JournalDepartment
  161. {
  162. public string openapi_id { get; set; }
  163. public string name { get; set; }
  164. }
  165. public class JournalFile
  166. {
  167. public string file_id { get; set; }
  168. }
  169. public class JournalComment
  170. {
  171. public JournalCreator commentUserInfo { get; set; }
  172. public long commenttime { get; set; }
  173. public string commentcontent { get; set; }
  174. public string commentid { get; set; }
  175. public List<string> media_id { get; set; }
  176. }
  177. /// <summary>
  178. /// 汇报详情字段提取辅助
  179. /// </summary>
  180. public static class JournalFieldHelper
  181. {
  182. /// <summary>
  183. /// 从「客户单位信息」表格中获取「单位全称」
  184. /// </summary>
  185. public static string GetUnitName(this JournalRecordDetail detail) =>
  186. GetFieldValue(detail, "客户单位信息", "单位全称");
  187. /// <summary>
  188. /// 从指定表格中按标题获取字段值(支持 Table 控件,取第一行)
  189. /// </summary>
  190. /// <param name="detail">汇报详情</param>
  191. /// <param name="tableTitle">表格标题,如「客户单位信息」</param>
  192. /// <param name="fieldTitle">字段标题,如「单位全称」「单位类型」</param>
  193. public static string GetFieldValue(this JournalRecordDetail detail, string tableTitle, string fieldTitle)
  194. {
  195. var table = detail?.apply_data?.contents
  196. ?.FirstOrDefault(c => c.control == "Table" && GetTitleText(c) == tableTitle);
  197. var firstRow = table?.value?.children?.FirstOrDefault()?.list;
  198. var field = firstRow?.FirstOrDefault(c => GetTitleText(c) == fieldTitle);
  199. return field?.value?.text;
  200. }
  201. private static string GetTitleText(JournalContentItem item) =>
  202. item?.title?.FirstOrDefault()?.text;
  203. }
  204. }