1. 程式人生 > 其它 >釘釘開發之java製作審批表單模板

釘釘開發之java製作審批表單模板

一、目的:學習釘釘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”應用。點選該應用下的編輯按鈕,進入表單設計頁面,可看到表單如下: