diff --git a/pkg/model/approval_oa.go b/pkg/model/approval_oa.go
index fb547cc..57f89d0 100644
--- a/pkg/model/approval_oa.go
+++ b/pkg/model/approval_oa.go
@@ -233,7 +233,10 @@ func (oa *ApprovalOA) addOtherInfoToModel(in *approval.CreateRequest, a *Approva
 	if v, ok := sonMap[a.ApprovalType.KeyWord]; ok {
 		switch v {
 		case "leave":
+			approvalOA.Leave.ApprovalUsers = make([]ApprovalUser, 0)
 			approvalOA.Leave.ApprovalUsers = a.ApprovalUsers
+
+			approvalOA.Leave.CopyUsers = make([]CopyUser, 0)
 			approvalOA.Leave.CopyUsers = a.CopyUsers
 			if approvalOA.Leave.ApplyType == "" {
 				approvalOA.Leave.ApplyType = a.ApprovalType.KeyWord
diff --git a/pkg/model/approval_oa_test.go b/pkg/model/approval_oa_test.go
new file mode 100644
index 0000000..096d0ed
--- /dev/null
+++ b/pkg/model/approval_oa_test.go
@@ -0,0 +1,555 @@
+package model
+
+import (
+	"github.com/fonchain_enterprise/fonchain-approval/api/approval"
+	"gorm.io/plugin/soft_delete"
+	"reflect"
+	"testing"
+	"time"
+)
+
+func TestApprovalOA_BuildResContent(t *testing.T) {
+	type fields struct {
+		ID         uint64
+		DeletedAt  soft_delete.DeletedAt
+		CreatedAt  time.Time
+		UpdatedAt  time.Time
+		ApprovalID uint64
+		LeaveApply *LeaveApply
+		OutWork    *OutWorkApply
+		MakeUp     *MakeUpApply
+		Turnover   *TurnoverApply
+		OverTime   *OverTimeApply
+		Leave      *Leave
+	}
+	type args struct {
+		a       *Approval
+		request *approval.CreateRequest
+	}
+	tests := []struct {
+		name   string
+		fields fields
+		args   args
+	}{
+		// TODO: Add test cases.
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			oa := &ApprovalOA{
+				ID:         tt.fields.ID,
+				DeletedAt:  tt.fields.DeletedAt,
+				CreatedAt:  tt.fields.CreatedAt,
+				UpdatedAt:  tt.fields.UpdatedAt,
+				ApprovalID: tt.fields.ApprovalID,
+				LeaveApply: tt.fields.LeaveApply,
+				OutWork:    tt.fields.OutWork,
+				MakeUp:     tt.fields.MakeUp,
+				Turnover:   tt.fields.Turnover,
+				OverTime:   tt.fields.OverTime,
+				Leave:      tt.fields.Leave,
+			}
+			oa.BuildResContent(tt.args.a, tt.args.request)
+		})
+	}
+}
+
+func TestApprovalOA_DeleteApproval(t *testing.T) {
+	type fields struct {
+		ID         uint64
+		DeletedAt  soft_delete.DeletedAt
+		CreatedAt  time.Time
+		UpdatedAt  time.Time
+		ApprovalID uint64
+		LeaveApply *LeaveApply
+		OutWork    *OutWorkApply
+		MakeUp     *MakeUpApply
+		Turnover   *TurnoverApply
+		OverTime   *OverTimeApply
+		Leave      *Leave
+	}
+	type args struct {
+		p *Approval
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		wantErr bool
+	}{
+		// TODO: Add test cases.
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			oa := &ApprovalOA{
+				ID:         tt.fields.ID,
+				DeletedAt:  tt.fields.DeletedAt,
+				CreatedAt:  tt.fields.CreatedAt,
+				UpdatedAt:  tt.fields.UpdatedAt,
+				ApprovalID: tt.fields.ApprovalID,
+				LeaveApply: tt.fields.LeaveApply,
+				OutWork:    tt.fields.OutWork,
+				MakeUp:     tt.fields.MakeUp,
+				Turnover:   tt.fields.Turnover,
+				OverTime:   tt.fields.OverTime,
+				Leave:      tt.fields.Leave,
+			}
+			if err := oa.DeleteApproval(tt.args.p); (err != nil) != tt.wantErr {
+				t.Errorf("DeleteApproval() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
+
+func TestApprovalOA_GetApproval(t *testing.T) {
+	type fields struct {
+		ID         uint64
+		DeletedAt  soft_delete.DeletedAt
+		CreatedAt  time.Time
+		UpdatedAt  time.Time
+		ApprovalID uint64
+		LeaveApply *LeaveApply
+		OutWork    *OutWorkApply
+		MakeUp     *MakeUpApply
+		Turnover   *TurnoverApply
+		OverTime   *OverTimeApply
+		Leave      *Leave
+	}
+	type args struct {
+		id uint64
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		want    *Approval
+		wantErr bool
+	}{
+		// TODO: Add test cases.
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			oa := &ApprovalOA{
+				ID:         tt.fields.ID,
+				DeletedAt:  tt.fields.DeletedAt,
+				CreatedAt:  tt.fields.CreatedAt,
+				UpdatedAt:  tt.fields.UpdatedAt,
+				ApprovalID: tt.fields.ApprovalID,
+				LeaveApply: tt.fields.LeaveApply,
+				OutWork:    tt.fields.OutWork,
+				MakeUp:     tt.fields.MakeUp,
+				Turnover:   tt.fields.Turnover,
+				OverTime:   tt.fields.OverTime,
+				Leave:      tt.fields.Leave,
+			}
+			got, err := oa.GetApproval(tt.args.id)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("GetApproval() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("GetApproval() got = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestApprovalOA_SaveApprovalContent(t *testing.T) {
+	type fields struct {
+		ID         uint64
+		DeletedAt  soft_delete.DeletedAt
+		CreatedAt  time.Time
+		UpdatedAt  time.Time
+		ApprovalID uint64
+		LeaveApply *LeaveApply
+		OutWork    *OutWorkApply
+		MakeUp     *MakeUpApply
+		Turnover   *TurnoverApply
+		OverTime   *OverTimeApply
+		Leave      *Leave
+	}
+	type args struct {
+		in *approval.CreateRequest
+		a  *Approval
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		wantErr bool
+	}{
+		{
+			args: args{
+				in: &approval.CreateRequest{
+					ID:             0,
+					Domain:         "",
+					Status:         0,
+					Type:           "",
+					SubmitterID:    40,
+					SubmitterName:  "超级管理员",
+					CopyUsers:      nil,
+					Content:        "",
+					Reply:          "",
+					CanView:        false,
+					ApprovalUsers:  nil,
+					CanApproval:    false,
+					WorkFlows:      nil,
+					AllStatus:      0,
+					NowUserId:      0,
+					NowUserName:    "",
+					Level:          0,
+					NowLevel:       0,
+					CreatedAt:      "",
+					CustomizeInfo:  nil,
+					IsCustom:       0,
+					TypeName:       "",
+					GroupName:      "",
+					BundlePayPrice: nil,
+					ApprovalOA:     nil,
+					FinancialForm:  nil,
+				},
+				a: &Approval{
+					SubmitterID:       40,
+					Status:            0,
+					SubmitterName:     "",
+					CopyUsers:         nil,
+					ApprovalUsers:     nil,
+					Type:              "",
+					Level:             0,
+					NowLevel:          0,
+					NowUserId:         0,
+					NowUserName:       "",
+					Content:           "",
+					ValueJson:         nil,
+					Reply:             "",
+					Domain:            nil,
+					Show:              nil,
+					ApprovalType:      nil,
+					Work:              nil,
+					Bundle:            nil,
+					Exhibition:        nil,
+					BundlePayPrice:    nil,
+					ExhibitionReward:  nil,
+					ApprovalWorkFlows: nil,
+					ApprovalOA:        nil,
+					FinancialForm:     nil,
+				},
+			},
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			oa := &ApprovalOA{
+				ID:         tt.fields.ID,
+				DeletedAt:  tt.fields.DeletedAt,
+				CreatedAt:  tt.fields.CreatedAt,
+				UpdatedAt:  tt.fields.UpdatedAt,
+				ApprovalID: tt.fields.ApprovalID,
+				LeaveApply: tt.fields.LeaveApply,
+				OutWork:    tt.fields.OutWork,
+				MakeUp:     tt.fields.MakeUp,
+				Turnover:   tt.fields.Turnover,
+				OverTime:   tt.fields.OverTime,
+				Leave:      tt.fields.Leave,
+			}
+			if err := oa.SaveApprovalContent(tt.args.in, tt.args.a); (err != nil) != tt.wantErr {
+				t.Errorf("SaveApprovalContent() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
+
+func TestApprovalOA_TableName(t *testing.T) {
+	type fields struct {
+		ID         uint64
+		DeletedAt  soft_delete.DeletedAt
+		CreatedAt  time.Time
+		UpdatedAt  time.Time
+		ApprovalID uint64
+		LeaveApply *LeaveApply
+		OutWork    *OutWorkApply
+		MakeUp     *MakeUpApply
+		Turnover   *TurnoverApply
+		OverTime   *OverTimeApply
+		Leave      *Leave
+	}
+	tests := []struct {
+		name   string
+		fields fields
+		want   string
+	}{
+		// TODO: Add test cases.
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			oa := &ApprovalOA{
+				ID:         tt.fields.ID,
+				DeletedAt:  tt.fields.DeletedAt,
+				CreatedAt:  tt.fields.CreatedAt,
+				UpdatedAt:  tt.fields.UpdatedAt,
+				ApprovalID: tt.fields.ApprovalID,
+				LeaveApply: tt.fields.LeaveApply,
+				OutWork:    tt.fields.OutWork,
+				MakeUp:     tt.fields.MakeUp,
+				Turnover:   tt.fields.Turnover,
+				OverTime:   tt.fields.OverTime,
+				Leave:      tt.fields.Leave,
+			}
+			if got := oa.TableName(); got != tt.want {
+				t.Errorf("TableName() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestApprovalOA_UpdateApprovalContent(t *testing.T) {
+	type fields struct {
+		ID         uint64
+		DeletedAt  soft_delete.DeletedAt
+		CreatedAt  time.Time
+		UpdatedAt  time.Time
+		ApprovalID uint64
+		LeaveApply *LeaveApply
+		OutWork    *OutWorkApply
+		MakeUp     *MakeUpApply
+		Turnover   *TurnoverApply
+		OverTime   *OverTimeApply
+		Leave      *Leave
+	}
+	type args struct {
+		in *approval.CreateRequest
+		a  *Approval
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		wantErr bool
+	}{
+		// TODO: Add test cases.
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			oa := &ApprovalOA{
+				ID:         tt.fields.ID,
+				DeletedAt:  tt.fields.DeletedAt,
+				CreatedAt:  tt.fields.CreatedAt,
+				UpdatedAt:  tt.fields.UpdatedAt,
+				ApprovalID: tt.fields.ApprovalID,
+				LeaveApply: tt.fields.LeaveApply,
+				OutWork:    tt.fields.OutWork,
+				MakeUp:     tt.fields.MakeUp,
+				Turnover:   tt.fields.Turnover,
+				OverTime:   tt.fields.OverTime,
+				Leave:      tt.fields.Leave,
+			}
+			if err := oa.UpdateApprovalContent(tt.args.in, tt.args.a); (err != nil) != tt.wantErr {
+				t.Errorf("UpdateApprovalContent() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
+
+func TestApprovalOA_addOtherInfoToModel(t *testing.T) {
+	type fields struct {
+		ID         uint64
+		DeletedAt  soft_delete.DeletedAt
+		CreatedAt  time.Time
+		UpdatedAt  time.Time
+		ApprovalID uint64
+		LeaveApply *LeaveApply
+		OutWork    *OutWorkApply
+		MakeUp     *MakeUpApply
+		Turnover   *TurnoverApply
+		OverTime   *OverTimeApply
+		Leave      *Leave
+	}
+	type args struct {
+		in         *approval.CreateRequest
+		a          *Approval
+		approvalOA *ApprovalOA
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		wantErr bool
+	}{
+		// TODO: Add test cases.
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			oa := &ApprovalOA{
+				ID:         tt.fields.ID,
+				DeletedAt:  tt.fields.DeletedAt,
+				CreatedAt:  tt.fields.CreatedAt,
+				UpdatedAt:  tt.fields.UpdatedAt,
+				ApprovalID: tt.fields.ApprovalID,
+				LeaveApply: tt.fields.LeaveApply,
+				OutWork:    tt.fields.OutWork,
+				MakeUp:     tt.fields.MakeUp,
+				Turnover:   tt.fields.Turnover,
+				OverTime:   tt.fields.OverTime,
+				Leave:      tt.fields.Leave,
+			}
+			if err := oa.addOtherInfoToModel(tt.args.in, tt.args.a, tt.args.approvalOA); (err != nil) != tt.wantErr {
+				t.Errorf("addOtherInfoToModel() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
+
+func TestApprovalOA_addOtherInfoToRpc(t *testing.T) {
+	type fields struct {
+		ID         uint64
+		DeletedAt  soft_delete.DeletedAt
+		CreatedAt  time.Time
+		UpdatedAt  time.Time
+		ApprovalID uint64
+		LeaveApply *LeaveApply
+		OutWork    *OutWorkApply
+		MakeUp     *MakeUpApply
+		Turnover   *TurnoverApply
+		OverTime   *OverTimeApply
+		Leave      *Leave
+	}
+	type args struct {
+		a  *Approval
+		in *approval.CreateRequest
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		wantErr bool
+	}{
+		// TODO: Add test cases.
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			oa := &ApprovalOA{
+				ID:         tt.fields.ID,
+				DeletedAt:  tt.fields.DeletedAt,
+				CreatedAt:  tt.fields.CreatedAt,
+				UpdatedAt:  tt.fields.UpdatedAt,
+				ApprovalID: tt.fields.ApprovalID,
+				LeaveApply: tt.fields.LeaveApply,
+				OutWork:    tt.fields.OutWork,
+				MakeUp:     tt.fields.MakeUp,
+				Turnover:   tt.fields.Turnover,
+				OverTime:   tt.fields.OverTime,
+				Leave:      tt.fields.Leave,
+			}
+			if err := oa.addOtherInfoToRpc(tt.args.a, tt.args.in); (err != nil) != tt.wantErr {
+				t.Errorf("addOtherInfoToRpc() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
+
+func TestApprovalOA_copyOAToModel(t *testing.T) {
+	type fields struct {
+		ID         uint64
+		DeletedAt  soft_delete.DeletedAt
+		CreatedAt  time.Time
+		UpdatedAt  time.Time
+		ApprovalID uint64
+		LeaveApply *LeaveApply
+		OutWork    *OutWorkApply
+		MakeUp     *MakeUpApply
+		Turnover   *TurnoverApply
+		OverTime   *OverTimeApply
+		Leave      *Leave
+	}
+	type args struct {
+		in *approval.CreateRequest
+		a  *Approval
+	}
+
+	arg := args{}
+	leave := Leave{}
+	leave.ActionTime := make([])
+	arg.in.ApprovalOA.Leave =
+
+	tests := []struct {
+		name           string
+		fields         fields
+		args           args
+		wantApprovalOA *ApprovalOA
+		wantErr        bool
+	}{
+
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			oa := &ApprovalOA{
+				ID:         tt.fields.ID,
+				DeletedAt:  tt.fields.DeletedAt,
+				CreatedAt:  tt.fields.CreatedAt,
+				UpdatedAt:  tt.fields.UpdatedAt,
+				ApprovalID: tt.fields.ApprovalID,
+				LeaveApply: tt.fields.LeaveApply,
+				OutWork:    tt.fields.OutWork,
+				MakeUp:     tt.fields.MakeUp,
+				Turnover:   tt.fields.Turnover,
+				OverTime:   tt.fields.OverTime,
+				Leave:      tt.fields.Leave,
+			}
+			gotApprovalOA, err := oa.copyOAToModel(tt.args.in, tt.args.a)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("copyOAToModel() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if !reflect.DeepEqual(gotApprovalOA, tt.wantApprovalOA) {
+				t.Errorf("copyOAToModel() gotApprovalOA = %v, want %v", gotApprovalOA, tt.wantApprovalOA)
+			}
+		})
+	}
+}
+
+func TestApprovalOA_copyOAToRpc(t *testing.T) {
+	type fields struct {
+		ID         uint64
+		DeletedAt  soft_delete.DeletedAt
+		CreatedAt  time.Time
+		UpdatedAt  time.Time
+		ApprovalID uint64
+		LeaveApply *LeaveApply
+		OutWork    *OutWorkApply
+		MakeUp     *MakeUpApply
+		Turnover   *TurnoverApply
+		OverTime   *OverTimeApply
+		Leave      *Leave
+	}
+	type args struct {
+		a  *Approval
+		in *approval.CreateRequest
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		wantErr bool
+	}{
+		// TODO: Add test cases.
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			oa := &ApprovalOA{
+				ID:         tt.fields.ID,
+				DeletedAt:  tt.fields.DeletedAt,
+				CreatedAt:  tt.fields.CreatedAt,
+				UpdatedAt:  tt.fields.UpdatedAt,
+				ApprovalID: tt.fields.ApprovalID,
+				LeaveApply: tt.fields.LeaveApply,
+				OutWork:    tt.fields.OutWork,
+				MakeUp:     tt.fields.MakeUp,
+				Turnover:   tt.fields.Turnover,
+				OverTime:   tt.fields.OverTime,
+				Leave:      tt.fields.Leave,
+			}
+			if err := oa.copyOAToRpc(tt.args.a, tt.args.in); (err != nil) != tt.wantErr {
+				t.Errorf("copyOAToRpc() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}