1. 程式人生 > >C# 呼叫釘釘介面進行傳送企業通知訊息,適應於網頁版

C# 呼叫釘釘介面進行傳送企業通知訊息,適應於網頁版

前期資料如怎麼配置,怎麼建立應用 參考:http://blog.csdn.net/xxdddail/article/category/6776456 感謝原作者

Oa效果圖如下:


引用:

TopSDK.dll 下載網址https://open-doc.dingtalk.com/doc/sdk.htm?spm=a219a.7629140.0.0.mItbfA&treeId=177&articleId=104963&docType=1 選擇 .Net版本TOP接入SDK  下載後改副檔名為zip  rar然後解壓然後得到dll 在專案中引用

using DingTalk.Api;
using DingTalk.Api.Request;
using DingTalk.Api.Response;

主要呼叫 CorpMessageCorpconversationAsyncsendResponse 企業會話訊息非同步傳送

參考文章:https://open-doc.dingtalk.com/docs/doc.htm?treeId=172&articleId=28915&docType=2

 #region 釘釘傳送訊息通知
        /// <summary>  
        /// 企業通知訊息介面傳送訊息  https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.dWrFg3&treeId=172&articleId=104973&docType=1  可用此方法
        /// </summary>  
        /// <param name="toUser">目標使用者</param>  
        /// <param name="toParty">目標部門.當toParty和toUser同時指定時,以toParty來發送。</param>  
        /// <param name="content">訊息文字</param>  
        /// <returns></returns>  
        //public static SendMessageResult GroupSendTextMsg(string toUser, string toParty, string content)
        //{
        //    var txtmsg = new
        //    {
        //        touser = toUser,//員工id列表(訊息接收者,多個接收者用|分隔)
        //        toparty = toParty,//部門id列表
        //        msgtype = MsgType.text.ToString(),
        //        agentid = ConfigHelper.FetchAgentID(),//應用的標識
        //        text = new
        //        {
        //            content = content
        //        }
        //    };
        //    string apiurl = ApiTool.FormatApiUrlWithToken(Urls.group_message_send);
        //    string json = JsonConvert.SerializeObject(txtmsg);
        //    var result = Analyze.Post<SendMessageResult>(apiurl, json);
        //    return result;
        //}

        /// <summary>
        /// 傳送到部門群組\單個人
        /// </summary>
        /// <param name="toUser"></param>
        /// <param name="content"></param>
        /// <param name="forceUpdate"></param>
        /// <returns></returns>
        public static void AsyncSendDingTalkTextMessage(string toUser, string msgContent,string trueName, bool forceUpdate = false)
        {
            log4net.ILog log = log4net.LogManager.GetLogger("傳送釘釘text訊息格式");
            ApiTool.EndUpdateAccessToken(forceUpdate);
            IDingTalkClient client = new DefaultDingTalkClient(Urls.corpconversation_asyncsend);
            var txtmsg = new CorpMessageCorpconversationAsyncsendRequest()
            {
                Msgtype = MsgType.text.ToString(),//訊息型別
                AgentId = Convert.ToInt64(ConfigHelper.FetchAgentID()),// 	微應用的id
                UseridList = toUser,//接收者的使用者userid列表 
                Msgcontent = "{ \"content\": \""+msgContent+"\" } "
            };

             CorpMessageCorpconversationAsyncsendResponse rsp = client.Execute(txtmsg, AccessToken.Value);
            var result = rsp.Body;
            log.Info(new LogContent(ShareApplyClass.GetIPAddress(),HttpContext.Current.Server.UrlDecode(trueName) , "傳送釘釘text訊息格式", msgContent + "資訊如下。" + result));
        }

        /// <summary>
        ///  通過判斷個人是否有釘釘審批進行傳送釘釘訊息
        /// </summary>
        /// <param name="insertType"></param>
        /// <param name="approveID"></param>
        /// <param name="dingTalkID">下一步審批人的釘釘ID</param>
        /// <param name="trueName">下一步審批人的真實姓名</param>
        /// authorName 提交人
        public static void AsyncSendDingTalkOAMessage(string insertType, string approveID, string dingTalkID, string trueName, string authorName, bool forceUpdate = false)
        {
            log4net.ILog log;
            ApiTool.EndUpdateAccessToken(forceUpdate);
            IDingTalkClient client = new DefaultDingTalkClient(Urls.corpconversation_asyncsend);
            using (WHSMDataContext db = new WHSMDataContext())
            {
                var getApproveInfo = db.ApprovePlanOrder_Header.SingleOrDefault(x => x.approveID.Equals(approveID));
                if (getApproveInfo != null)
                {
                    var approveTitle = getApproveInfo.approveTitle;
                    log = log4net.LogManager.GetLogger(approveTitle);
                    //
                    var workName = WorkFlowModule.ReturnTypeName(insertType);
                    //存放是採購、領用等
                    var typeName = string.Empty;
                    var form = new List<OaBodyFormJsonList>() { };     
   form = new List<OaBodyFormJsonList>()
                            {
                                new OaBodyFormJsonList() {key="流水號:",value=getApproveInfo.approveNo },
                                new OaBodyFormJsonList() {key="申請人:",value=getApproveInfo.approvePlanPeople },
                                new OaBodyFormJsonList() {key = "申請部門:", value = db.Base_Department.SingleOrDefault(x=>x.sortId==getApproveInfo.approveDept).sortName},
                                new OaBodyFormJsonList() {key="申請時間:",value=getApproveInfo.approveDate.ToString() },
                                new OaBodyFormJsonList() {key="入庫倉庫:",value=db.Base_WareHouse.SingleOrDefault(x=>x.whcode==getApproveInfo.approveWh).whname },
                                new OaBodyFormJsonList() {key="備註說明:",value=getApproveInfo.approveNote }
                            };
                            typeName = "採購";
    List<ApprovePlanOrder_Details> lstApproveDetails = new List<ApprovePlanOrder_Details>();
                  var getApproveDetails = db.ApprovePlanOrder_Details.Where(x => x.approveID.Equals(approveID)).ToList();
                    if (getApproveDetails.Count > 0)
                    {
                        lstApproveDetails = getApproveDetails;
                    }
                    else
                    {
//                        SELECT a.*from ApprovePlanOrder_Details a INNER JOIN(
//SELECT b.approveID from ApprovePlanOrder_Header a INNER JOIN(SELECT approveID, CgCostsID from ApprovePlanOrder_Header)
//b on a.approveID = b.CgCostsID where a.approveID = '77634e39-25aa-4cec-8688-5f17c41fb56d')b on a.approveID = b.approveID
                        lstApproveDetails  = (from a in db.ApprovePlanOrder_Details
                                              join b in (
                                                  (from a0 in db.ApprovePlanOrder_Header
                                                   join b in (
                                                     (from approveplanorder_header in db.ApprovePlanOrder_Header
                                                       select new
                                                       {
                                                           approveplanorder_header.approveID,
                                                           approveplanorder_header.CgCostsID
                                                       })) on new { approveID = a0.approveID } equals new { approveID = b.CgCostsID }
                                                   where  a0.approveID.Equals(approveID)
                                                   select new  { b.approveID  })) on a.approveID equals b.approveID
                                              select a
                                               ).ToList();
                    }
                    if (lstApproveDetails.Count > 0)
                    {
                        System.Text.StringBuilder sb = new System.Text.StringBuilder();
                        sb.Append("所屬流程:" + workName + "\n");
                        sb.Append(typeName + "商品總數:" + lstApproveDetails.Sum(x => x.goodsBuyNo) + " 件(個)\n");
                        sb.Append("上一步辦理人給您的提示:" + db.Approve_NextStepInfo.Single(x =>
                        x.Instance_ID.Equals(approveID) && x.Reg_Code == getApproveInfo.approvePeople).App_InnerIdea);
                        var url = System.Configuration.ConfigurationManager.AppSettings["HttpUrl"]+"DingTalkApproval.aspx?insertType=" + insertType + "&approveID=" + approveID + "&DingTalkID=" + dingTalkID + "&TrueName=" + trueName + "";
                        oa newOA = new oa()
                        {
                            message_url = url,
                            pc_message_url = "dingtalk:dingtalkclient/page/link?url=" + HttpContext.Current.Server.UrlEncode(url) + "&pc_slide=true",
                            head = new OaHeadJsonList() { bgcolor = "FFBBBBBB", text = approveTitle },
                            body = new OaBodyJsonList()
                            {
                                title = "流程標題:[" + approveTitle + "]正等待您的審批",
                                form = form,
                                rich = new OaRichJsonList() { num = lstApproveDetails.Sum(x => x.goodsBuyNo * x.goodsPrice).ToString(), unit = "元" },
                                file_count = string.IsNullOrWhiteSpace(getApproveInfo.approveFilePath) == true ? "" : "1",
                                content = sb.ToString(),
                                author = string.IsNullOrWhiteSpace(authorName) == true ?trueName : authorName,
                                //db.Base_SuperAdmin.SingleOrDefault(x => x.dingtalkid == getApproveInfo.approvePeople).truename
                            },
                        };
                        var jsonContent = JsonConvert.SerializeObject(newOA);
                        var txtmsg = new CorpMessageCorpconversationAsyncsendRequest()
                        {
                            Msgtype = MsgType.OA.ToString(),//訊息型別
                            AgentId = Convert.ToInt64(ConfigHelper.FetchAgentID()),//     微應用的id
                            UseridList = dingTalkID,//接收者的使用者userid列表 
                            Msgcontent = jsonContent
                        };
                        CorpMessageCorpconversationAsyncsendResponse rsp = client.Execute(txtmsg, AccessToken.Value);
                        var result = rsp.Body;

                        log.Info(new LogContent(ShareApplyClass.GetIPAddress(), trueName,
      "傳送釘釘資訊", "傳送流程編號為:" + approveID + "的標題[" + approveTitle + "]資訊如下。" + result));
                    }
                    else
                    {
                        log.Fatal(new LogContent(ShareApplyClass.GetIPAddress(), trueName,
      "傳送釘釘資訊", "傳送流程編號為:" + approveID + "的標題[" + approveTitle + "]沒有明細資訊"));
                    }
}
}

呼叫方法參考:

 AsyncSendDingTalkTextMessage 方法參考:

 var sendMessageAlert = "您的" + typeName + ":【" + approveTitle + "】已被【" + trueName + "】審批通過。";
 ShareApplyClass.AsyncSendDingTalkTextMessage(regDingTalkID,  sendMessageAlert,trueName);
AsyncSendDingTalkOAMessage 方法參考: 
var handlerType = ((Button)sender).CommandArgument == "5" ? "已成功退回給【" + drpBackApprovePeople.SelectedItem.Text + "】,等待重新處理後再次審批。" : "正在等待【" + drpApprovePeople.SelectedItem.Text + "】審批,如緊急或等待時間過長,您可點選催辦進行催促當前辦理人進行審批。";
                        var sendMessageAlert = "【" + txtApproveTtile.Value + "】" + handlerType;
                        var agreeCode = ((Button)sender).CommandArgument == "5" ? drpBackApprovePeople.SelectedValue : drpApprovePeople.SelectedValue;
                        if (ShareApplyClass.GetIfDingtalkAgreeStatus(agreeCode) == 'Y')
                        {
                            ShareApplyClass.AsyncSendDingTalkOAMessage(Request["insertType"], Request["ApproveID"], agreeCode, ShareApplyClass.GetBackNextApproveTureName(agreeCode), Request["TrueName"]);
                        }
                        else
                        {
                            ShareApplyClass.AsyncSendDingTalkTextMessage(agreeCode, sendMessageAlert, Request["TrueName"]);
                        }