釘釘開發之java製作審批表單模板
阿新 • • 發佈:2022-12-12
一、目的:學習釘釘API開發,考慮製作一個出差申請表單模板
二、程式碼:
1、新建獲取token的類Mytoken
package sfccl.api; import com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenResponse; import com.aliyun.tea.TeaException; public class Mytoken { // public static String accessToken; String AppKey = "ding************5"; String AppSecret= "ZM1i*************p"; String accessToken = ""; public static com.aliyun.dingtalkoauth2_1_0.Client createClient() throws Exception { com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config(); config.protocol = "https"; config.regionId = "central";return new com.aliyun.dingtalkoauth2_1_0.Client(config); } public String accessToken() throws Exception { //java.util.List<String> args = java.util.Arrays.asList(args_); com.aliyun.dingtalkoauth2_1_0.Client client = Mytoken.createClient(); com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenRequest getAccessTokenRequest= new com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenRequest() .setAppKey(AppKey) .setAppSecret(AppSecret); try { GetAccessTokenResponse tokenResponse = client.getAccessToken(getAccessTokenRequest); // System.out.println(tokenResponse.body); // System.out.println(tokenResponse.getHeaders()); // System.out.println(tokenResponse.getBody()); System.out.println(tokenResponse.getBody().accessToken); System.out.println(tokenResponse.getBody().expireIn); accessToken = tokenResponse.getBody().accessToken; } catch (TeaException err) { if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) { // err 中含有 code 和 message 屬性,可幫助開發定位問題 System.out.println("TeaException:"+err.message); } } catch (Exception _err) { TeaException err = new TeaException(_err.getMessage(), _err); if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) { // err 中含有 code 和 message 屬性,可幫助開發定位問題 System.out.println("TeaException:" + err.message); } } return accessToken; } }
2、新建類Chuchai_Schema1
package sfccl.api; import com.aliyun.dingtalkworkflow_1_0.models.*; import com.aliyun.tea.TeaException; import com.aliyun.teaopenapi.models.Config; import com.aliyun.teautil.models.RuntimeOptions; public class Chuchai_Schema1 { /** * 使用 Token 初始化賬號Client * @return Client * @throws Exception */ public static com.aliyun.dingtalkworkflow_1_0.Client createClient() throws Exception { Config config = new Config(); config.protocol = "https"; config.regionId = "central"; return new com.aliyun.dingtalkworkflow_1_0.Client(config); } public static void main(String[] args_) throws Exception { java.util.List<String> args = java.util.Arrays.asList(args_); Mytoken mytoken = new Mytoken(); String token = mytoken.accessToken(); com.aliyun.dingtalkworkflow_1_0.Client client = Chuchai_Schema1.createClient(); FormCreateHeaders formCreateHeaders = new FormCreateHeaders(); formCreateHeaders.xAcsDingtalkAccessToken = token; // 1. 明細控制元件 // 1.1. 明細中子控制元件 單行輸入控制元件 FormComponentProps childFormComponentProps1 = new FormComponentProps() .setComponentId("TextField-child-1") .setPlaceholder("請輸入") .setLabel("出差地點") .setRequired(true); FormComponent childFormComponent1 = new FormComponent() .setComponentType("TextField") .setProps(childFormComponentProps1); // 1.2. 明細中子控制元件 圖片控制元件 FormComponentProps childFormComponentProps2 = new FormComponentProps() .setComponentId("DDPhotoField-abcd") .setLabel("圖片"); FormComponent childFormComponent2 = new FormComponent() .setComponentType("DDPhotoField") .setProps(childFormComponentProps2); // 1.3. 明細中子控制元件 數字輸入控制元件 FormComponentProps childFormComponentProps3 = new FormComponentProps() .setComponentId("NumberField-child-1") .setPlaceholder("請輸入") .setLabel("出差次數") // .setUnit("元") .setRequired(true); FormComponent childFormComponent3 = new FormComponent() .setComponentType("NumberField") .setProps(childFormComponentProps3); // 1.3.1 明細中彙總子控制元件數字統計 FormComponentProps.FormComponentPropsStatField statField1 = new FormComponentProps.FormComponentPropsStatField(); statField1.setComponentId("NumberField-child-1"); statField1.setLabel("出差次數"); FormComponentProps formComponentProps1 = new FormComponentProps() .setComponentId("TableField-abcd") .setUpper("0") .setTableViewMode("table") .setLabel("出差明細") .setStatField(java.util.Arrays.asList(statField1)); FormComponent formComponent1 = new FormComponent() .setComponentType("TableField") .setProps(formComponentProps1) .setChildren(java.util.Arrays.asList(childFormComponent1,childFormComponent2,childFormComponent3)); // 2. 單行輸入控制元件 FormComponentProps formComponentProps2 = new FormComponentProps() .setComponentId("TextField-abcd") .setPlaceholder("請輸入") .setLabel("出差人姓名") .setRequired(true); FormComponent formComponent2 = new FormComponent() .setComponentType("TextField") .setProps(formComponentProps2); // 3. 時間區間控制元件 FormComponentProps formComponentProps3 = new FormComponentProps() .setComponentId("DDDateRangeField-abcd") .setPlaceholder("請選擇") .setLabel("[\"開始時間\",\"結束時間\"]") .setUnit("小時") .setFormat("yyyy-MM-dd HH:mm") .setRequired(true); FormComponent formComponent3 = new FormComponent() .setComponentType("DDDateRangeField") .setProps(formComponentProps3); // 4. 數字輸入控制元件 FormComponentProps formComponentProps4 = new FormComponentProps() .setComponentId("NumberField-abcd") .setPlaceholder("請輸入") .setLabel("出差人數") .setUnit("人") .setRequired(true); FormComponent formComponent4 = new FormComponent() .setComponentType("NumberField") .setProps(formComponentProps4); // 5. 金額控制元件 FormComponentProps formComponentProps5 = new FormComponentProps() .setComponentId("MoneyField-abcd") .setUpper("0") .setPlaceholder("請輸入金額") .setLabel("差旅費(元)"); FormComponent formComponent5 = new FormComponent() .setComponentType("MoneyField") .setProps(formComponentProps5); // 6. 單選控制元件 SelectOption option1 = new SelectOption(); option1.setKey("option1"); option1.setValue("A"); SelectOption option2 = new SelectOption(); option2.setKey("option2"); option2.setValue("B"); SelectOption option3 = new SelectOption(); option3.setKey("option3"); option3.setValue("C"); FormComponentProps formComponentProps6 = new FormComponentProps() .setComponentId("DDSelectField-abcd") .setPlaceholder("請選擇") .setLabel("出差同伴") .setBizAlias("staff_type") .setOptions(java.util.Arrays.asList(option1, option2, option3)) .setRequired(true); FormComponent formComponent6 = new FormComponent() .setComponentType("DDSelectField") .setProps(formComponentProps6); // 7. 單行輸入控制元件(交通工具) FormComponentProps formComponentProps7 = new FormComponentProps() .setComponentId("TextField-abce") .setPlaceholder("請輸入") .setLabel("交通工具") .setRequired(true); FormComponent formComponent7 = new FormComponent() .setComponentType("TextField") .setProps(formComponentProps7); // 8. 多行輸入控制元件 FormComponentProps formComponentProps8 = new FormComponentProps() .setComponentId("TextareaField-abcd") .setPlaceholder("請輸入") .setLabel("出差事由") .setRequired(true); FormComponent formComponent8 = new FormComponent() .setComponentType("TextareaField") .setProps(formComponentProps8); FormCreateRequest formCreateRequest = new FormCreateRequest() .setName("出差報銷審批_測試1") .setDescription("用於員工差旅費用報銷使用_模板1") .setFormComponents(java.util.Arrays.asList( formComponent1, formComponent2, formComponent3, formComponent4, formComponent5, formComponent6, formComponent7, formComponent8 )); try { client.formCreateWithOptions(formCreateRequest, formCreateHeaders, new RuntimeOptions()); } catch (TeaException err) { if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) { // err 中含有 code 和 message 屬性,可幫助開發定位問題 System.out.println(err.message); } } catch (Exception _err) { TeaException err = new TeaException(_err.getMessage(), _err); if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) { // err 中含有 code 和 message 屬性,可幫助開發定位問題 System.out.println(err.message); } } } }
三、結果
僅出現“Process finished with exit code 0”提示,則程式執行成功。若出現400等結果提示,則需要查詢原因,很可能時某個控制元件的引數錯誤導致(程式暫時無法直接提示是哪個控制元件出問題)。
點選釘釘app——“更多”——“管理後臺”在彈出的頁面中,點選快捷入口的“OA審批”進入“表單管理”介面的“其他”欄目中,即可看到新增了“出差報銷審批_測試1”應用。點選該應用下的編輯按鈕,進入表單設計頁面,可看到表單如下: