| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- using OASystem.Domain.ViewModels.QiYeWeChat;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text.Json.Serialization;
- namespace OASystem.Domain.ViewModels.QiYeWeChat
- {
- /// <summary>
- /// 批量获取汇报记录单号 View
- /// </summary>
- public class JournalRecordListView : ResponseBase
- {
- /// <summary>
- /// 汇报记录id列表
- /// </summary>
- public List<string> journaluuid_list { get; set; }
- /// <summary>
- /// 下一次拉取游标
- /// </summary>
- public int next_cursor { get; set; }
- /// <summary>
- /// 0代表还有数据,1代表已无数据
- /// </summary>
- public int endflag { get; set; }
- }
- /// <summary>
- /// 汇报详情 View
- /// </summary>
- public class JournalDetailView : ResponseBase
- {
- /// <summary>
- /// 汇报详情信息
- /// </summary>
- public JournalRecordDetail info { get; set; }
- }
- /// <summary>
- /// 汇报记录详情
- /// </summary>
- public class JournalRecordDetail
- {
- /// <summary>
- /// 汇报记录单号
- /// </summary>
- public string journal_uuid { get; set; }
- /// <summary>
- /// 汇报模板名称
- /// </summary>
- public string template_name { get; set; }
- /// <summary>
- /// 汇报模板ID
- /// </summary>
- public string template_id { get; set; }
- /// <summary>
- /// 汇报提交时间,Unix时间戳
- /// </summary>
- public long report_time { get; set; }
- /// <summary>
- /// 汇报提交者(API 返回字段名为 submitter)
- /// </summary>
- [JsonPropertyName("submitter")]
- public JournalCreator creator { get; set; }
- /// <summary>
- /// 汇报接收人列表
- /// </summary>
- public List<JournalReceiver> receivers { get; set; }
- /// <summary>
- /// 已读汇报接收人列表
- /// </summary>
- public List<JournalReceiver> readed_receivers { get; set; }
- /// <summary>
- /// 汇报内容
- /// </summary>
- public JournalApplyData apply_data { get; set; }
- /// <summary>
- /// 汇报评论列表
- /// </summary>
- public List<JournalComment> comments { get; set; }
- }
- public class JournalCreator
- {
- public string userid { get; set; }
- public string name { get; set; }
- }
- public class JournalReceiver
- {
- public string userid { get; set; }
- public string name { get; set; }
- }
- public class JournalApplyData
- {
- public List<JournalContentItem> contents { get; set; }
- }
- public class JournalContentItem
- {
- /// <summary>
- /// 控件类型:Text, Textarea, Number, Money, Date, Selector, ...
- /// </summary>
- public string control { get; set; }
- public string id { get; set; }
- public List<TitleItem> title { get; set; }
- public JournalValue value { get; set; }
- }
- public class JournalValue
- {
- public string text { get; set; }
- public string new_number { get; set; }
- public string new_money { get; set; }
- public JournalDate date { get; set; }
- public JournalSelector selector { get; set; }
- public List<object> tips { get; set; }
- public List<JournalMember> members { get; set; }
- public List<JournalDepartment> departments { get; set; }
- public List<JournalFile> files { get; set; }
- /// <summary>
- /// 子控件列表,如 Table 的每一行,结构为 [{ "list": [ JournalContentItem, ... ] }]
- /// </summary>
- public List<JournalChild> children { get; set; }
- public List<object> stat_field { get; set; }
- public List<object> sum_field { get; set; }
- public List<object> related_approval { get; set; }
- public List<object> students { get; set; }
- public List<object> classes { get; set; }
- public List<object> docs { get; set; }
- public List<object> wedrive_files { get; set; }
- }
- /// <summary>
- /// 汇报子项容器,如 Table 控件的一行,包含 list 数组
- /// </summary>
- public class JournalChild
- {
- public List<JournalContentItem> list { get; set; }
- }
- public class JournalDate
- {
- public string type { get; set; }
- /// <summary>
- /// 时间戳,企业微信API可能返回字符串或数字
- /// </summary>
- public string s_timestamp { get; set; }
- /// <summary>
- /// 解析后的时间戳(秒),解析失败时为 null
- /// </summary>
- public long? s_timestamp_long => long.TryParse(s_timestamp, out var v) ? v : null;
- }
- public class JournalSelector
- {
- public string type { get; set; }
- public List<JournalSelectorOption> options { get; set; }
- public List<object> op_relations { get; set; }
- }
- public class JournalSelectorOption
- {
- public string key { get; set; }
- public List<TitleItem> value { get; set; }
- }
- public class JournalMember
- {
- public string userid { get; set; }
- public string name { get; set; }
- }
- public class JournalDepartment
- {
- public string openapi_id { get; set; }
- public string name { get; set; }
- }
- public class JournalFile
- {
- public string file_id { get; set; }
- }
- public class JournalComment
- {
- public JournalCreator commentUserInfo { get; set; }
- public long commenttime { get; set; }
- public string commentcontent { get; set; }
- public string commentid { get; set; }
- public List<string> media_id { get; set; }
- }
- /// <summary>
- /// 汇报详情字段提取辅助
- /// </summary>
- public static class JournalFieldHelper
- {
- /// <summary>
- /// 从「客户单位信息」表格中获取「单位全称」
- /// </summary>
- public static string GetUnitName(this JournalRecordDetail detail) =>
- GetFieldValue(detail, "客户单位信息", "单位全称");
- /// <summary>
- /// 从指定表格中按标题获取字段值(支持 Table 控件,取第一行)
- /// </summary>
- /// <param name="detail">汇报详情</param>
- /// <param name="tableTitle">表格标题,如「客户单位信息」</param>
- /// <param name="fieldTitle">字段标题,如「单位全称」「单位类型」</param>
- public static string GetFieldValue(this JournalRecordDetail detail, string tableTitle, string fieldTitle)
- {
- var table = detail?.apply_data?.contents
- ?.FirstOrDefault(c => c.control == "Table" && GetTitleText(c) == tableTitle);
- var firstRow = table?.value?.children?.FirstOrDefault()?.list;
- var field = firstRow?.FirstOrDefault(c => GetTitleText(c) == fieldTitle);
- return field?.value?.text;
- }
- private static string GetTitleText(JournalContentItem item) =>
- item?.title?.FirstOrDefault()?.text;
- }
- }
|