金蝶云星空插件開發記錄(一)

實現目的:

新增供應商保存后,觸發釘釘審批流程,并根據釘釘審批結果回寫是否合格供應商。

實現思路:

通過BOS平臺供在應商管理界面新增兩個復選框字段:是否釘釘審批、是否合格供應商,若在新建供應商檔案時勾選是否釘釘審批,在保存供應商信息的時候調用二開插件傳遞釘釘審批,同時啟動子線程定時任務,定時獲取釘釘審批結果,若釘釘審批通過則需要自動回寫合格供應商。

實現過程:

1、新建.net framework項目,引入金蝶插件,引入釘釘插件(TopSdk)。

2、新建釘釘幫助類,用于獲取token、userid等信息:

using DingTalk.Api;
using DingTalk.Api.Request;
using DingTalk.Api.Response;
using System.Collections.Generic;namespace K3Cloud.BasicData.Supply.SupplySendDing
{public class DingtalkHelper{public static string GetToken() {DefaultDingTalkClient defaultDingTalkClient = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");OapiGettokenRequest OapiGettokenRequest = new OapiGettokenRequest();OapiGettokenRequest.Appkey = "你的appkey";OapiGettokenRequest.Appsecret = "你的appsecret";OapiGettokenRequest.SetHttpMethod("GET");OapiGettokenResponse oapiGettokenResponse = defaultDingTalkClient.Execute(OapiGettokenRequest);return oapiGettokenResponse.AccessToken;}public static string GetUserId(string token,string name) {DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/simplelist");OapiUserSimplelistRequest req = new OapiUserSimplelistRequest();req.Lang = "zh_CN";req.DepartmentId = 51236588;//采購部門id,在釘釘后臺查看req.SetHttpMethod("GET");OapiUserSimplelistResponse rsp = client.Execute(req, token);Dictionary<string, string> map = new Dictionary<string, string>();rsp.Userlist.ForEach(x =>{map[x.Name] = x.Userid;});return map[name];}}
}

3、新建釘釘流程創建操作類:

using DingTalk.Api.Request;
using DingTalk.Api.Response;
using DingTalk.Api;
using System;
using System.Collections.Generic;namespace K3Cloud.BasicData.Supply.SupplySendDing
{public class DingtalkStart{public static string StartSupplyNew(string token,string userId,string code,string name,string supplyCate,string address) {DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/processinstance/create");OapiProcessinstanceCreateRequest req = new OapiProcessinstanceCreateRequest();req.AgentId = 39568215863;req.ProcessCode = "表單code";req.OriginatorUserId = userId;req.DeptId = 50212358; //采購部id//單行輸入框List<OapiProcessinstanceCreateRequest.FormComponentValueVoDomain> formComponentValueVoList = new List<OapiProcessinstanceCreateRequest.FormComponentValueVoDomain>();OapiProcessinstanceCreateRequest.FormComponentValueVoDomain formComponentValueVo = new OapiProcessinstanceCreateRequest.FormComponentValueVoDomain();formComponentValueVoList.Add(formComponentValueVo);formComponentValueVo.Name = "編碼";formComponentValueVo.Value = code;OapiProcessinstanceCreateRequest.FormComponentValueVoDomain formComponentValueVo1 = new OapiProcessinstanceCreateRequest.FormComponentValueVoDomain();formComponentValueVoList.Add(formComponentValueVo1);formComponentValueVo1.Name = "名稱";formComponentValueVo1.Value = name;OapiProcessinstanceCreateRequest.FormComponentValueVoDomain formComponentValueVo2 = new OapiProcessinstanceCreateRequest.FormComponentValueVoDomain();formComponentValueVoList.Add(formComponentValueVo2);formComponentValueVo2.Name = "日期";formComponentValueVo2.Value = DateTime.Now.ToString("yyyy-MM-dd");OapiProcessinstanceCreateRequest.FormComponentValueVoDomain formComponentValueVo3 = new OapiProcessinstanceCreateRequest.FormComponentValueVoDomain();formComponentValueVoList.Add(formComponentValueVo3);formComponentValueVo3.Name = "供應商分組";formComponentValueVo3.Value = supplyCate;OapiProcessinstanceCreateRequest.FormComponentValueVoDomain formComponentValueVo4 = new OapiProcessinstanceCreateRequest.FormComponentValueVoDomain();formComponentValueVoList.Add(formComponentValueVo4);formComponentValueVo4.Name = "注冊地址";formComponentValueVo4.Value = address;req.FormComponentValues_ = formComponentValueVoList;OapiProcessinstanceCreateResponse rsp = client.Execute(req, token);return rsp.ProcessInstanceId;}}
}

4、封裝獲取釘釘審批狀態類:

using DingTalk.Api.Request;
using DingTalk.Api.Response;
using DingTalk.Api;namespace K3Cloud.BasicData.Supply.SupplySendDing
{public class DingtalkGet{public static string GetSupplyNewField(string processId) {DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/processinstance/get");OapiProcessinstanceGetRequest req = new OapiProcessinstanceGetRequest();req.ProcessInstanceId = processId;OapiProcessinstanceGetResponse rsp = client.Execute(req, DingtalkHelper.GetToken());if (rsp.ProcessInstance.Status == "TERMINATED" || rsp.ProcessInstance.Status == "CANCELED") {return "否";}if (rsp.ProcessInstance.Result == "refuse"){return "否";}if (rsp.ProcessInstance.Status == "COMPLETED" && rsp.ProcessInstance.Result == "agree"){foreach (var item in rsp.ProcessInstance.FormComponentValues){if (item.Name == "是否轉批產"){return item.Value;}}}return null;}}
}

5、金蝶插件開發:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Threading;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.Bill.PlugIn.Args;
using Kingdee.BOS.Util;
using Kingdee.BOS.Log;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.App.Data;
using Kingdee.BOS;
using System.Timers;namespace K3Cloud.BasicData.Supply.SupplySendDing
{/// <summary>/// 新增供應商觸發釘釘審批/// </summary>[Description("新增供應商觸發釘釘審批")][HotUpdate]public class SupplySendDingAfterSaveEventBillPlugIn : AbstractBillPlugIn{private string token;private string instanceId;private System.Timers.Timer timer;private string isOk;private string supplierCode; // 保存供應商編碼用于線程中使用public override void AfterSave(AfterSaveEventArgs e){base.AfterSave(e);//是否發送釘釘審批var IsSend = this.Model.DataObject["F_UNW_CheckBox_qtr"].ToString();if (IsSend == "True"){//供應商編碼supplierCode = this.Model.GetValue("FNUMBER").ToString();//供應商名稱var name = this.Model.GetValue("FName").ToString();//創建人姓名DynamicObject creatorId = (DynamicObject)this.Model.GetValue("FCREATORID");var createtorName = creatorId["NAME"].ToString();//供應商分組var fGroup = (DynamicObject)this.Model.DataObject["FGroup"];var fGroupId = fGroup["ID"];var sql = "SELECT FNAME FROM T_BD_SUPPLIERGROUP_L WHERE FID= @fid";var sqlParam = new SqlParam("@fid", KDDbType.Int64, Convert.ToInt64(fGroupId));string fGroupName = "";using (var fReader = DBUtils.ExecuteReader(this.Context, sql, sqlParam)){while (fReader.Read()){fGroupName = fReader["FNAME"].ToString();}}//注冊地址var subEntity = this.View.BillBusinessInfo.GetEntity("FBaseInfo");var subObjs = this.Model.GetEntityDataObject(subEntity);var address = subObjs[0]["RegisterAddress"].ToString();token = DingtalkHelper.GetToken();string uid = DingtalkHelper.GetUserId(token, createtorName);//觸發釘釘流程instanceId = DingtalkStart.StartSupplyNew(token, uid, supplierCode, name, fGroupName, address);Logger.Error("TEST", "釘釘流程發送成功!", new Exception("無錯誤"));//啟動新線程執行定時任務Thread timerThread = new Thread(StartTimerTask);timerThread.IsBackground = true; // 設置為后臺線程timerThread.Start();}}/// <summary>/// 在新線程中啟動定時任務/// </summary>private void StartTimerTask(){try{//1分鐘檢查一次timer = new System.Timers.Timer(60000);timer.Elapsed += TimerElapsed;timer.AutoReset = true;timer.Enabled = true;//循環等待審批結果while (string.IsNullOrEmpty(isOk)){Thread.Sleep(1000); // 減少CPU占用}//處理審批結果if (isOk == "是"){var usql = "UPDATE T_BD_SUPPLIER SET F_UNW_CHECKBOX_83G='1' WHERE FNUMBER=@FNo";var sqlParameterList = new List<SqlParam>{new SqlParam("@FNo", KDDbType.AnsiString, supplierCode)};DBUtils.Execute(this.Context, usql, sqlParameterList);}//清理定時器timer.Stop();timer.Dispose();}catch (Exception ex){Logger.Error("定時任務處理異常", ex.Message, ex);}}private void TimerElapsed(object sender, ElapsedEventArgs e){try{var res = DingtalkGet.GetSupplyNewField(instanceId);if (!string.IsNullOrEmpty(res)){isOk = res;}}catch (Exception ex){Logger.Error("獲取審批結果異常", ex.Message, ex);isOk = "異常"; // 標記異常狀態,退出循環}}}
}

6、將上述代碼編譯成dll文件,并在bos平臺進行注冊,重啟IIS服務。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/922330.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/922330.shtml
英文地址,請注明出處:http://en.pswp.cn/news/922330.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

企業跨區域組網新解:SD-WAN技術打造安全穩定網絡體系

前言在數字化浪潮席卷全球的今天&#xff0c;企業跨區域網絡互聯已成為支撐業務發展的關鍵基礎設施。傳統MPLS專線雖性能穩定&#xff0c;但高昂成本和漫長部署周期令眾多企業望而卻步。SD-WAN技術的出現&#xff0c;正以其智能、靈活和成本效益的優勢&#xff0c;重塑企業組網…

Docker 容器化

引言在解釋docker是什么之前&#xff0c;我們首先應該先了解的是容器化的概念。什么是容器&#xff1f;就是一個沙箱&#xff0c;在這個沙箱中涵蓋了特定應用運行的一切依賴的內容。但他不是一個操作系統&#xff0c;且和底層的操作系統是隔離的。什么是容器化&#xff1f;容器…

LeetCode刷題——hot 100(3)

題目1&#xff1a;矩陣置零題目&#xff1a;問題分析&#xff1a;使用兩個布爾數組來分別記錄哪行哪列出現了0&#xff0c;當出現0的行和列&#xff0c;對應的布爾數組值置為true。再次遍歷數組&#xff0c;當出現行數組和列數組中的值為true&#xff0c;則對應的原數組的值置為…

Ajax-day2(圖書管理)-渲染列表

本篇筆記素材來自“黑馬程序員” 渲染列表圖書管理一、獲取數據二、渲染數據完整代碼圖書管理 Bootstrap 框架渲染列表&#xff08;查&#xff09;新增圖書&#xff08;增&#xff09;刪除圖書&#xff08;刪&#xff09;編輯圖書&#xff08;改&#xff09; 自己的圖書數據&a…

MOS管的電路

MOS管的三極都會存在以下三個電容&#xff0c;分別是&#xff1a;Cgs,Cgd,Cds 輸入電容CissCgsCgd 輸出電容CossCgdCds 反向傳輸電容CrssCgd&#xff0c;也叫米勒電容 然而&#xff0c;這三個等效電容是構成串并聯組合關系&#xff0c;他們并不是獨立的&#xff0c;而是相互…

STM32_05_時鐘樹

時鐘 d用來輸入數據&#xff0c;CLK就是我們的時鐘&#xff0c;CPU1s中72000000HZ個時鐘周期STM32的時鐘樹鎖相環HSE時鐘源HSI時鐘源LSE時鐘源LSI時鐘源SystemInit函數SetSysClock函數SetSysClockTo72函數SystemInit()后時鐘頻率大小總結RCC標準庫函數定義變量a&…

C語言---判斷語句

文章目錄1. if 語句2. if...else 語句3. if...else if...else 語句4. switch 語句5. 三元運算符 ( ? : )總結與對比如何選擇C語言中的判斷語句用于根據給定的條件來決定執行哪一段代碼。其核心是條件為真&#xff08;必須&#xff09;則執行一段代碼&#xff0c;條件為假&…

[硬件電路-212]:電流的本質確實是電子的移動

1. 微觀機制&#xff1a;電子的定向漂移與熱運動定向漂移&#xff08;Drift Motion&#xff09;&#xff1a;在導體&#xff08;如金屬&#xff09;中&#xff0c;自由電子&#xff08;價電子&#xff09;受電場驅動&#xff0c;從負端向正端定向移動&#xff0c;形成宏觀電流。…

雙RFSOC47DR-16通道5GSPS ADC采集模塊

16通道5GSPS ADC采集板卡組成如圖1所示。該板卡的輸入接口為SMA單端輸入&#xff0c;ADC采集和處理采用Xilinx公司的XCZU47DR-2FFVE1156I芯片。板卡需配備4路QSFP28光口輸出&#xff0c;并需要集成網口、DDR4、SD卡、USB調試口。兩塊RF-Soc需確保連接通信功能。板卡的16通道需實…

pytest -- 中文文檔

前言 零基礎1小時快速入門pytest自動化測試教程&#xff0c;全套項目框架實戰pytest配置文件可以改變pytest的運行方式&#xff0c;它是一個固定的文件pytest.ini文件&#xff0c;讀取配置信息&#xff0c;按指定的方式去運行 非test文件 pytest里面有些文件是非test文件 pyt…

硬件開發2-ARM裸機開發3-IMX6ULL - 引入中斷

一、鋪墊引入中斷 → 按鍵1、概要&#xff1a;實現按鍵控制發光二極管和蜂鳴器輸入類型的外設&#xff1a;按鍵&#xff08;key&#xff09;2、參考手冊內容完成配置過程&#xff08;1&#xff09;key 按鍵原理圖&#xff08;2&#xff09;core 內核中命名 -- UART1 CTS&#x…

Ansible的 Playbook 模式詳解

目錄一、Playbook模式1.1 Playbook 的優勢1.2 Playbook 的組成1.3 安裝 httpd 服務案例1.4 Playbook 命令及常用參數1.5 Playbook 的語法 —— 權限相關1. remote_user2. become3. become_method1.6 Playbook 的通知與觸發機制1. notify2. handlers3. 使用示例4. 使用場景1.6 P…

猿輔導Java后臺開發面試題及參考答案

int 與 Integer 的區別是什么&#xff1f;若創建數量龐大的數字時使用 Integer&#xff0c;會對重復數字創建新對象嗎&#xff1f;int 是 Java 中的基本數據類型&#xff0c;直接存儲數值&#xff0c;占用 4 個字節&#xff0c;默認值為 0&#xff0c;不需要通過 new 關鍵字創建…

代碼隨想錄學習摘抄day9(回溯1-11)

一個樸實無華的目錄定義&#xff1a;回溯法也可以叫做回溯搜索法&#xff0c;它是一種搜索的方式。應用場景&#xff1a;回溯法解決的問題都可以抽象為樹形結構代碼模板題型第77題. 組合思路&#xff1a;每次從集合中選取元素&#xff0c;可選擇的范圍隨著選擇的進行而收縮&…

Altium Designer(AD24)打開工程文件的幾種方法

??《專欄目錄》 目錄 1,概述 2,源文件 2,菜單欄 4,工具欄 5,注意事項 1,概述 本文介紹幾種打開工程文件的方法。 2,源文件 找到工程的源文件存儲路徑,找到.PrjPcb的源工程文件,雙擊打開。 2,菜單欄 第1步:執行File→Open, 第2步:找到工程文件的存儲路徑,并選中…

Linux嵌入式自學筆記(基于野火EBF6ULL):2.點燈與ubuntu安裝

一、點燈登錄root&#xff1a;賬號&#xff1a;root ; 密碼&#xff1a;root點燈命令&#xff1a;echo 0 > /sys/class/leds/red/brightness #關閉red燈 echo 0 > /sys/class/leds/blue/brightness #關閉blue燈 echo 0 > /sys/class/leds/green/brightness …

【Java實戰?】Java實戰:MyBatis-Plus 開啟MySQL數據庫高效操作之旅

目錄 一、MyBatis-Plus 環境集成 1.1 項目依賴引入 1.2 數據庫配置 1.3 代碼生成器使用 二、核心 CRUD 操作實現 2.1 基礎查詢 2.2 數據新增與修改 2.3 復雜查詢場景 三、性能優化與高級特性 3.1 緩存配置 3.2 樂觀鎖實現 3.3 字段自動填充 四、實戰案例:用戶管理模塊開發 4.1…

開學季干貨——知識梳理與經驗分享

技術文章大綱&#xff1a;開學季干貨——知識梳理與經驗分享目標受眾分析明確文章面向的學生群體&#xff08;如大學生、高中生&#xff09; 分析不同群體的核心需求&#xff08;課程準備、時間管理、工具使用&#xff09; 結合技術場景&#xff08;如數字筆記、在線協作&#…

Linux《線程(上)》

通過之前的學習我們已經了解了操作系統當中的基本的概念包括進程、基礎IO、磁盤文件存儲等&#xff0c;但是到目前為止我們還未了解到線程相關的概念&#xff0c;這就使得當前我們對操作系統的認知還不是完整的&#xff0c;現在我們是還是無法理解一個進程當中是如何同時的執行…

為什么知識復用時缺乏場景化指導影響實用性

知識復用時因缺乏場景化指導而嚴重影響實用性&#xff0c;其根本原因在于知識的價值本質上根植于其應用情境。脫離了場景的“純知識”往往是抽象、片面且難以行動的。這導致了認知鴻溝的產生、隱性知識的流失、決策風險的增加、以及學習遷移效率的低下。當使用者面對一份缺乏“…