Explorar el Código

完善企微汇报模块

yuanrf hace 1 día
padre
commit
b3a8d0e8ac

+ 36 - 5
OASystem/OASystem.Api/Controllers/TaskController.cs

@@ -10,6 +10,7 @@ using OASystem.Domain.ViewModels.JuHeExchangeRate;
 using OASystem.API.OAMethodLib.QiYeWeChatAPI.AppNotice;
 using Dm.util;
 using OASystem.API.OAMethodLib.DoubaoAPI;
+using OASystem.API.OAMethodLib.QiYeWeChatAPI;
 
 namespace OASystem.API.Controllers
 {
@@ -23,10 +24,12 @@ namespace OASystem.API.Controllers
 
         readonly SqlSugarClient _sqlsugar;
         readonly IDoubaoService _doubaoService;
-        public TaskController(SqlSugarClient sqlsugar, IDoubaoService doubaoService)
+        readonly IQiYeWeChatApiService _qiYeWeChatApiService;
+        public TaskController(SqlSugarClient sqlsugar, IDoubaoService doubaoService, IQiYeWeChatApiService qiYeWeChatApiService)
         {
             _sqlsugar = sqlsugar;
             _doubaoService = doubaoService;
+            _qiYeWeChatApiService = qiYeWeChatApiService;
         }
 
         /// <summary>
@@ -1105,10 +1108,11 @@ namespace OASystem.API.Controllers
                      new DouBaoChatMessage() { Role = DouBaoRole.system, Content = "你是一个专业的AI助手,请根据用户的问题给出回答" },
                      new DouBaoChatMessage() { Role = DouBaoRole.user, Content = messages }
                 },
-                new CompleteChatOptions() { 
-                    ThinkingOptions = new thinkingOptions() 
-                     { IsThinking = true, ReasoningEffort = ReasoningEffort.High }
-                 }
+                new CompleteChatOptions()
+                {
+                    ThinkingOptions = new thinkingOptions()
+                    { IsThinking = true, ReasoningEffort = ReasoningEffort.High }
+                }
             );
 
             jw.Code = 200;
@@ -1116,5 +1120,32 @@ namespace OASystem.API.Controllers
             jw.Data = result;
             return Ok(jw);
         }
+
+        [HttpPost]
+        public async Task<IActionResult> TestQiYeWeChat()
+        {
+            var jw = JsonView(false);
+            DateTime now = DateTime.Now;
+            DateTime startDt = now.AddMonths(-1);
+            long starttime = (long)(startDt.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
+            long endtime = (long)(now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
+
+            var result = await _qiYeWeChatApiService.GetJournalRecordListAsync(starttime, endtime);
+            jw.Code = 200;
+            jw.Msg = "SUCCESS!";
+            jw.Data = result;
+            return Ok(jw);
+        }
+
+        [HttpPost]
+        public async Task<IActionResult> TestQiYeWeChatDetail(string journaluuid)
+        {
+            var jw = JsonView(false);
+            var result = await _qiYeWeChatApiService.GetJournalRecordDetailAsync(journaluuid);
+            jw.Code = 200;
+            jw.Msg = "SUCCESS!";
+            jw.Data = result;
+            return Ok(jw);
+        }
     }
 }

+ 19 - 1
OASystem/OASystem.Api/OAMethodLib/QiYeWeChatAPI/IQiYeWeChatApiService.cs

@@ -1,4 +1,4 @@
-using OASystem.Domain.Dtos.QiYeWeChat;
+using OASystem.Domain.Dtos.QiYeWeChat;
 using OASystem.Domain.ViewModels.QiYeWeChat;
 
 namespace OASystem.API.OAMethodLib.QiYeWeChatAPI
@@ -171,6 +171,24 @@ namespace OASystem.API.OAMethodLib.QiYeWeChatAPI
         /// <returns></returns>
         Task<ApprovalDetailView> GetApprovalDetailAsync(string spNo);
 
+        /// <summary>
+        /// 批量获取汇报记录单号
+        /// </summary>
+        /// <param name="starttime">开始时间</param>
+        /// <param name="endtime">结束时间</param>
+        /// <param name="cursor">游标</param>
+        /// <param name="limit">拉取条数</param>
+        /// <param name="filters">过滤条件</param>
+        /// <returns></returns>
+        Task<JournalRecordListView> GetJournalRecordListAsync(long starttime, long endtime, int cursor = 0, int limit = 10, List<JournalFilter> filters = null);
+
+        /// <summary>
+        /// 获取汇报记录详情
+        /// </summary>
+        /// <param name="journaluuid">汇报记录单号</param>
+        /// <returns></returns>
+        Task<JournalDetailView> GetJournalRecordDetailAsync(string journaluuid);
+
 
         /// <summary>
         /// hook 发送团组出发信息给财务群

+ 101 - 1
OASystem/OASystem.Api/OAMethodLib/QiYeWeChatAPI/QiYeWeChatApiService.cs

@@ -1,8 +1,9 @@
-using EyeSoft.Extensions;
+using EyeSoft.Extensions;
 using OASystem.Domain.Dtos.QiYeWeChat;
 using OASystem.Domain.ViewModels.QiYeWeChat;
 using System.Diagnostics;
 using System.Text.Json;
+using System.Text.Json.Serialization;
 
 namespace OASystem.API.OAMethodLib.QiYeWeChatAPI
 {
@@ -24,6 +25,7 @@ namespace OASystem.API.OAMethodLib.QiYeWeChatAPI
         private readonly string AddressBook_Corpsecret = "Y1tnjh7j-BvbqAytAoXZPUbmDR6dqLTL6mXtc6PZ7fo";  //通讯录同步 凭证密钥
         private readonly string Approve_Corpsecret = "k_Jo69Jw9Hqg_in-Rypbs30PNbxOYa1t4e-dxYuT-kw";  //审批 凭证密钥
         private readonly string GroupStatus_Corpsecret = "7J_ST3jTPzbZpFwl7ttToTVufjEx6O2wuApvKHxt2Ak"; //OA通知Secret
+        private readonly string Journal_Corpsecret = "l2lZbyLfyickVLdgi2bwVTevE-0UuZWpbNPrCbNhst0"; //汇报 凭证密钥
 
         private readonly DateTime _1970 = new DateTime(1970, 1, 1, 0, 0, 0, 0);
         private readonly JobPostRepository _jobPostRep;
@@ -49,6 +51,7 @@ namespace OASystem.API.OAMethodLib.QiYeWeChatAPI
         /// 4:通讯录同步
         /// 5:审批
         /// 6:团组状态通知
+        /// 7:汇报
         /// </param>
         /// <returns></returns>
         private async Task<Access_TokenView> GetTokenAsync(int applicationType)
@@ -87,6 +90,11 @@ namespace OASystem.API.OAMethodLib.QiYeWeChatAPI
                 access_Token.corpsecret = GroupStatus_Corpsecret;
                 cacheName = "GroupStatus_Access_Token";
             }
+            else if (applicationType == 7) //汇报
+            {
+                access_Token.corpsecret = Journal_Corpsecret;
+                cacheName = "Journal_Access_Token";
+            }
             else
             {
                 tokenResult.errmsg = "未识别应用类型Id!";
@@ -1525,6 +1533,98 @@ namespace OASystem.API.OAMethodLib.QiYeWeChatAPI
         }
         #endregion
 
+        #region 汇报
+
+        /// <summary>
+        /// 批量获取汇报记录单号
+        /// </summary>
+        /// <param name="starttime"></param>
+        /// <param name="endtime"></param>
+        /// <param name="cursor"></param>
+        /// <param name="limit"></param>
+        /// <param name="filters"></param>
+        /// <returns></returns>
+        public async Task<JournalRecordListView> GetJournalRecordListAsync(long starttime, long endtime, int cursor = 0, int limit = 10, List<JournalFilter> filters = null)
+        {
+            JournalRecordListView result = new JournalRecordListView();
+
+            //获取汇报数据 token (Type = 7)
+            Access_TokenView access_Token = await GetTokenAsync(7);
+            if (access_Token.errcode != 0)
+            {
+                result.errcode = access_Token.errcode;
+                result.errmsg = string.Format("【企业微信】【获取汇报记录单号】【Token】【Msg】{0}", access_Token.errmsg);
+                return result;
+            }
+
+            string url = string.Format("/cgi-bin/oa/journal/get_record_list?access_token={0}", access_Token.access_token);
+
+            JournalRecordList_Request req = new JournalRecordList_Request()
+            {
+                starttime = starttime,
+                endtime = endtime,
+                cursor = cursor,
+                limit = limit,
+                filters = filters
+            };
+
+            var options = new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
+            options.Converters.Add(new JsonStringEnumConverter());
+            var json = System.Text.Json.JsonSerializer.Serialize(req, options);
+            var content = new StringContent(json, Encoding.UTF8, "application/json");
+            var create_Req = await _httpClient.PostAsync(url, content);
+            var stringResponse = await create_Req.Content.ReadAsStringAsync();
+
+            result = System.Text.Json.JsonSerializer.Deserialize<JournalRecordListView>(stringResponse,
+                new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
+
+            return result;
+        }
+
+        /// <summary>
+        /// 获取汇报记录详情
+        /// </summary>
+        /// <param name="journaluuid"></param>
+        /// <returns></returns>
+        public async Task<JournalDetailView> GetJournalRecordDetailAsync(string journaluuid)
+        {
+            JournalDetailView result = new JournalDetailView();
+
+            if (string.IsNullOrEmpty(journaluuid))
+            {
+                result.errmsg = "journaluuid为空!";
+                return result;
+            }
+
+            //获取汇报数据 token (Type = 7)
+            Access_TokenView access_Token = await GetTokenAsync(7);
+            if (access_Token.errcode != 0)
+            {
+                result.errcode = access_Token.errcode;
+                result.errmsg = string.Format("【企业微信】【获取汇报详情】【Token】【Msg】{0}", access_Token.errmsg);
+                return result;
+            }
+
+            string url = string.Format("/cgi-bin/oa/journal/get_record_detail?access_token={0}", access_Token.access_token);
+
+            var req = new
+            {
+                journaluuid = journaluuid
+            };
+
+            var json = System.Text.Json.JsonSerializer.Serialize(req);
+            var content = new StringContent(json, Encoding.UTF8, "application/json");
+            var create_Req = await _httpClient.PostAsync(url, content);
+            var stringResponse = await create_Req.Content.ReadAsStringAsync();
+
+            result = System.Text.Json.JsonSerializer.Deserialize<JournalDetailView>(stringResponse,
+                new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
+
+            return result;
+        }
+
+        #endregion
+
         #region hook机器人
 
 

+ 93 - 0
OASystem/OASystem.Domain/Dtos/QiYeWeChat/Journal_Request.cs

@@ -0,0 +1,93 @@
+using System.Collections.Generic;
+
+namespace OASystem.Domain.Dtos.QiYeWeChat
+{
+    /// <summary>
+    /// 批量获取汇报记录单号 Request
+    /// </summary>
+    public class JournalRecordList_Request
+    {
+        /// <summary>
+        /// 调用接口凭证
+        /// </summary>
+        public string access_token { get; set; }
+
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        public long starttime { get; set; }
+
+        /// <summary>
+        /// 结束时间,开始时间和结束时间间隔不能超过一个月
+        /// </summary>
+        public long endtime { get; set; }
+
+        /// <summary>
+        /// 游标首次请求传0,非首次请求携带上一次请求返回的next_cursor
+        /// </summary>
+        public int cursor { get; set; }
+
+        /// <summary>
+        /// 拉取条数,最大100
+        /// </summary>
+        public int limit { get; set; }
+
+        /// <summary>
+        /// 过滤条件
+        /// </summary>
+        public List<JournalFilter> filters { get; set; }
+    }
+
+    /// <summary>
+    /// 汇报过滤条件
+    /// </summary>
+    public class JournalFilter
+    {
+        /// <summary>
+        /// creator指定汇报记录提单人;department指定提单人所在部门;template_id指定模板
+        /// </summary>
+        public JournalFilterKey key { get; set; }
+
+        /// <summary>
+        /// 对应的值
+        /// </summary>
+        public string value { get; set; }
+    }
+
+    /// <summary>
+    /// 汇报过滤 Key 枚举
+    /// </summary>
+    public enum JournalFilterKey
+    {
+        /// <summary>
+        /// 指定汇报记录提单人
+        /// </summary>
+        creator,
+
+        /// <summary>
+        /// 指定提单人所在部门
+        /// </summary>
+        department,
+
+        /// <summary>
+        /// 指定模板
+        /// </summary>
+        template_id
+    }
+
+    /// <summary>
+    /// 获取汇报记录详情 Request
+    /// </summary>
+    public class JournalRecordDetail_Request
+    {
+        /// <summary>
+        /// 调用接口凭证
+        /// </summary>
+        public string access_token { get; set; }
+
+        /// <summary>
+        /// 汇报记录单号
+        /// </summary>
+        public string journaluuid { get; set; }
+    }
+}

+ 170 - 0
OASystem/OASystem.Domain/ViewModels/QiYeWeChat/JournalDataView.cs

@@ -0,0 +1,170 @@
+using OASystem.Domain.ViewModels.QiYeWeChat;
+using System.Collections.Generic;
+
+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>
+        /// 汇报模板ID
+        /// </summary>
+        public string template_id { get; set; }
+
+        /// <summary>
+        /// 汇报提交时间,Unix时间戳
+        /// </summary>
+        public long report_time { get; set; }
+
+        /// <summary>
+        /// 汇报提交者
+        /// </summary>
+        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<JournalMember> members { get; set; }
+        public List<JournalDepartment> departments { get; set; }
+        public List<JournalFile> files { get; set; }
+    }
+
+    public class JournalDate
+    {
+        public string type { get; set; }
+        public long s_timestamp { get; set; }
+    }
+
+    public class JournalSelector
+    {
+        public string type { get; set; }
+        public List<JournalSelectorOption> options { 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; }
+    }
+}