ソースを参照

feat:钉钉文件存储接口封装

Cheng Jian 3 年 前
コミット
6d78784d13

+ 4 - 0
opms_libary/go.mod

@@ -4,11 +4,15 @@ go 1.16
 
 require (
 	dashoo.cn/common_definition v0.0.0
+	github.com/alibabacloud-go/dingtalk v1.5.38 // indirect
+	github.com/alibabacloud-go/tea v1.1.19
 	github.com/gogf/gf v1.16.9
 	github.com/mojocn/base64Captcha v1.3.5
+	github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
 	github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475
 	github.com/rpcxio/rpcx-consul v0.0.0-20220730062257-1ff0472e730f
 	github.com/smallnest/rpcx v1.8.0
+	gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect
 )
 
 replace dashoo.cn/common_definition => code.dashoo.cn/dashoo/micro_common_definition.git v0.0.0-20220507071646-3d858a040d5e

+ 14 - 2
opms_libary/go.sum

@@ -19,6 +19,12 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy
 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68 h1:NqugFkGxx1TXSh/pBcU00Y6bljgDPaFdh5MUSeJ7e50=
+github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68/go.mod h1:6pb/Qy8c+lqua8cFpEy7g39NRRqOWc3rOwAy8m5Y2BY=
+github.com/alibabacloud-go/dingtalk v1.5.38 h1:2i8LY8L8eZuI6IeCy6TL8FYmlofQhMO/UmiS7th1zaY=
+github.com/alibabacloud-go/dingtalk v1.5.38/go.mod h1:D/bjJ/zskKHlTm3H3JgmKWoZOXEM+XOOJzdLltSksxg=
+github.com/alibabacloud-go/tea v1.1.19 h1:Xroq0M+pr0mC834Djj3Fl4ZA8+GGoA0i7aWse1vmgf4=
+github.com/alibabacloud-go/tea v1.1.19/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A=
 github.com/alitto/pond v1.8.0 h1:/4wnAU0vOjhsUxOxjtXuNb59oh0J+Jjukf6gtkWpGJk=
 github.com/alitto/pond v1.8.0/go.mod h1:xQn3P/sHTYcU/1BR3i86IGIrilcrGC2LiS+E2+CJWsI=
 github.com/alphadose/itogami v0.0.0-20220705100819-134f04183c42/go.mod h1:QDsatlDSUJB4sXxZsJEpawGnTDwSdvX27ZXqtuZY3WA=
@@ -229,6 +235,8 @@ github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod
 github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU=
 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 github.com/juju/ratelimit v1.0.1 h1:+7AIFJVQ0EQgq/K9+0Krm7m530Du7tIz0METWzN0RgY=
@@ -247,7 +255,6 @@ github.com/klauspost/reedsolomon v1.10.0/go.mod h1:qHMIzMkuZUWqIh8mS/GruPdo3u0qw
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
 github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@@ -303,15 +310,19 @@ github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR
 github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
 github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
 github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
 github.com/mojocn/base64Captcha v1.3.5 h1:Qeilr7Ta6eDtG4S+tQuZ5+hO+QHbiGAJdi4PfoagaA0=
 github.com/mojocn/base64Captcha v1.3.5/go.mod h1:/tTTXn4WTpX9CfrmipqRytCpJ27Uw3G6I7NcP2WwcmY=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
 github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
+github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
+github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
 github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
 github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
@@ -662,8 +673,9 @@ google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
+gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=

+ 2 - 2
opms_libary/micro_srv/micro_srv.go

@@ -5,7 +5,7 @@ import (
 	"dashoo.cn/common_definition/comm_def"
 	"dashoo.cn/opms_libary/dynamic"
 	"dashoo.cn/opms_libary/gtoken"
-	"dashoo.cn/opms_libary/mutipart"
+	"dashoo.cn/opms_libary/multipart"
 	"dashoo.cn/opms_libary/myerrors"
 	"dashoo.cn/opms_libary/request"
 	"encoding/json"
@@ -161,7 +161,7 @@ func streamHandler(conn net.Conn, args *share.StreamServiceArgs) {
 			message := new(dynamic.Message)
 			message.ClassName = className
 			message.MethodName = methodName
-			message.Payload = &mutipart.MultipartFile{FileName: fileName, FileSize: gconv.Int64(fileSize), File: tmpFile}
+			message.Payload = &multipart.MultipartFile{FileName: fileName, FileSize: gconv.Int64(fileSize), File: tmpFile}
 			rsp, err := dynamic.Invoker.HandleInvoker(ctx, message)
 			if err != nil {
 				resp := make(map[string]interface{})

+ 1 - 1
opms_libary/mutipart/file.go → opms_libary/multipart/file.go

@@ -1,4 +1,4 @@
-package mutipart
+package multipart
 
 import "os"
 

+ 47 - 15
opms_libary/plugin/dingtalk/client_test.go

@@ -1,27 +1,59 @@
 package dingtalk
 
 import (
-	"dashoo.cn/common_definition/comm_def"
+	"dashoo.cn/opms_libary/plugin/dingtalk/workflow"
 	"fmt"
-	"github.com/smallnest/rpcx/codec"
+	"github.com/alibabacloud-go/tea/tea"
 	"testing"
 )
 
-func TestSendMsg(t *testing.T) {
+func TestQuerySchemaByProcessCode(t *testing.T) {
 	client := NewClient()
 	w := client.GetWorkflow()
-	//w.GetFormSchema("PROC-7A5F6215-A8CF-4DD1-AB2C-5B1AB84C4E19")
-	w.CreateProcessInstance("47073111989114", "PROC-7A5F6215-A8CF-4DD1-AB2C-5B1AB84C4E19", 435711466)
+	s, _ := w.QuerySchemaByProcessCode("PROC-7A5F6215-A8CF-4DD1-AB2C-5B1AB84C4E19")
+
+	fmt.Println(s)
 }
 
-func TestName(t *testing.T) {
-	data := new(comm_def.CommonMsg)
-	data.Code = 200
-	data.Msg = "成功"
-	data.Data = "111111111"
-	ser := codec.MsgpackCodec{}
-	bt, _ := ser.Encode(data)
-	var reply interface{}
-	err := ser.Decode(bt, &reply)
-	fmt.Println(err)
+func TestStartProcessInstance(t *testing.T) {
+	client := NewClient()
+	w := client.GetWorkflow()
+	//formComponentValues0Details0Details0 := &workflow.StartProcessInstanceRequestFormComponentValuesDetailsDetails{
+	//	Id:            tea.String("PhoneField_IZI2LP8QF6O0"),
+	//	BizAlias:      tea.String("Phone"),
+	//	Name:          tea.String("PhoneField"),
+	//	Value:         tea.String("123xxxxxxxx"),
+	//	ExtValue:      tea.String("总个数:1"),
+	//	ComponentType: tea.String("PhoneField"),
+	//}
+	//formComponentValues0Details0 := &workflow.StartProcessInstanceRequestFormComponentValuesDetails{
+	//	Id:       tea.String("PhoneField_IZI2LP8QF6O0"),
+	//	BizAlias: tea.String("Phone"),
+	//	Name:     tea.String("PhoneField"),
+	//	Value:    tea.String("123xxxxxxxx"),
+	//	ExtValue: tea.String("总个数:1"),
+	//	Details:  []*workflow.StartProcessInstanceRequestFormComponentValuesDetailsDetails{formComponentValues0Details0Details0},
+	//}
+	//表单信息
+	TextField_1RC8GZWYGO4G0 := &workflow.StartProcessInstanceRequestFormComponentValues{
+		Id:    tea.String("TextField_1RC8GZWYGO4G0"),
+		Name:  tea.String("单行输入框"),
+		Value: tea.String("123xxxxxxxx"),
+	}
+
+	DDAttachment_17PC5KQBVEM80 := &workflow.StartProcessInstanceRequestFormComponentValues{
+		Id:    tea.String("DDAttachment_17PC5KQBVEM80"),
+		Name:  tea.String("附件"),
+		Value: tea.String("123xxxxxxxx"),
+	}
+
+	startProcessInstanceRequest := &workflow.StartProcessInstanceRequest{
+		OriginatorUserId:    tea.String("47073111989114"),
+		ProcessCode:         tea.String("PROC-7A5F6215-A8CF-4DD1-AB2C-5B1AB84C4E19"),
+		DeptId:              tea.Int64(435711466),
+		FormComponentValues: []*workflow.StartProcessInstanceRequestFormComponentValues{TextField_1RC8GZWYGO4G0, DDAttachment_17PC5KQBVEM80},
+	}
+	//w.StartProcessInstance("47073111989114", "PROC-7A5F6215-A8CF-4DD1-AB2C-5B1AB84C4E19", 435711466)
+	resp, _ := w.StartProcessInstance(startProcessInstanceRequest)
+	fmt.Println(resp)
 }

+ 48 - 0
opms_libary/plugin/dingtalk/storage/entity.go

@@ -0,0 +1,48 @@
+package storage
+
+import "time"
+
+type QueryFileUploadInfoResponse struct {
+	UploadKey           string `json:"uploadKey"`
+	StorageDriver       string `json:"storageDriver"`
+	Protocol            string `json:"protocol"`
+	HeaderSignatureInfo struct {
+		ResourceUrls []string `json:"resourceUrls"`
+		Headers      struct {
+			Key string `json:"key"`
+		} `json:"headers"`
+		ExpirationSeconds    int      `json:"expirationSeconds"`
+		Region               string   `json:"region"`
+		InternalResourceUrls []string `json:"internalResourceUrls"`
+	} `json:"headerSignatureInfo"`
+}
+
+type CommitFileResponse struct {
+	Dentry struct {
+		Id           string    `json:"id"`
+		SpaceId      string    `json:"spaceId"`
+		ParentId     string    `json:"parentId"`
+		Type         string    `json:"type"`
+		Name         string    `json:"name"`
+		Size         int       `json:"size"`
+		Path         string    `json:"path"`
+		Version      int       `json:"version"`
+		Status       string    `json:"status"`
+		Extension    string    `json:"extension"`
+		CreatorId    string    `json:"creatorId"`
+		ModifierId   string    `json:"modifierId"`
+		CreateTime   time.Time `json:"createTime"`
+		ModifiedTime time.Time `json:"modifiedTime"`
+		Properties   struct {
+			ReadOnly bool `json:"readOnly"`
+		} `json:"properties"`
+		AppProperties []struct {
+			Name       string `json:"name"`
+			Value      string `json:"value"`
+			Visibility string `json:"visibility"`
+		} `json:"appProperties"`
+		Uuid          string `json:"uuid"`
+		PartitionType string `json:"partitionType"`
+		StorageDriver string `json:"storageDriver"`
+	} `json:"dentry"`
+}

+ 42 - 0
opms_libary/plugin/dingtalk/storage/storage.go

@@ -0,0 +1,42 @@
+package storage
+
+import (
+	"dashoo.cn/opms_libary/multipart"
+	"dashoo.cn/opms_libary/plugin/dingtalk/base"
+	"dashoo.cn/opms_libary/plugin/dingtalk/context"
+)
+
+const (
+	FormSchemasUrl     = "/v1.0/workflow/forms/schemas/processCodes"
+	ProcessInstanceUrl = "/v1.0/workflow/processInstances"
+)
+
+//Storage OA审批
+type Storage struct {
+	base.Base
+}
+
+//NewStorage init
+func NewStorage(context *context.Context) *Storage {
+	material := new(Storage)
+	material.Context = context
+	return material
+}
+
+//QueryFileUploadInfo 获取文件上传信息
+func (w *Storage) QueryFileUploadInfo(spaceId, unionId string) (response QueryFileUploadInfoResponse, err error) {
+
+	return response, err
+}
+
+//UploadFile 使用OSS的header加签方式上传文件息
+func (w *Storage) UploadFile(url string, headers map[string]string, file *multipart.MultipartFile) (code int64, err error) {
+
+	return 0, err
+}
+
+//CommitFile 提交文件
+func (w *Storage) CommitFile(uploadKey, filename, parentId string) (response CommitFileResponse, err error) {
+
+	return response, err
+}

+ 165 - 196
opms_libary/plugin/dingtalk/workflow/entity.go

@@ -1,201 +1,111 @@
 package workflow
 
-// Schema 审批流表单信息
-type Schema struct {
-	// 表单类型。
-	AppType *int32 `json:"appType,omitempty" xml:"appType,omitempty"`
-	// 表单应用 uuid 或者 corpId。
-	AppUuid *string `json:"appUuid,omitempty" xml:"appUuid,omitempty"`
-	// 代表表单业务含义的类型。
-	BizType *string `json:"bizType,omitempty" xml:"bizType,omitempty"`
-	// 创建人 userId。
-	CreatorUserId *string `json:"creatorUserId,omitempty" xml:"creatorUserId,omitempty"`
-	// 业务自定义设置数据。
-	CustomSetting *string `json:"customSetting,omitempty" xml:"customSetting,omitempty"`
-	// 引擎类型,表单:0,页面:1
-	EngineType *int32 `json:"engineType,omitempty" xml:"engineType,omitempty"`
-	// 表单的唯一码。
-	FormCode *string `json:"formCode,omitempty" xml:"formCode,omitempty"`
-	// 表单 uuid。
-	FormUuid *string `json:"formUuid,omitempty" xml:"formUuid,omitempty"`
-	// 创建时间的时间戳。
-	GmtCreate *string `json:"gmtCreate,omitempty" xml:"gmtCreate,omitempty"`
-	// 修改时间的时间戳。
-	GmtModified *string `json:"gmtModified,omitempty" xml:"gmtModified,omitempty"`
-	// 图标。
-	Icon *string `json:"icon,omitempty" xml:"icon,omitempty"`
-	// 排序 id。
-	ListOrder *int32 `json:"listOrder,omitempty" xml:"listOrder,omitempty"`
-	// 说明文案。
-	Memo *string `json:"memo,omitempty" xml:"memo,omitempty"`
-	// 表单名称。
-	Name *string `json:"name,omitempty" xml:"name,omitempty"`
-	// 数据归属者的 id 类型。企业(orgId), 群(cid), 人(uid)。
-	OwnerIdType *string `json:"ownerIdType,omitempty" xml:"ownerIdType,omitempty"`
-	// 目标类型: inner, outer, customer。
-	ProcType *string `json:"procType,omitempty" xml:"procType,omitempty"`
-	// 表单 schema 详情。
-	SchemaContent *SchemaContent `json:"schemaContent,omitempty" xml:"schemaContent,omitempty" type:"Struct"`
-	// 状态, PUBLISHED(启用), INVALID(停用), SAVED(草稿)
-	Status *string `json:"status,omitempty" xml:"status,omitempty"`
-	// 可见范围类型。
-	VisibleRange *string `json:"visibleRange,omitempty" xml:"visibleRange,omitempty"`
-}
-
-type SchemaContent struct {
-	// 图标
-	Icon *string `json:"icon,omitempty" xml:"icon,omitempty"`
-	// 控件列表
-	Items []*SchemaContentItems `json:"items,omitempty" xml:"items,omitempty" type:"Repeated"`
-	// 表单名称。
-	Title *string `json:"title,omitempty" xml:"title,omitempty"`
-}
-
-type SchemaContentItems struct {
-	// 子控件列表
-	Children []*SchemaContentItemsChildren `json:"children,omitempty" xml:"children,omitempty" type:"Repeated"`
-	// 控件类型,取值:
-	ComponentName *string `json:"componentName,omitempty" xml:"componentName,omitempty"`
-	// 控件属性。
-	Props *SchemaContentItemsProps `json:"props,omitempty" xml:"props,omitempty" type:"Struct"`
-}
-
-type SchemaContentItemsChildren struct {
-	// 控件类型
-	ComponentName *string `json:"componentName,omitempty" xml:"componentName,omitempty"`
-	// 子控件属性
-	Props *SchemaContentItemsProps `json:"props,omitempty" xml:"props,omitempty" type:"Struct"`
-}
-
-type SchemaContentItemsProps struct {
-	// 加班套件4.0新增 加班明细名称。
-	ActionName *string `json:"actionName,omitempty" xml:"actionName,omitempty"`
-	// textnote的样式,top|middle|bottom。
-	Align *string `json:"align,omitempty" xml:"align,omitempty"`
-	// ISV 微应用 appId,用于ISV身份权限识别,ISV可获得相应数据。
-	AppId *int64 `json:"appId,omitempty" xml:"appId,omitempty"`
-	// 套件是否开启异步获取分条件规则,true:开启;false:不开启。
-	AsyncCondition *bool `json:"asyncCondition,omitempty" xml:"asyncCondition,omitempty"`
-	// 请假、出差、外出、加班类型标签。
-	AttendTypeLabel *string `json:"attendTypeLabel,omitempty" xml:"attendTypeLabel,omitempty"`
-	// 表单关联控件列表。
-	BehaviorLinkage []*SchemaContentItemsPropsBehaviorLinkage `json:"behaviorLinkage,omitempty" xml:"behaviorLinkage,omitempty" type:"Repeated"`
-	// 控件业务自定义别名。
-	BizAlias *string `json:"bizAlias,omitempty" xml:"bizAlias,omitempty"`
-	// 业务套件类型。
-	BizType *string `json:"bizType,omitempty" xml:"bizType,omitempty"`
-	// 套件内子组件可见性
-	ChildFieldVisible map[string]*bool `json:"childFieldVisible,omitempty" xml:"childFieldVisible,omitempty"`
-	// 内部联系人choice,1表示多选,0表示单选。
-	Choice *int32 `json:"choice,omitempty" xml:"choice,omitempty"`
-	// common field的commonBizType。
-	CommonBizType *string `json:"commonBizType,omitempty" xml:"commonBizType,omitempty"`
-	// 是否可编辑。
-	Disabled *bool `json:"disabled,omitempty" xml:"disabled,omitempty"`
-	// 是否自动计算时长。
-	Duration *bool `json:"duration,omitempty" xml:"duration,omitempty"`
-	// 兼容字段。
-	DurationLabel *string `json:"durationLabel,omitempty" xml:"durationLabel,omitempty"`
-	// e签宝专用标识。
-	ESign *bool `json:"eSign,omitempty" xml:"eSign,omitempty"`
-	// 套件值是否打平
-	Extract *bool `json:"extract,omitempty" xml:"extract,omitempty"`
-	// 关联表单中的fields存储
-	FieldsInfo *string `json:"fieldsInfo,omitempty" xml:"fieldsInfo,omitempty"`
-	// 时间格式(DDDateField和DDDateRangeField)。
-	Format *string `json:"format,omitempty" xml:"format,omitempty"`
-	// 公式。
-	Formula *string `json:"formula,omitempty" xml:"formula,omitempty"`
-	// 加班套件4.0新增 加班明细是否隐藏。
-	Hidden *bool `json:"hidden,omitempty" xml:"hidden,omitempty"`
-	// textnote在详情页是否隐藏,true隐藏, false不隐藏
-	HiddenInApprovalDetail *bool `json:"hiddenInApprovalDetail,omitempty" xml:"hiddenInApprovalDetail,omitempty"`
-	// 加班套件4.0新增 加班明细是否隐藏标签。
-	HideLabel *bool `json:"hideLabel,omitempty" xml:"hideLabel,omitempty"`
-	// 兼容出勤套件类型。
-	HolidayOptions []map[string]*string `json:"holidayOptions,omitempty" xml:"holidayOptions,omitempty" type:"Repeated"`
-	// 控件 id。
-	Id *string `json:"id,omitempty" xml:"id,omitempty"`
-	// 控件名称。
-	Label *string `json:"label,omitempty" xml:"label,omitempty"`
-	// label是否可修改 true:不可修改。
-	LabelEditableFreeze *bool `json:"labelEditableFreeze,omitempty" xml:"labelEditableFreeze,omitempty"`
-	// 说明文案的链接地址。
-	Link *string `json:"link,omitempty" xml:"link,omitempty"`
-	// 加班套件4.0新增 加班明细描述。
-	MainTitle *string `json:"mainTitle,omitempty" xml:"mainTitle,omitempty"`
-	// 是否参与打印(1表示不打印, 0表示打印)。
-	NotPrint *string `json:"notPrint,omitempty" xml:"notPrint,omitempty"`
-	// 是否需要大写 默认是需要; 1:不需要大写, 空或者0:需要大写。
-	NotUpper *string `json:"notUpper,omitempty" xml:"notUpper,omitempty"`
-	// 选项内容列表,提供给业务方更多的选择器操作。
-	ObjOptions []*SchemaContentItemsPropsObjOptions `json:"objOptions,omitempty" xml:"objOptions,omitempty" type:"Repeated"`
-	// 单选框选项列表。
-	Options []*string `json:"options,omitempty" xml:"options,omitempty" type:"Repeated"`
-	// 是否有支付属性。
-	PayEnable *bool `json:"payEnable,omitempty" xml:"payEnable,omitempty"`
-	// 占位符。
-	Placeholder *string `json:"placeholder,omitempty" xml:"placeholder,omitempty"`
-	// 同步到考勤, 表示是否设置为员工状态。
-	Push *SchemaContentItemsPropsPush `json:"push,omitempty" xml:"push,omitempty" type:"Struct"`
-	// 推送到考勤, 子类型(DDSelectField)。
-	PushToAttendance *bool `json:"pushToAttendance,omitempty" xml:"pushToAttendance,omitempty"`
-	// 是否推送管理日历(DDDateRangeField, 1表示推送, 0表示不推送, 该属性为兼容保留)。
-	PushToCalendar *int32 `json:"pushToCalendar,omitempty" xml:"pushToCalendar,omitempty"`
-	// 是否必填。
-	Required *bool `json:"required,omitempty" xml:"required,omitempty"`
-	// 必填是否可修改 true:不可修改。
-	RequiredEditableFreeze *bool `json:"requiredEditableFreeze,omitempty" xml:"requiredEditableFreeze,omitempty"`
-	// 兼容出勤套件类型。
-	ShowAttendOptions *bool `json:"showAttendOptions,omitempty" xml:"showAttendOptions,omitempty"`
-	// 是否开启员工状态。
-	StaffStatusEnabled *bool `json:"staffStatusEnabled,omitempty" xml:"staffStatusEnabled,omitempty"`
-	// 需要计算总和的明细组件
-	StatField []*SchemaContentItemsPropsStatField `json:"statField,omitempty" xml:"statField,omitempty" type:"Repeated"`
-	// 数字组件/日期区间组件单位属性。
-	Unit *string `json:"unit,omitempty" xml:"unit,omitempty"`
-	// 是否使用考勤日历。
-	UseCalendar *bool `json:"useCalendar,omitempty" xml:"useCalendar,omitempty"`
-	// 明细打印排版方式 false:横向 true:纵向。
-	VerticalPrint *bool `json:"verticalPrint,omitempty" xml:"verticalPrint,omitempty"`
-}
-
-type SchemaContentItemsPropsBehaviorLinkage struct {
-	// 关联控件列表。
-	Targets []*SchemaContentItemsPropsBehaviorLinkageTargets `json:"targets,omitempty" xml:"targets,omitempty" type:"Repeated"`
-	// 控件值。
-	Value *string `json:"value,omitempty" xml:"value,omitempty"`
-}
-
-type SchemaContentItemsPropsBehaviorLinkageTargets struct {
-	// 行为。
-	Behavior *string `json:"behavior,omitempty" xml:"behavior,omitempty"`
-	// 字段 id。
-	FieldId *string `json:"fieldId,omitempty" xml:"fieldId,omitempty"`
-}
-
-type SchemaContentItemsPropsObjOptions struct {
-	Value *string `json:"value,omitempty" xml:"value,omitempty"`
-}
-
-type SchemaContentItemsPropsPush struct {
-	// 考勤类型(1表示请假, 2表示出差, 3表示加班, 4表示外出)
-	AttendanceRule *int32 `json:"attendanceRule,omitempty" xml:"attendanceRule,omitempty"`
-	// 开启状态(1表示开启, 0表示关闭)
-	PushSwitch *int32 `json:"pushSwitch,omitempty" xml:"pushSwitch,omitempty"`
-	// 状态显示名称
-	PushTag *string `json:"pushTag,omitempty" xml:"pushTag,omitempty"`
-}
-
-type SchemaContentItemsPropsStatField struct {
-	// id 值。
-	Id *string `json:"id,omitempty" xml:"id,omitempty"`
-	// 名称。
-	Label *string `json:"label,omitempty" xml:"label,omitempty"`
-	// 单位。
-	Unit *string `json:"unit,omitempty" xml:"unit,omitempty"`
-	// 大写。
-	Upper *bool `json:"upper,omitempty" xml:"upper,omitempty"`
+// QuerySchemaByProcessCodeResponse 审批流表单信息
+type QuerySchemaByProcessCodeResponse struct {
+	Result struct {
+		CreatorUserId string `json:"creatorUserId"`
+		AppUuid       string `json:"appUuid"`
+		FormCode      string `json:"formCode"`
+		FormUuid      string `json:"formUuid"`
+		Name          string `json:"name"`
+		Memo          string `json:"memo"`
+		OwnerIdType   string `json:"ownerIdType"`
+		SchemaContent struct {
+			Title string `json:"title"`
+			Icon  string `json:"icon"`
+			Items []struct {
+				ComponentName string `json:"componentName"`
+				Props         struct {
+					Id             string   `json:"id"`
+					Label          string   `json:"label"`
+					BizAlias       string   `json:"bizAlias"`
+					Required       bool     `json:"required"`
+					Placeholder    string   `json:"placeholder"`
+					Options        []string `json:"options"`
+					AppId          int      `json:"appId"`
+					DurationLabel  string   `json:"durationLabel"`
+					PushToCalendar int      `json:"pushToCalendar"`
+					Align          string   `json:"align"`
+					StatField      []struct {
+						Id    string `json:"id"`
+						Label string `json:"label"`
+						Upper bool   `json:"upper"`
+						Unit  string `json:"unit"`
+					} `json:"statField"`
+					HideLabel  bool `json:"hideLabel"`
+					ObjOptions []struct {
+						Value string `json:"value"`
+					} `json:"objOptions"`
+					Format              string `json:"format"`
+					PushToAttendance    bool   `json:"pushToAttendance"`
+					LabelEditableFreeze bool   `json:"labelEditableFreeze"`
+					Push                struct {
+						PushSwitch     int    `json:"pushSwitch"`
+						PushTag        string `json:"pushTag"`
+						AttendanceRule int    `json:"attendanceRule"`
+					} `json:"push"`
+					CommonBizType          string `json:"commonBizType"`
+					RequiredEditableFreeze bool   `json:"requiredEditableFreeze"`
+					Unit                   string `json:"unit"`
+					Extract                bool   `json:"extract"`
+					Link                   string `json:"link"`
+					PayEnable              bool   `json:"payEnable"`
+					Hidden                 bool   `json:"hidden"`
+					BizType                string `json:"bizType"`
+					StaffStatusEnabled     bool   `json:"staffStatusEnabled"`
+					ActionName             string `json:"actionName"`
+					AttendTypeLabel        string `json:"attendTypeLabel"`
+					ChildFieldVisible      struct {
+						Key bool `json:"key"`
+					} `json:"childFieldVisible"`
+					NotPrint       string `json:"notPrint"`
+					VerticalPrint  bool   `json:"verticalPrint"`
+					Duration       bool   `json:"duration"`
+					HolidayOptions []struct {
+						Key string `json:"key"`
+					} `json:"holidayOptions"`
+					UseCalendar            bool `json:"useCalendar"`
+					HiddenInApprovalDetail bool `json:"hiddenInApprovalDetail"`
+					Disabled               bool `json:"disabled"`
+					AsyncCondition         bool `json:"asyncCondition"`
+					BehaviorLinkage        []struct {
+						Value   string `json:"value"`
+						Targets []struct {
+							FieldId  string `json:"fieldId"`
+							Behavior string `json:"behavior"`
+						} `json:"targets"`
+					} `json:"behaviorLinkage"`
+					ShowAttendOptions bool   `json:"showAttendOptions"`
+					NotUpper          string `json:"notUpper"`
+					FieldsInfo        string `json:"fieldsInfo"`
+					ESign             bool   `json:"eSign"`
+					MainTitle         string `json:"mainTitle"`
+					Formula           string `json:"formula"`
+					Choice            int    `json:"choice"`
+				} `json:"props"`
+				Children []struct {
+					ComponentName string `json:"componentName"`
+					Props         struct {
+						Id       string `json:"id"`
+						Label    string `json:"label"`
+						BizAlias string `json:"bizAlias"`
+						Required bool   `json:"required"`
+					} `json:"props"`
+				} `json:"children"`
+			} `json:"items"`
+		} `json:"schemaContent"`
+		Icon          string `json:"icon"`
+		AppType       int    `json:"appType"`
+		BizType       string `json:"bizType"`
+		EngineType    int    `json:"engineType"`
+		Status        string `json:"status"`
+		ListOrder     int    `json:"listOrder"`
+		CustomSetting string `json:"customSetting"`
+		ProcType      string `json:"procType"`
+		VisibleRange  string `json:"visibleRange"`
+		GmtCreate     string `json:"gmtCreate"`
+		GmtModified   string `json:"gmtModified"`
+	} `json:"result"`
 }
 
 // StartProcessInstanceRequest 启动审批流
@@ -278,3 +188,62 @@ type StartProcessInstanceRequestFormComponentValuesDetailsDetails struct {
 	// 控件值
 	Value *string `json:"value,omitempty" xml:"value,omitempty"`
 }
+
+// StartProcessInstanceResponse 启动审批流
+type StartProcessInstanceResponse struct {
+	InstanceId string `json:"instanceId"`
+}
+
+type QueryProcessInstanceResponse struct {
+	Result struct {
+		Title              string   `json:"title"`
+		FinishTime         string   `json:"finishTime"`
+		OriginatorUserId   string   `json:"originatorUserId"`
+		OriginatorDeptId   string   `json:"originatorDeptId"`
+		OriginatorDeptName string   `json:"originatorDeptName"`
+		Status             string   `json:"status"`
+		ApproverUserIds    []string `json:"approverUserIds"`
+		CcUserIds          []string `json:"ccUserIds"`
+		Result             string   `json:"result"`
+		BusinessId         string   `json:"businessId"`
+		OperationRecords   []struct {
+			UserId      string `json:"userId"`
+			Date        string `json:"date"`
+			Type        string `json:"type"`
+			Result      string `json:"result"`
+			Remark      string `json:"remark"`
+			Attachments []struct {
+				FileName string `json:"fileName"`
+				FileSize string `json:"fileSize"`
+				FileId   string `json:"fileId"`
+				FileType string `json:"fileType"`
+			} `json:"attachments"`
+			CcUserIds []string `json:"ccUserIds"`
+		} `json:"operationRecords"`
+		Tasks []struct {
+			TaskId            int    `json:"taskId"`
+			UserId            string `json:"userId"`
+			Status            string `json:"status"`
+			Result            string `json:"result"`
+			CreateTime        string `json:"createTime"`
+			FinishTime        string `json:"finishTime"`
+			MobileUrl         string `json:"mobileUrl"`
+			PcUrl             string `json:"pcUrl"`
+			ProcessInstanceId string `json:"processInstanceId"`
+			ActivityId        string `json:"activityId"`
+		} `json:"tasks"`
+		BizAction                  string   `json:"bizAction"`
+		AttachedProcessInstanceIds []string `json:"attachedProcessInstanceIds"`
+		MainProcessInstanceId      string   `json:"mainProcessInstanceId"`
+		FormComponentValues        []struct {
+			Id            string `json:"id"`
+			Name          string `json:"name"`
+			Value         string `json:"value"`
+			ExtValue      string `json:"extValue"`
+			ComponentType string `json:"componentType"`
+			BizAlias      string `json:"bizAlias"`
+		} `json:"formComponentValues"`
+		CreateTime string `json:"createTime"`
+	} `json:"result"`
+	Success string `json:"success"`
+}

+ 27 - 25
opms_libary/plugin/dingtalk/workflow/workflow.go

@@ -3,13 +3,13 @@ package workflow
 import (
 	"dashoo.cn/opms_libary/plugin/dingtalk/base"
 	"dashoo.cn/opms_libary/plugin/dingtalk/context"
+	"encoding/json"
 	"github.com/gogf/gf/frame/g"
-	"github.com/gogf/gf/util/gconv"
 )
 
 const (
-	FormSchemasUrl    = "/v1.0/workflow/forms/schemas/processCodes"
-	CreateInstanceUrl = "/v1.0/workflow/processInstances"
+	FormSchemasUrl     = "/v1.0/workflow/forms/schemas/processCodes"
+	ProcessInstanceUrl = "/v1.0/workflow/processInstances"
 )
 
 //Workflow OA审批
@@ -24,30 +24,32 @@ func NewWorkflow(context *context.Context) *Workflow {
 	return material
 }
 
-//GetFormSchema 获取表单 schema
-func (w *Workflow) GetFormSchema(processCode string) (mediaID string, err error) {
+//QuerySchemaByProcessCode 获取表单 schema
+func (w *Workflow) QuerySchemaByProcessCode(processCode string) (response QuerySchemaByProcessCodeResponse, err error) {
 	resp, _ := w.HTTPGetWithAccessToken(FormSchemasUrl, g.Map{"processCode": processCode})
-	return gconv.String(resp), nil
+	if err != nil {
+		return
+	}
+	err = json.Unmarshal(resp, &response)
+	return response, err
 }
 
-//CreateProcessInstance 发起审批实例
-func (w *Workflow) CreateProcessInstance(originUserId, processCode string, deptId int64) (mediaID string, err error) {
-	inst1 := new(StartProcessInstanceRequest)
-	inst1.OriginatorUserId = &originUserId
-	inst1.ProcessCode = &processCode
-	inst1.DeptId = &deptId
+//StartProcessInstance 发起审批实例
+func (w *Workflow) StartProcessInstance(request *StartProcessInstanceRequest) (response StartProcessInstanceResponse, err error) {
+	resp, _ := w.HTTPPostJSONWithAccessToken(ProcessInstanceUrl, request)
+	if err != nil {
+		return
+	}
+	err = json.Unmarshal(resp, &response)
+	return response, err
+}
 
-	//formComponentValues0 := &StartProcessInstanceRequestFormComponentValues{
-	//	Name:  tea.String("单行输入框"),
-	//	Value: tea.String("22222"),
-	//	Id:    tea.String("TextField-K2AD4O5B"),
-	//}
-	//approvers0 := &StartProcessInstanceRequestApprovers{
-	//	ActionType: tea.String("NONE"),
-	//	UserIds:    []*string{tea.String("47073111989114")},
-	//}
-	//inst1.FormComponentValues = []*StartProcessInstanceRequestFormComponentValues{formComponentValues0}
-	//inst1.Approvers = []*StartProcessInstanceRequestApprovers{approvers0}
-	resp, _ := w.HTTPPostJSONWithAccessToken(CreateInstanceUrl, inst1)
-	return gconv.String(resp), nil
+//QueryProcessInstanceDetail 获取单个审批实例详情
+func (w *Workflow) QueryProcessInstanceDetail(instId string) (response QueryProcessInstanceResponse, err error) {
+	resp, err := w.HTTPGetWithAccessToken(ProcessInstanceUrl, g.Map{"processInstanceId": instId})
+	if err != nil {
+		return
+	}
+	err = json.Unmarshal(resp, &response)
+	return
 }