You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by wa...@apache.org on 2022/10/30 11:15:14 UTC

[incubator-devlake] branch feat-plugin-zentao updated: feat:add zentao task & fix:update stories -> story (#3617)

This is an automated email from the ASF dual-hosted git repository.

warren pushed a commit to branch feat-plugin-zentao
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git


The following commit(s) were added to refs/heads/feat-plugin-zentao by this push:
     new feab0162 feat:add zentao task & fix:update stories -> story (#3617)
feab0162 is described below

commit feab0162694da755a6b5a88f46f06f94155f4bed
Author: txtw <11...@qq.com>
AuthorDate: Sun Oct 30 19:14:58 2022 +0800

    feat:add zentao task & fix:update stories -> story (#3617)
---
 plugins/zentao/impl/impl.go                        |   9 +-
 .../models/archived/{stories.go => story.go}       |  12 +--
 plugins/zentao/models/archived/task.go             | 105 +++++++++++++++++++++
 .../migrationscripts/20220906_add_init_tables.go   |   3 +-
 plugins/zentao/models/{stories.go => story.go}     |  12 +--
 plugins/zentao/models/task.go                      | 105 +++++++++++++++++++++
 plugins/zentao/tasks/bug_convertor.go              |   4 +-
 .../{stories_collector.go => story_collector.go}   |  20 ++--
 .../{stories_convertor.go => story_convertor.go}   |  44 ++++-----
 .../{stories_extractor.go => story_extractor.go}   |  24 ++---
 .../{stories_collector.go => task_collector.go}    |  24 ++---
 .../{stories_convertor.go => task_convertor.go}    |  59 ++++++------
 .../{stories_extractor.go => task_extractor.go}    |  24 ++---
 13 files changed, 329 insertions(+), 116 deletions(-)

diff --git a/plugins/zentao/impl/impl.go b/plugins/zentao/impl/impl.go
index 0289b614..98e200a8 100644
--- a/plugins/zentao/impl/impl.go
+++ b/plugins/zentao/impl/impl.go
@@ -58,12 +58,15 @@ func (plugin Zentao) SubTaskMetas() []core.SubTaskMeta {
 		tasks.CollectExecutionMeta,
 		tasks.ExtractExecutionsMeta,
 		tasks.ConvertExecutionsMeta,
-		tasks.CollectStoriesMeta,
-		tasks.ExtractStoriesMeta,
-		tasks.ConvertStoriesMeta,
+		tasks.CollectStoryMeta,
+		tasks.ExtractStoryMeta,
+		tasks.ConvertStoryMeta,
 		tasks.CollectBugMeta,
 		tasks.ExtractBugMeta,
 		tasks.ConvertBugMeta,
+		tasks.CollectTaskMeta,
+		tasks.ExtractTaskMeta,
+		tasks.ConvertTaskMeta,
 	}
 }
 
diff --git a/plugins/zentao/models/archived/stories.go b/plugins/zentao/models/archived/story.go
similarity index 94%
rename from plugins/zentao/models/archived/stories.go
rename to plugins/zentao/models/archived/story.go
index d197e1fd..48a64bef 100644
--- a/plugins/zentao/models/archived/stories.go
+++ b/plugins/zentao/models/archived/story.go
@@ -22,7 +22,7 @@ import (
 	"github.com/apache/incubator-devlake/plugins/helper"
 )
 
-type ZentaoStories struct {
+type ZentaoStory struct {
 	archived.NoPKModel
 	ConnectionId uint64 `gorm:"primaryKey;type:BIGINT  NOT NULL"`
 	ExecutionId  uint64 `json:"execution_id"`
@@ -88,12 +88,12 @@ type ZentaoStories struct {
 }
 
 type AssignedTo struct {
-	ID       int    `json:"id"`
-	Account  string `json:"account"`
-	Avatar   string `json:"avatar"`
-	Realname string `json:"realname"`
+	AssignedToID       int    `json:"id"`
+	AssignedToAccount  string `json:"account"`
+	AssignedToAvatar   string `json:"avatar"`
+	AssignedToRealname string `json:"realname"`
 }
 
-func (ZentaoStories) TableName() string {
+func (ZentaoStory) TableName() string {
 	return "_tool_zentao_stories"
 }
diff --git a/plugins/zentao/models/archived/task.go b/plugins/zentao/models/archived/task.go
new file mode 100644
index 00000000..1fff6542
--- /dev/null
+++ b/plugins/zentao/models/archived/task.go
@@ -0,0 +1,105 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package archived
+
+import (
+	"github.com/apache/incubator-devlake/models/migrationscripts/archived"
+	"github.com/apache/incubator-devlake/plugins/helper"
+)
+
+type ZentaoTask struct {
+	archived.NoPKModel
+	ConnectionId  uint64 `gorm:"primaryKey;type:BIGINT  NOT NULL"`
+	ExecutionId   uint64 `json:"execution_id"`
+	ID            int    `json:"id" gorm:"primaryKey;type:BIGINT  NOT NULL"`
+	Project       int    `json:"project"`
+	Parent        int    `json:"parent"`
+	Execution     int    `json:"execution"`
+	Module        int    `json:"module"`
+	Design        int    `json:"design"`
+	Story         int    `json:"story"`
+	StoryVersion  int    `json:"storyVersion"`
+	DesignVersion int    `json:"designVersion"`
+	FromBug       int    `json:"fromBug"`
+	Feedback      int    `json:"feedback"`
+	FromIssue     int    `json:"fromIssue"`
+	Name          string `json:"name"`
+	Type          string `json:"type"`
+	Mode          string `json:"mode"`
+	Pri           int    `json:"pri"`
+	Estimate      int    `json:"estimate"`
+	Consumed      int    `json:"consumed"`
+	Left          int    `json:"left"`
+	Deadline      string `json:"deadline"`
+	Status        string `json:"status"`
+	SubStatus     string `json:"subStatus"`
+	Color         string `json:"color"`
+	//Mailto        interface{} `json:"mailto"`
+	Desc               string `json:"desc"`
+	Version            int    `json:"version"`
+	OpenedBy           `json:"openedBy"`
+	OpenedDate         *helper.Iso8601Time `json:"openedDate"`
+	AssignedTo         `json:"assignedTo"`
+	AssignedDate       *helper.Iso8601Time `json:"assignedDate"`
+	EstStarted         string              `json:"estStarted"`
+	RealStarted        *helper.Iso8601Time `json:"realStarted"`
+	FinishedBy         `json:"finishedBy"`
+	FinishedDate       *helper.Iso8601Time `json:"finishedDate"`
+	FinishedList       string              `json:"finishedList"`
+	CanceledBy         `json:"canceledBy"`
+	CanceledDate       *helper.Iso8601Time `json:"canceledDate"`
+	ClosedBy           *helper.Iso8601Time `json:"closedBy"`
+	ClosedDate         *helper.Iso8601Time `json:"closedDate"`
+	PlanDuration       int                 `json:"planDuration"`
+	RealDuration       int                 `json:"realDuration"`
+	ClosedReason       string              `json:"closedReason"`
+	LastEditedBy       `json:"lastEditedBy"`
+	LastEditedDate     *helper.Iso8601Time `json:"lastEditedDate"`
+	ActivatedDate      string              `json:"activatedDate"`
+	Order              int                 `json:"order"`
+	Repo               int                 `json:"repo"`
+	Mr                 int                 `json:"mr"`
+	Entry              string              `json:"entry"`
+	Lines              string              `json:"lines"`
+	V1                 string              `json:"v1"`
+	V2                 string              `json:"v2"`
+	Deleted            bool                `json:"deleted"`
+	Vision             string              `json:"vision"`
+	StoryID            int                 `json:"storyID"`
+	StoryTitle         string              `json:"storyTitle"`
+	Product            int                 `json:"product"`
+	Branch             int                 `json:"branch"`
+	LatestStoryVersion int                 `json:"latestStoryVersion"`
+	StoryStatus        string              `json:"storyStatus"`
+	AssignedToRealName string              `json:"assignedToRealName"`
+	PriOrder           string              `json:"priOrder"`
+	NeedConfirm        bool                `json:"needConfirm"`
+	ProductType        string              `json:"productType"`
+	Progress           int                 `json:"progress"`
+}
+
+type FinishedBy struct {
+	FinishedByID       int    `json:"id"`
+	FinishedByAccount  string `json:"account"`
+	FinishedByAvatar   string `json:"avatar"`
+	FinishedByRealname string `json:"realname"`
+}
+
+func (ZentaoTask) TableName() string {
+	return "_tool_zentao_tasks"
+}
diff --git a/plugins/zentao/models/migrationscripts/20220906_add_init_tables.go b/plugins/zentao/models/migrationscripts/20220906_add_init_tables.go
index 41fc8d94..9d779b61 100644
--- a/plugins/zentao/models/migrationscripts/20220906_add_init_tables.go
+++ b/plugins/zentao/models/migrationscripts/20220906_add_init_tables.go
@@ -31,8 +31,9 @@ func (u *addInitTables) Up(ctx context.Context, db *gorm.DB) errors.Error {
 		archived.ZentaoConnection{},
 		archived.ZentaoProject{},
 		archived.ZentaoExecution{},
-		archived.ZentaoStories{},
+		archived.ZentaoStory{},
 		archived.ZentaoBug{},
+		archived.ZentaoTask{},
 	))
 }
 
diff --git a/plugins/zentao/models/stories.go b/plugins/zentao/models/story.go
similarity index 94%
rename from plugins/zentao/models/stories.go
rename to plugins/zentao/models/story.go
index 1d65c111..9cdb3c63 100644
--- a/plugins/zentao/models/stories.go
+++ b/plugins/zentao/models/story.go
@@ -22,7 +22,7 @@ import (
 	"github.com/apache/incubator-devlake/plugins/helper"
 )
 
-type ZentaoStories struct {
+type ZentaoStory struct {
 	common.NoPKModel
 	ConnectionId uint64 `gorm:"primaryKey;type:BIGINT  NOT NULL"`
 	ExecutionId  uint64 `json:"execution_id"`
@@ -88,12 +88,12 @@ type ZentaoStories struct {
 }
 
 type AssignedTo struct {
-	ID       int    `json:"id"`
-	Account  string `json:"account"`
-	Avatar   string `json:"avatar"`
-	Realname string `json:"realname"`
+	AssignedToID       int    `json:"id"`
+	AssignedToAccount  string `json:"account"`
+	AssignedToAvatar   string `json:"avatar"`
+	AssignedToRealname string `json:"realname"`
 }
 
-func (ZentaoStories) TableName() string {
+func (ZentaoStory) TableName() string {
 	return "_tool_zentao_stories"
 }
diff --git a/plugins/zentao/models/task.go b/plugins/zentao/models/task.go
new file mode 100644
index 00000000..094ce0de
--- /dev/null
+++ b/plugins/zentao/models/task.go
@@ -0,0 +1,105 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package models
+
+import (
+	"github.com/apache/incubator-devlake/models/common"
+	"github.com/apache/incubator-devlake/plugins/helper"
+)
+
+type ZentaoTask struct {
+	common.NoPKModel
+	ConnectionId  uint64 `gorm:"primaryKey;type:BIGINT  NOT NULL"`
+	ExecutionId   uint64 `json:"execution_id"`
+	ID            int    `json:"id" gorm:"primaryKey;type:BIGINT  NOT NULL"`
+	Project       int    `json:"project"`
+	Parent        int    `json:"parent"`
+	Execution     int    `json:"execution"`
+	Module        int    `json:"module"`
+	Design        int    `json:"design"`
+	Story         int    `json:"story"`
+	StoryVersion  int    `json:"storyVersion"`
+	DesignVersion int    `json:"designVersion"`
+	FromBug       int    `json:"fromBug"`
+	Feedback      int    `json:"feedback"`
+	FromIssue     int    `json:"fromIssue"`
+	Name          string `json:"name"`
+	Type          string `json:"type"`
+	Mode          string `json:"mode"`
+	Pri           int    `json:"pri"`
+	Estimate      int    `json:"estimate"`
+	Consumed      int    `json:"consumed"`
+	Left          int    `json:"left"`
+	Deadline      string `json:"deadline"`
+	Status        string `json:"status"`
+	SubStatus     string `json:"subStatus"`
+	Color         string `json:"color"`
+	//Mailto        interface{} `json:"mailto"`
+	Desc               string `json:"desc"`
+	Version            int    `json:"version"`
+	OpenedBy           `json:"openedBy"`
+	OpenedDate         *helper.Iso8601Time `json:"openedDate"`
+	AssignedTo         `json:"assignedTo"`
+	AssignedDate       *helper.Iso8601Time `json:"assignedDate"`
+	EstStarted         string              `json:"estStarted"`
+	RealStarted        *helper.Iso8601Time `json:"realStarted"`
+	FinishedBy         `json:"finishedBy"`
+	FinishedDate       *helper.Iso8601Time `json:"finishedDate"`
+	FinishedList       string              `json:"finishedList"`
+	CanceledBy         `json:"canceledBy"`
+	CanceledDate       *helper.Iso8601Time `json:"canceledDate"`
+	ClosedBy           *helper.Iso8601Time `json:"closedBy"`
+	ClosedDate         *helper.Iso8601Time `json:"closedDate"`
+	PlanDuration       int                 `json:"planDuration"`
+	RealDuration       int                 `json:"realDuration"`
+	ClosedReason       string              `json:"closedReason"`
+	LastEditedBy       `json:"lastEditedBy"`
+	LastEditedDate     *helper.Iso8601Time `json:"lastEditedDate"`
+	ActivatedDate      string              `json:"activatedDate"`
+	Order              int                 `json:"order"`
+	Repo               int                 `json:"repo"`
+	Mr                 int                 `json:"mr"`
+	Entry              string              `json:"entry"`
+	Lines              string              `json:"lines"`
+	V1                 string              `json:"v1"`
+	V2                 string              `json:"v2"`
+	Deleted            bool                `json:"deleted"`
+	Vision             string              `json:"vision"`
+	StoryID            int                 `json:"storyID"`
+	StoryTitle         string              `json:"storyTitle"`
+	Product            int                 `json:"product"`
+	Branch             int                 `json:"branch"`
+	LatestStoryVersion int                 `json:"latestStoryVersion"`
+	StoryStatus        string              `json:"storyStatus"`
+	AssignedToRealName string              `json:"assignedToRealName"`
+	PriOrder           string              `json:"priOrder"`
+	NeedConfirm        bool                `json:"needConfirm"`
+	ProductType        string              `json:"productType"`
+	Progress           int                 `json:"progress"`
+}
+
+type FinishedBy struct {
+	FinishedByID       int    `json:"id"`
+	FinishedByAccount  string `json:"account"`
+	FinishedByAvatar   string `json:"avatar"`
+	FinishedByRealname string `json:"realname"`
+}
+
+func (ZentaoTask) TableName() string {
+	return "_tool_zentao_tasks"
+}
diff --git a/plugins/zentao/tasks/bug_convertor.go b/plugins/zentao/tasks/bug_convertor.go
index 397ff9be..4f179efd 100644
--- a/plugins/zentao/tasks/bug_convertor.go
+++ b/plugins/zentao/tasks/bug_convertor.go
@@ -91,8 +91,8 @@ func ConvertBug(taskCtx core.SubTaskContext) errors.Error {
 				TimeRemainingMinutes:    0,
 				CreatorId:               string(toolBug.OpenedBy.OpenedByID),
 				CreatorName:             toolBug.OpenedBy.OpenedByRealname,
-				AssigneeId:              string(toolBug.AssignedTo.ID),
-				AssigneeName:            toolBug.AssignedTo.Realname,
+				AssigneeId:              string(toolBug.AssignedTo.AssignedToID),
+				AssigneeName:            toolBug.AssignedTo.AssignedToRealname,
 				Severity:                string(toolBug.Severity),
 				Component:               "",
 				DeploymentId:            "",
diff --git a/plugins/zentao/tasks/stories_collector.go b/plugins/zentao/tasks/story_collector.go
similarity index 83%
copy from plugins/zentao/tasks/stories_collector.go
copy to plugins/zentao/tasks/story_collector.go
index 9c85cc53..603b89fd 100644
--- a/plugins/zentao/tasks/stories_collector.go
+++ b/plugins/zentao/tasks/story_collector.go
@@ -28,11 +28,11 @@ import (
 	"net/url"
 )
 
-const RAW_STORIES_TABLE = "zentao_stories"
+const RAW_STORY_TABLE = "zentao_stories"
 
-var _ core.SubTaskEntryPoint = CollectStories
+var _ core.SubTaskEntryPoint = CollectStory
 
-func CollectStories(taskCtx core.SubTaskContext) errors.Error {
+func CollectStory(taskCtx core.SubTaskContext) errors.Error {
 	data := taskCtx.GetData().(*ZentaoTaskData)
 	collector, err := helper.NewApiCollector(helper.ApiCollectorArgs{
 		RawDataSubTaskArgs: helper.RawDataSubTaskArgs{
@@ -42,7 +42,7 @@ func CollectStories(taskCtx core.SubTaskContext) errors.Error {
 				ExecutionId: data.Options.ExecutionId,
 				ProjectId:   data.Options.ProjectId,
 			},
-			Table: RAW_STORIES_TABLE,
+			Table: RAW_STORY_TABLE,
 		},
 		ApiClient:   data.ApiClient,
 		Incremental: false,
@@ -58,7 +58,7 @@ func CollectStories(taskCtx core.SubTaskContext) errors.Error {
 		GetTotalPages: GetTotalPagesFromResponse,
 		ResponseParser: func(res *http.Response) ([]json.RawMessage, errors.Error) {
 			var data struct {
-				Stories []json.RawMessage `json:"stories"`
+				Story []json.RawMessage `json:"stories"`
 			}
 			body, err := io.ReadAll(res.Body)
 			err = json.Unmarshal(body, &data)
@@ -66,7 +66,7 @@ func CollectStories(taskCtx core.SubTaskContext) errors.Error {
 			if err != nil {
 				return nil, errors.Default.Wrap(err, "error reading endpoint response by Zentao story collector")
 			}
-			return data.Stories, nil
+			return data.Story, nil
 		},
 	})
 	if err != nil {
@@ -76,9 +76,9 @@ func CollectStories(taskCtx core.SubTaskContext) errors.Error {
 	return collector.Execute()
 }
 
-var CollectStoriesMeta = core.SubTaskMeta{
-	Name:             "CollectStories",
-	EntryPoint:       CollectStories,
+var CollectStoryMeta = core.SubTaskMeta{
+	Name:             "CollectStory",
+	EntryPoint:       CollectStory,
 	EnabledByDefault: true,
-	Description:      "Collect Stories data from Zentao api",
+	Description:      "Collect Story data from Zentao api",
 }
diff --git a/plugins/zentao/tasks/stories_convertor.go b/plugins/zentao/tasks/story_convertor.go
similarity index 70%
copy from plugins/zentao/tasks/stories_convertor.go
copy to plugins/zentao/tasks/story_convertor.go
index 4b6c160b..867c08a6 100644
--- a/plugins/zentao/tasks/stories_convertor.go
+++ b/plugins/zentao/tasks/story_convertor.go
@@ -29,22 +29,22 @@ import (
 	"reflect"
 )
 
-var _ core.SubTaskEntryPoint = ConvertStories
+var _ core.SubTaskEntryPoint = ConvertStory
 
-var ConvertStoriesMeta = core.SubTaskMeta{
-	Name:             "convertStories",
-	EntryPoint:       ConvertStories,
+var ConvertStoryMeta = core.SubTaskMeta{
+	Name:             "convertStory",
+	EntryPoint:       ConvertStory,
 	EnabledByDefault: true,
-	Description:      "convert Zentao stories",
+	Description:      "convert Zentao story",
 	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
-func ConvertStories(taskCtx core.SubTaskContext) errors.Error {
+func ConvertStory(taskCtx core.SubTaskContext) errors.Error {
 	data := taskCtx.GetData().(*ZentaoTaskData)
 	db := taskCtx.GetDal()
-	boardIdGen := didgen.NewDomainIdGenerator(&models.ZentaoStories{})
+	boardIdGen := didgen.NewDomainIdGenerator(&models.ZentaoStory{})
 	cursor, err := db.Cursor(
-		dal.From(&models.ZentaoStories{}),
+		dal.From(&models.ZentaoStory{}),
 		dal.Where(`_tool_zentao_stories.execution_id = ? and 
 			_tool_zentao_stories.connection_id = ?`, data.Options.ExecutionId, data.Options.ConnectionId),
 	)
@@ -53,7 +53,7 @@ func ConvertStories(taskCtx core.SubTaskContext) errors.Error {
 	}
 	defer cursor.Close()
 	convertor, err := helper.NewDataConverter(helper.DataConverterArgs{
-		InputRowType: reflect.TypeOf(models.ZentaoStories{}),
+		InputRowType: reflect.TypeOf(models.ZentaoStory{}),
 		Input:        cursor,
 		RawDataSubTaskArgs: helper.RawDataSubTaskArgs{
 			Ctx: taskCtx,
@@ -62,38 +62,38 @@ func ConvertStories(taskCtx core.SubTaskContext) errors.Error {
 				ExecutionId: data.Options.ExecutionId,
 				ProjectId:   data.Options.ProjectId,
 			},
-			Table: RAW_STORIES_TABLE,
+			Table: RAW_STORY_TABLE,
 		},
 		Convert: func(inputRow interface{}) ([]interface{}, errors.Error) {
-			toolStories := inputRow.(*models.ZentaoStories)
+			toolStory := inputRow.(*models.ZentaoStory)
 
 			domainBoard := &ticket.Issue{
 				DomainEntity: domainlayer.DomainEntity{
-					Id: boardIdGen.Generate(toolStories.ConnectionId, toolStories.ID),
+					Id: boardIdGen.Generate(toolStory.ConnectionId, toolStory.ID),
 				},
 				Url:      "",
 				IconURL:  "",
 				IssueKey: "",
-				Title:    toolStories.Title,
-				//Description:             toolStories.Spec,
+				Title:    toolStory.Title,
+				//Description:             toolStory.Spec,
 				EpicKey:                 "",
-				Type:                    toolStories.Type,
-				Status:                  toolStories.Status,
+				Type:                    toolStory.Type,
+				Status:                  toolStory.Status,
 				OriginalStatus:          "",
 				StoryPoint:              0,
 				ResolutionDate:          nil,
-				CreatedDate:             toolStories.OpenedDate.ToNullableTime(),
-				UpdatedDate:             toolStories.LastEditedDate.ToNullableTime(),
+				CreatedDate:             toolStory.OpenedDate.ToNullableTime(),
+				UpdatedDate:             toolStory.LastEditedDate.ToNullableTime(),
 				LeadTimeMinutes:         0,
 				ParentIssueId:           "",
 				Priority:                "",
 				OriginalEstimateMinutes: 0,
 				TimeSpentMinutes:        0,
 				TimeRemainingMinutes:    0,
-				CreatorId:               "",
-				CreatorName:             toolStories.OpenedBy.OpenedByRealname,
-				AssigneeId:              "",
-				AssigneeName:            toolStories.AssignedTo.Realname,
+				CreatorId:               string(toolStory.OpenedBy.OpenedByID),
+				CreatorName:             toolStory.OpenedBy.OpenedByRealname,
+				AssigneeId:              string(toolStory.AssignedTo.AssignedToID),
+				AssigneeName:            toolStory.AssignedTo.AssignedToRealname,
 				Severity:                "",
 				Component:               "",
 				DeploymentId:            "",
diff --git a/plugins/zentao/tasks/stories_extractor.go b/plugins/zentao/tasks/story_extractor.go
similarity index 76%
copy from plugins/zentao/tasks/stories_extractor.go
copy to plugins/zentao/tasks/story_extractor.go
index 5c2bc3cf..ae07abc1 100644
--- a/plugins/zentao/tasks/stories_extractor.go
+++ b/plugins/zentao/tasks/story_extractor.go
@@ -25,17 +25,17 @@ import (
 	"github.com/apache/incubator-devlake/plugins/zentao/models"
 )
 
-var _ core.SubTaskEntryPoint = ExtractStories
+var _ core.SubTaskEntryPoint = ExtractStory
 
-var ExtractStoriesMeta = core.SubTaskMeta{
-	Name:             "extractStories",
-	EntryPoint:       ExtractStories,
+var ExtractStoryMeta = core.SubTaskMeta{
+	Name:             "extractStory",
+	EntryPoint:       ExtractStory,
 	EnabledByDefault: true,
-	Description:      "extract Zentao stories",
+	Description:      "extract Zentao story",
 	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
-func ExtractStories(taskCtx core.SubTaskContext) errors.Error {
+func ExtractStory(taskCtx core.SubTaskContext) errors.Error {
 	data := taskCtx.GetData().(*ZentaoTaskData)
 	extractor, err := helper.NewApiExtractor(helper.ApiExtractorArgs{
 		RawDataSubTaskArgs: helper.RawDataSubTaskArgs{
@@ -45,18 +45,18 @@ func ExtractStories(taskCtx core.SubTaskContext) errors.Error {
 				ExecutionId: data.Options.ExecutionId,
 				ProjectId:   data.Options.ProjectId,
 			},
-			Table: RAW_STORIES_TABLE,
+			Table: RAW_STORY_TABLE,
 		},
 		Extract: func(row *helper.RawData) ([]interface{}, errors.Error) {
-			stories := &models.ZentaoStories{}
-			err := json.Unmarshal(row.Data, stories)
+			story := &models.ZentaoStory{}
+			err := json.Unmarshal(row.Data, story)
 			if err != nil {
 				return nil, errors.Default.WrapRaw(err)
 			}
-			stories.ConnectionId = data.Options.ConnectionId
-			stories.ExecutionId = data.Options.ExecutionId
+			story.ConnectionId = data.Options.ConnectionId
+			story.ExecutionId = data.Options.ExecutionId
 			results := make([]interface{}, 0)
-			results = append(results, stories)
+			results = append(results, story)
 			return results, nil
 		},
 	})
diff --git a/plugins/zentao/tasks/stories_collector.go b/plugins/zentao/tasks/task_collector.go
similarity index 80%
rename from plugins/zentao/tasks/stories_collector.go
rename to plugins/zentao/tasks/task_collector.go
index 9c85cc53..8c082d6d 100644
--- a/plugins/zentao/tasks/stories_collector.go
+++ b/plugins/zentao/tasks/task_collector.go
@@ -28,11 +28,11 @@ import (
 	"net/url"
 )
 
-const RAW_STORIES_TABLE = "zentao_stories"
+const RAW_TASK_TABLE = "zentao_tasks"
 
-var _ core.SubTaskEntryPoint = CollectStories
+var _ core.SubTaskEntryPoint = CollectTask
 
-func CollectStories(taskCtx core.SubTaskContext) errors.Error {
+func CollectTask(taskCtx core.SubTaskContext) errors.Error {
 	data := taskCtx.GetData().(*ZentaoTaskData)
 	collector, err := helper.NewApiCollector(helper.ApiCollectorArgs{
 		RawDataSubTaskArgs: helper.RawDataSubTaskArgs{
@@ -42,13 +42,13 @@ func CollectStories(taskCtx core.SubTaskContext) errors.Error {
 				ExecutionId: data.Options.ExecutionId,
 				ProjectId:   data.Options.ProjectId,
 			},
-			Table: RAW_STORIES_TABLE,
+			Table: RAW_TASK_TABLE,
 		},
 		ApiClient:   data.ApiClient,
 		Incremental: false,
 		PageSize:    100,
 		// TODO write which api would you want request
-		UrlTemplate: "/executions/{{ .Params.ExecutionId }}/stories",
+		UrlTemplate: "/executions/{{ .Params.ExecutionId }}/tasks",
 		Query: func(reqData *helper.RequestData) (url.Values, errors.Error) {
 			query := url.Values{}
 			query.Set("page", fmt.Sprintf("%v", reqData.Pager.Page))
@@ -58,15 +58,15 @@ func CollectStories(taskCtx core.SubTaskContext) errors.Error {
 		GetTotalPages: GetTotalPagesFromResponse,
 		ResponseParser: func(res *http.Response) ([]json.RawMessage, errors.Error) {
 			var data struct {
-				Stories []json.RawMessage `json:"stories"`
+				Task []json.RawMessage `json:"tasks"`
 			}
 			body, err := io.ReadAll(res.Body)
 			err = json.Unmarshal(body, &data)
 			res.Body.Close()
 			if err != nil {
-				return nil, errors.Default.Wrap(err, "error reading endpoint response by Zentao story collector")
+				return nil, errors.Default.Wrap(err, "error reading endpoint response by Zentao task collector")
 			}
-			return data.Stories, nil
+			return data.Task, nil
 		},
 	})
 	if err != nil {
@@ -76,9 +76,9 @@ func CollectStories(taskCtx core.SubTaskContext) errors.Error {
 	return collector.Execute()
 }
 
-var CollectStoriesMeta = core.SubTaskMeta{
-	Name:             "CollectStories",
-	EntryPoint:       CollectStories,
+var CollectTaskMeta = core.SubTaskMeta{
+	Name:             "CollectTask",
+	EntryPoint:       CollectTask,
 	EnabledByDefault: true,
-	Description:      "Collect Stories data from Zentao api",
+	Description:      "Collect Task data from Zentao api",
 }
diff --git a/plugins/zentao/tasks/stories_convertor.go b/plugins/zentao/tasks/task_convertor.go
similarity index 62%
rename from plugins/zentao/tasks/stories_convertor.go
rename to plugins/zentao/tasks/task_convertor.go
index 4b6c160b..79d0725c 100644
--- a/plugins/zentao/tasks/stories_convertor.go
+++ b/plugins/zentao/tasks/task_convertor.go
@@ -6,7 +6,7 @@ The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at
 
-    http://www.apache.org/licenses/LICENSE-2.0
+   http://www.apache.org/licenses/LICENSE-2.0
 
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
@@ -29,31 +29,31 @@ import (
 	"reflect"
 )
 
-var _ core.SubTaskEntryPoint = ConvertStories
+var _ core.SubTaskEntryPoint = ConvertTask
 
-var ConvertStoriesMeta = core.SubTaskMeta{
-	Name:             "convertStories",
-	EntryPoint:       ConvertStories,
+var ConvertTaskMeta = core.SubTaskMeta{
+	Name:             "convertTask",
+	EntryPoint:       ConvertTask,
 	EnabledByDefault: true,
-	Description:      "convert Zentao stories",
+	Description:      "convert Zentao task",
 	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
-func ConvertStories(taskCtx core.SubTaskContext) errors.Error {
+func ConvertTask(taskCtx core.SubTaskContext) errors.Error {
 	data := taskCtx.GetData().(*ZentaoTaskData)
 	db := taskCtx.GetDal()
-	boardIdGen := didgen.NewDomainIdGenerator(&models.ZentaoStories{})
+	boardIdGen := didgen.NewDomainIdGenerator(&models.ZentaoTask{})
 	cursor, err := db.Cursor(
-		dal.From(&models.ZentaoStories{}),
-		dal.Where(`_tool_zentao_stories.execution_id = ? and 
-			_tool_zentao_stories.connection_id = ?`, data.Options.ExecutionId, data.Options.ConnectionId),
+		dal.From(&models.ZentaoTask{}),
+		dal.Where(`_tool_zentao_tasks.execution_id = ? and 
+			_tool_zentao_tasks.connection_id = ?`, data.Options.ExecutionId, data.Options.ConnectionId),
 	)
 	if err != nil {
 		return err
 	}
 	defer cursor.Close()
 	convertor, err := helper.NewDataConverter(helper.DataConverterArgs{
-		InputRowType: reflect.TypeOf(models.ZentaoStories{}),
+		InputRowType: reflect.TypeOf(models.ZentaoTask{}),
 		Input:        cursor,
 		RawDataSubTaskArgs: helper.RawDataSubTaskArgs{
 			Ctx: taskCtx,
@@ -62,38 +62,37 @@ func ConvertStories(taskCtx core.SubTaskContext) errors.Error {
 				ExecutionId: data.Options.ExecutionId,
 				ProjectId:   data.Options.ProjectId,
 			},
-			Table: RAW_STORIES_TABLE,
+			Table: RAW_TASK_TABLE,
 		},
 		Convert: func(inputRow interface{}) ([]interface{}, errors.Error) {
-			toolStories := inputRow.(*models.ZentaoStories)
+			toolTask := inputRow.(*models.ZentaoTask)
 
 			domainBoard := &ticket.Issue{
 				DomainEntity: domainlayer.DomainEntity{
-					Id: boardIdGen.Generate(toolStories.ConnectionId, toolStories.ID),
+					Id: boardIdGen.Generate(toolTask.ConnectionId, toolTask.ID),
 				},
-				Url:      "",
-				IconURL:  "",
-				IssueKey: "",
-				Title:    toolStories.Title,
-				//Description:             toolStories.Spec,
+				Url:                     "",
+				IconURL:                 "",
+				IssueKey:                "",
+				Title:                   toolTask.Name,
+				Description:             toolTask.Desc,
 				EpicKey:                 "",
-				Type:                    toolStories.Type,
-				Status:                  toolStories.Status,
+				Type:                    toolTask.Type,
+				Status:                  toolTask.Status,
 				OriginalStatus:          "",
-				StoryPoint:              0,
-				ResolutionDate:          nil,
-				CreatedDate:             toolStories.OpenedDate.ToNullableTime(),
-				UpdatedDate:             toolStories.LastEditedDate.ToNullableTime(),
+				ResolutionDate:          toolTask.FinishedDate.ToNullableTime(),
+				CreatedDate:             toolTask.OpenedDate.ToNullableTime(),
+				UpdatedDate:             toolTask.LastEditedDate.ToNullableTime(),
 				LeadTimeMinutes:         0,
 				ParentIssueId:           "",
 				Priority:                "",
 				OriginalEstimateMinutes: 0,
 				TimeSpentMinutes:        0,
 				TimeRemainingMinutes:    0,
-				CreatorId:               "",
-				CreatorName:             toolStories.OpenedBy.OpenedByRealname,
-				AssigneeId:              "",
-				AssigneeName:            toolStories.AssignedTo.Realname,
+				CreatorId:               string(toolTask.OpenedBy.OpenedByID),
+				CreatorName:             toolTask.OpenedBy.OpenedByRealname,
+				AssigneeId:              string(toolTask.AssignedTo.AssignedToID),
+				AssigneeName:            toolTask.AssignedTo.AssignedToRealname,
 				Severity:                "",
 				Component:               "",
 				DeploymentId:            "",
diff --git a/plugins/zentao/tasks/stories_extractor.go b/plugins/zentao/tasks/task_extractor.go
similarity index 76%
rename from plugins/zentao/tasks/stories_extractor.go
rename to plugins/zentao/tasks/task_extractor.go
index 5c2bc3cf..bee53942 100644
--- a/plugins/zentao/tasks/stories_extractor.go
+++ b/plugins/zentao/tasks/task_extractor.go
@@ -25,17 +25,17 @@ import (
 	"github.com/apache/incubator-devlake/plugins/zentao/models"
 )
 
-var _ core.SubTaskEntryPoint = ExtractStories
+var _ core.SubTaskEntryPoint = ExtractTask
 
-var ExtractStoriesMeta = core.SubTaskMeta{
-	Name:             "extractStories",
-	EntryPoint:       ExtractStories,
+var ExtractTaskMeta = core.SubTaskMeta{
+	Name:             "extractTask",
+	EntryPoint:       ExtractTask,
 	EnabledByDefault: true,
-	Description:      "extract Zentao stories",
+	Description:      "extract Zentao task",
 	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
-func ExtractStories(taskCtx core.SubTaskContext) errors.Error {
+func ExtractTask(taskCtx core.SubTaskContext) errors.Error {
 	data := taskCtx.GetData().(*ZentaoTaskData)
 	extractor, err := helper.NewApiExtractor(helper.ApiExtractorArgs{
 		RawDataSubTaskArgs: helper.RawDataSubTaskArgs{
@@ -45,18 +45,18 @@ func ExtractStories(taskCtx core.SubTaskContext) errors.Error {
 				ExecutionId: data.Options.ExecutionId,
 				ProjectId:   data.Options.ProjectId,
 			},
-			Table: RAW_STORIES_TABLE,
+			Table: RAW_TASK_TABLE,
 		},
 		Extract: func(row *helper.RawData) ([]interface{}, errors.Error) {
-			stories := &models.ZentaoStories{}
-			err := json.Unmarshal(row.Data, stories)
+			task := &models.ZentaoTask{}
+			err := json.Unmarshal(row.Data, task)
 			if err != nil {
 				return nil, errors.Default.WrapRaw(err)
 			}
-			stories.ConnectionId = data.Options.ConnectionId
-			stories.ExecutionId = data.Options.ExecutionId
+			task.ConnectionId = data.Options.ConnectionId
+			task.ExecutionId = data.Options.ExecutionId
 			results := make([]interface{}, 0)
-			results = append(results, stories)
+			results = append(results, task)
 			return results, nil
 		},
 	})