You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by ly...@apache.org on 2025/03/26 01:29:35 UTC

(incubator-devlake) branch main updated: Fix zentao deadline field (#8356)

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

lynwee pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git


The following commit(s) were added to refs/heads/main by this push:
     new 47bc9a8fd Fix zentao deadline field (#8356)
47bc9a8fd is described below

commit 47bc9a8fd155c25ae4b3f307480ec7017ae485f7
Author: Lynwee <15...@qq.com>
AuthorDate: Wed Mar 26 09:29:32 2025 +0800

    Fix zentao deadline field (#8356)
    
    * fix(zentao): fix deadline field
    
    * fix(zentao): fix a typo
    
    * fix(zentao): fix a typo
    
    * fix(zentao): fix e2e test
    
    * fix(zentao): fix e2e test
    
    * refactor(zentao): add some logs
    
    * fix(zentao): fix panic when inserting record to db
    
    * fix(zentao): fix e2e test
---
 backend/helpers/utils/field.go                     |  7 +--
 backend/helpers/utils/field_test.go                | 10 ++--
 backend/plugins/jira/tasks/issue_extractor.go      |  2 +-
 backend/plugins/tapd/tasks/bug_extractor.go        |  2 +-
 backend/plugins/tapd/tasks/story_extractor.go      |  2 +-
 backend/plugins/tapd/tasks/task_extractor.go       |  2 +-
 .../e2e/snapshot_tables/_tool_zentao_bugs.csv      |  4 +-
 .../e2e/snapshot_tables/_tool_zentao_tasks.csv     |  6 +--
 .../_tool_zentao_tasks_for_due_date.csv            |  6 +--
 backend/plugins/zentao/models/bug.go               |  8 +--
 backend/plugins/zentao/models/story.go             |  4 +-
 backend/plugins/zentao/models/task.go              | 58 +++++++++++-----------
 backend/plugins/zentao/tasks/bug_extractor.go      |  5 +-
 backend/plugins/zentao/tasks/story_extractor.go    |  2 +-
 backend/plugins/zentao/tasks/task_extractor.go     |  5 +-
 15 files changed, 63 insertions(+), 60 deletions(-)

diff --git a/backend/helpers/utils/field.go b/backend/helpers/utils/field.go
index f75aa7853..9a6278daf 100644
--- a/backend/helpers/utils/field.go
+++ b/backend/helpers/utils/field.go
@@ -25,7 +25,7 @@ import (
 	"github.com/apache/incubator-devlake/core/models/common"
 )
 
-// GetTimeFeildFromMap retrieves a time field from a map.
+// GetTimeFieldFromMap retrieves a time field from a map.
 // allFields: A map containing all fields.
 // fieldName: The name of the field to retrieve.
 // loc: The timezone location.
@@ -33,7 +33,7 @@ import (
 //
 //	*time.Time: A pointer to the time.Time if the field exists and can be converted to time.Time.
 //	error: An error if the field does not exist or an error occurs.
-func GetTimeFeildFromMap(allFields map[string]interface{}, fieldName string, loc *time.Location) (*time.Time, error) {
+func GetTimeFieldFromMap(allFields map[string]interface{}, fieldName string, loc *time.Location) (*time.Time, error) {
 	val, ok := allFields[fieldName]
 	if !ok {
 		return nil, fmt.Errorf("Field %s not found", fieldName)
@@ -41,7 +41,8 @@ func GetTimeFeildFromMap(allFields map[string]interface{}, fieldName string, loc
 	var temp time.Time
 	switch v := val.(type) {
 	case string:
-		if v == "" || v == "null" {
+		if v == "" || v == "null" || v == "{}" {
+			// In Zentao, the field `deadline`'s value may be "{}".
 			return nil, nil
 		}
 		// If value is a string with the format yyyy-MM-dd, use loc to parse it
diff --git a/backend/helpers/utils/field_test.go b/backend/helpers/utils/field_test.go
index c39a08202..f66ae9cde 100644
--- a/backend/helpers/utils/field_test.go
+++ b/backend/helpers/utils/field_test.go
@@ -124,23 +124,23 @@ func TestGetTimeFeildFromMap(t *testing.T) {
 
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			got, err := GetTimeFeildFromMap(tt.allFields, tt.fieldName, tt.loc)
+			got, err := GetTimeFieldFromMap(tt.allFields, tt.fieldName, tt.loc)
 			if (err != nil) != tt.wantErr {
-				t.Errorf("GetTimeFeildFromMap() error = %v, wantErr %v", err, tt.wantErr)
+				t.Errorf("GetTimeFieldFromMap() error = %v, wantErr %v", err, tt.wantErr)
 				return
 			}
 
 			if tt.wantErr && err.Error() != tt.expectedErr {
-				t.Errorf("GetTimeFeildFromMap() error = %v, expectedErr %v", err, tt.expectedErr)
+				t.Errorf("GetTimeFieldFromMap() error = %v, expectedErr %v", err, tt.expectedErr)
 				return
 			}
 
 			if got != nil && tt.want != nil {
 				if !got.UTC().Equal(tt.want.UTC()) {
-					t.Errorf("GetTimeFeildFromMap() = %v, want %v", got, tt.want)
+					t.Errorf("GetTimeFieldFromMap() = %v, want %v", got, tt.want)
 				}
 			} else if got != tt.want {
-				t.Errorf("GetTimeFeildFromMap() = %v, want %v", got, tt.want)
+				t.Errorf("GetTimeFieldFromMap() = %v, want %v", got, tt.want)
 			}
 		})
 	}
diff --git a/backend/plugins/jira/tasks/issue_extractor.go b/backend/plugins/jira/tasks/issue_extractor.go
index a38387a2a..1980adc2c 100644
--- a/backend/plugins/jira/tasks/issue_extractor.go
+++ b/backend/plugins/jira/tasks/issue_extractor.go
@@ -151,7 +151,7 @@ func extractIssues(data *JiraTaskData, mappings *typeMappings, apiIssue *apiv2mo
 	}
 	// using location of issues.Created
 	loc := issue.Created.Location()
-	issue.DueDate, _ = utils.GetTimeFeildFromMap(apiIssue.Fields.AllFields, dueDateField, loc)
+	issue.DueDate, _ = utils.GetTimeFieldFromMap(apiIssue.Fields.AllFields, dueDateField, loc)
 	// code in next line will set issue.Type to issueType.Name
 	issue.Type = mappings.TypeIdMappings[issue.Type]
 	issue.StdType = mappings.StdTypeMappings[issue.Type]
diff --git a/backend/plugins/tapd/tasks/bug_extractor.go b/backend/plugins/tapd/tasks/bug_extractor.go
index fa0860b9f..43cab73e2 100644
--- a/backend/plugins/tapd/tasks/bug_extractor.go
+++ b/backend/plugins/tapd/tasks/bug_extractor.go
@@ -89,7 +89,7 @@ func ExtractBugs(taskCtx plugin.SubTaskContext) errors.Error {
 				toolL.CurrentOwner = strings.Split(toolL.CurrentOwner, ";")[0]
 			}
 			loc, _ := time.LoadLocation("Asia/Shanghai")
-			toolL.DueDate, _ = utils.GetTimeFeildFromMap(toolL.AllFields, dueDateField, loc)
+			toolL.DueDate, _ = utils.GetTimeFieldFromMap(toolL.AllFields, dueDateField, loc)
 			workSpaceBug := &models.TapdWorkSpaceBug{
 				ConnectionId: data.Options.ConnectionId,
 				WorkspaceId:  toolL.WorkspaceId,
diff --git a/backend/plugins/tapd/tasks/story_extractor.go b/backend/plugins/tapd/tasks/story_extractor.go
index 1ca8242ea..2c384ae06 100644
--- a/backend/plugins/tapd/tasks/story_extractor.go
+++ b/backend/plugins/tapd/tasks/story_extractor.go
@@ -124,7 +124,7 @@ func ExtractStories(taskCtx plugin.SubTaskContext) errors.Error {
 				}
 			}
 			loc, _ := time.LoadLocation("Asia/Shanghai")
-			toolL.DueDate, _ = utils.GetTimeFeildFromMap(toolL.AllFields, dueDateField, loc)
+			toolL.DueDate, _ = utils.GetTimeFieldFromMap(toolL.AllFields, dueDateField, loc)
 			return results, nil
 		},
 	})
diff --git a/backend/plugins/tapd/tasks/task_extractor.go b/backend/plugins/tapd/tasks/task_extractor.go
index 225148c81..11a672751 100644
--- a/backend/plugins/tapd/tasks/task_extractor.go
+++ b/backend/plugins/tapd/tasks/task_extractor.go
@@ -117,7 +117,7 @@ func ExtractTasks(taskCtx plugin.SubTaskContext) errors.Error {
 				}
 			}
 			loc, _ := time.LoadLocation("Asia/Shanghai")
-			toolL.DueDate, _ = utils.GetTimeFeildFromMap(toolL.AllFields, dueDateField, loc)
+			toolL.DueDate, _ = utils.GetTimeFieldFromMap(toolL.AllFields, dueDateField, loc)
 			return results, nil
 		},
 	})
diff --git a/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_bugs.csv b/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_bugs.csv
index 0fc9a4e9c..c472f5864 100644
--- a/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_bugs.csv
+++ b/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_bugs.csv
@@ -4,7 +4,7 @@ connection_id,id,project,product,injection,identify,branch,module,execution,plan
 <p>[期望]正常显示</p>",active,,,0,0,,,,7,测试甲,2012-06-05T02:56:11.000+00:00,主干,4,开发甲,2012-06-05T02:56:11.000+00:00,,0,,,,0,,0,,0,0,0,0,,,,,,,0,0,2021-04-28T03:09:08.000+00:00,0,1,3,0,激活,normal,http://iwater.red:8000/api.php/v1/products/1/bugs?limit=100&page=1,DONE,BUG,
 1,2,1,3,0,0,0,9,1,1,2,1,15,0,0,新闻中心页面问题,hh,3,2,codeerror,",windows",",chrome",,,"<p>[步骤]进入新闻中心</p>
 <p>[结果]页面出现乱码</p>
-<p>[期望]正常显示rew</p>",active,,,1,1,2022-10-05T04:16:44.000+00:00,,1114255335@qq.com,7,测试甲,2012-06-05T02:57:11.000+00:00,主干,0,,2022-10-05T04:19:22.000+00:00,2022-10-05T16:00:00.000+00:00,0,,,,0,,0,,0,0,0,0,,,,,,,1,1,2022-10-05T04:19:22.000+00:00,0,2,3,0,过期Bug,normal,http://iwater.red:8000/api.php/v1/products/1/bugs?limit=100&page=1,DONE,BUG,2022-10-05T16:00:00.000+00:00
+<p>[期望]正常显示rew</p>",active,,,1,1,2022-10-05T04:16:44.000+00:00,,1114255335@qq.com,7,测试甲,2012-06-05T02:57:11.000+00:00,主干,0,,2022-10-05T04:19:22.000+00:00,2022-10-06,0,,,,0,,0,,0,0,0,0,,,,,,,1,1,2022-10-05T04:19:22.000+00:00,0,2,3,0,过期Bug,normal,http://iwater.red:8000/api.php/v1/products/1/bugs?limit=100&page=1,DONE,BUG,2022-10-05T16:00:00.000+00:00
 1,3,1,3,0,0,0,10,1,0,3,2,6,0,0,成果展示页面问题,,3,1,codeerror,,,,,"<p>[步骤]进入成果展示&nbsp;&nbsp;&nbsp;&nbsp;</p>
 <p>[结果]乱码</p>
 <p>[期望]正常显示</p>",active,,,0,0,,,,8,测试乙,2012-06-05T02:58:22.000+00:00,主干,4,开发甲,2012-06-05T02:58:22.000+00:00,,0,,,,0,,0,,0,0,0,0,,,,,,,0,0,2021-04-28T03:09:08.000+00:00,0,1,3,0,激活,normal,http://iwater.red:8000/api.php/v1/products/1/bugs?limit=100&page=1,DONE,BUG,
@@ -16,4 +16,4 @@ connection_id,id,project,product,injection,identify,branch,module,execution,plan
 <p>[期望]正常显示</p>",active,,,0,0,,,,7,测试甲,2012-06-05T02:56:11.000+00:00,主干,4,开发甲,2012-06-05T02:56:11.000+00:00,,0,,,,0,,0,,0,0,0,0,,,,,,,0,0,2021-04-28T03:09:08.000+00:00,0,1,3,0,激活,normal,http://iwater.red:8000/api.php/v1/products/1/bugs?limit=100&page=1,DONE,BUG,
 1,6,1,3,0,0,0,9,1,1,2,1,15,0,0,新闻中心页面问题,hh,3,2,codeerror,",windows",",chrome",,,"<p>[步骤]进入新闻中心</p>
 <p>[结果]页面出现乱码</p>
-<p>[期望]正常显示rew</p>",active,,,1,1,2022-10-05T04:16:44.000+00:00,,1114255335@qq.com,7,测试甲,2012-06-05T02:57:11.000+00:00,主干,0,,2022-10-05T04:19:22.000+00:00,2022-10-05T16:00:00.000+00:00,0,,,,0,,0,,0,0,0,0,,,,,,,1,1,2022-10-05T04:19:22.000+00:00,0,2,3,0,过期Bug,normal,http://iwater.red:8000/api.php/v1/products/1/bugs?limit=100&page=1,DONE,BUG,2022-10-05T16:00:00.000+00:00
+<p>[期望]正常显示rew</p>",active,,,1,1,2022-10-05T04:16:44.000+00:00,,1114255335@qq.com,7,测试甲,2012-06-05T02:57:11.000+00:00,主干,0,,2022-10-05T04:19:22.000+00:00,2022-10-06,0,,,,0,,0,,0,0,0,0,,,,,,,1,1,2022-10-05T04:19:22.000+00:00,0,2,3,0,过期Bug,normal,http://iwater.red:8000/api.php/v1/products/1/bugs?limit=100&page=1,DONE,BUG,2022-10-05T16:00:00.000+00:00
diff --git a/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_tasks.csv b/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_tasks.csv
index de8583f98..270fe00ff 100644
--- a/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_tasks.csv
+++ b/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_tasks.csv
@@ -1,4 +1,4 @@
 connection_id,id,project,parent,execution,module,design,story,story_version,design_version,from_bug,feedback,from_issue,name,type,mode,pri,estimate,consumed,db_left,deadline,status,sub_status,color,description,version,opened_by_id,opened_by_name,opened_date,assigned_to_id,assigned_to_name,assigned_date,est_started,real_started,finished_id,finished_date,finished_list,canceled_id,canceled_date,closed_by_id,closed_date,plan_duration,real_duration,closed_reason,last_edited_id,last_edited_dat [...]
-1,1,1,0,1,0,0,0,1,0,0,0,0,任务名称,devel,,3,0,0,0,2022-09-30T16:00:00.000+00:00,wait,,,任务描述<span> </span><br /><div><br /></div>,1,1,devlake,2022-09-19T01:50:37.000+00:00,5,开发乙,2022-09-19T01:50:37.000+00:00,2022-09-20,,0,,,0,,0,,0,0,,0,,,0,0,0,,,,,0,rnd,0,,0,0,,开发乙,3,0,21.11,http://iwater.red:8000/api.php/v1/executions/9/tasks?limit=100&page=1,IN_PROGRESS,TASK,2022-09-30T16:00:00.000+00:00
-1,2,1,0,9,0,0,0,1,0,0,0,0,任务名称,devel,,3,12.1,2.1,10,2022-09-30T16:00:00.000+00:00,wait,,,任务描述<span> </span><br /><div><br /></div>,1,1,devlake,2022-09-19T01:50:37.000+00:00,5,开发乙,2022-09-19T01:50:37.000+00:00,2022-09-20,,0,,,0,,0,,0,0,,0,,,0,0,0,,,,,0,rnd,0,,0,0,,开发乙,3,0,3,http://iwater.red:8000/api.php/v1/executions/4/tasks?limit=100&page=1,IN_PROGRESS,TASK,2022-09-30T16:00:00.000+00:00
-1,3,1,-1,9,0,0,0,1,0,0,0,0,任务名称,devel,,3,11.2,0,0,2022-09-30T16:00:00.000+00:00,wait,,,任务描述<span> </span><br /><div><br /></div>,1,1,devlake,2022-09-19T01:50:37.000+00:00,5,开发乙,2022-09-19T01:50:37.000+00:00,2022-09-20,,0,,,0,,0,,0,0,,0,,,0,0,0,,,,,0,rnd,0,,0,0,,开发乙,3,0,43.22121,http://iwater.red:8000/api.php/v1/executions/3/tasks?limit=100&page=1,IN_PROGRESS,TASK,2022-09-30T16:00:00.000+00:00
+1,1,1,0,1,0,0,0,1,0,0,0,0,任务名称,devel,,3,0,0,0,2022-10-01,wait,,,任务描述<span> </span><br /><div><br /></div>,1,1,devlake,2022-09-19T01:50:37.000+00:00,5,开发乙,2022-09-19T01:50:37.000+00:00,2022-09-20,,0,,,0,,0,,0,0,,0,,,0,0,0,,,,,0,rnd,0,,0,0,,开发乙,3,0,21.11,http://iwater.red:8000/api.php/v1/executions/9/tasks?limit=100&page=1,IN_PROGRESS,TASK,2022-09-30T16:00:00.000+00:00
+1,2,1,0,9,0,0,0,1,0,0,0,0,任务名称,devel,,3,12.1,2.1,10,2022-10-01,wait,,,任务描述<span> </span><br /><div><br /></div>,1,1,devlake,2022-09-19T01:50:37.000+00:00,5,开发乙,2022-09-19T01:50:37.000+00:00,2022-09-20,,0,,,0,,0,,0,0,,0,,,0,0,0,,,,,0,rnd,0,,0,0,,开发乙,3,0,3,http://iwater.red:8000/api.php/v1/executions/4/tasks?limit=100&page=1,IN_PROGRESS,TASK,2022-09-30T16:00:00.000+00:00
+1,3,1,-1,9,0,0,0,1,0,0,0,0,任务名称,devel,,3,11.2,0,0,2022-10-01,wait,,,任务描述<span> </span><br /><div><br /></div>,1,1,devlake,2022-09-19T01:50:37.000+00:00,5,开发乙,2022-09-19T01:50:37.000+00:00,2022-09-20,,0,,,0,,0,,0,0,,0,,,0,0,0,,,,,0,rnd,0,,0,0,,开发乙,3,0,43.22121,http://iwater.red:8000/api.php/v1/executions/3/tasks?limit=100&page=1,IN_PROGRESS,TASK,2022-09-30T16:00:00.000+00:00
diff --git a/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_tasks_for_due_date.csv b/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_tasks_for_due_date.csv
index 632ffcc4f..4af001050 100644
--- a/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_tasks_for_due_date.csv
+++ b/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_tasks_for_due_date.csv
@@ -1,4 +1,4 @@
 connection_id,id,project,parent,execution,module,design,story,story_version,design_version,from_bug,feedback,from_issue,name,type,mode,pri,estimate,consumed,db_left,deadline,status,sub_status,color,description,version,opened_by_id,opened_by_name,opened_date,assigned_to_id,assigned_to_name,assigned_date,est_started,real_started,finished_id,finished_date,finished_list,canceled_id,canceled_date,closed_by_id,closed_date,plan_duration,real_duration,closed_reason,last_edited_id,last_edited_dat [...]
-1,1,1,0,1,0,0,0,1,0,0,0,0,任务名称,devel,,3,0,0,0,2022-09-30T16:00:00.000+00:00,wait,,,任务描述<span> </span><br /><div><br /></div>,1,1,devlake,2022-09-19T01:50:37.000+00:00,5,开发乙,2022-09-19T01:50:37.000+00:00,2022-09-20,,0,,,0,,0,,0,0,,0,,,0,0,0,,,,,0,rnd,0,,0,0,,开发乙,3,0,21.11,http://iwater.red:8000/api.php/v1/executions/9/tasks?limit=100&page=1,IN_PROGRESS,TASK,
-1,2,1,0,1,0,0,0,1,0,0,0,0,任务名称,devel,,3,12.1,2.1,10,2022-09-30T16:00:00.000+00:00,wait,,,任务描述<span> </span><br /><div><br /></div>,1,1,devlake,2022-09-19T01:50:37.000+00:00,5,开发乙,2022-09-19T01:50:37.000+00:00,2022-09-20,,0,,,0,,0,,0,0,,0,,,0,0,0,,,,,0,rnd,0,,0,0,,开发乙,3,0,3,http://iwater.red:8000/api.php/v1/executions/9/tasks?limit=100&page=1,IN_PROGRESS,TASK,
-1,3,1,-1,1,0,0,0,1,0,0,0,0,任务名称,devel,,3,11.2,0,0,2022-09-30T16:00:00.000+00:00,wait,,,任务描述<span> </span><br /><div><br /></div>,1,1,devlake,2022-09-19T01:50:37.000+00:00,5,开发乙,2022-09-19T01:50:37.000+00:00,2022-09-20,,0,,,0,,0,,0,0,,0,,2025-03-05T13:35:00.000+00:00,0,0,0,,,,,0,rnd,0,,0,0,,开发乙,3,0,43.22121,http://iwater.red:8000/api.php/v1/executions/9/tasks?limit=100&page=1,IN_PROGRESS,TASK,2025-03-05T05:35:00.000+00:00
+1,1,1,0,1,0,0,0,1,0,0,0,0,任务名称,devel,,3,0,0,0,2022-10-01,wait,,,任务描述<span> </span><br /><div><br /></div>,1,1,devlake,2022-09-19T01:50:37.000+00:00,5,开发乙,2022-09-19T01:50:37.000+00:00,2022-09-20,,0,,,0,,0,,0,0,,0,,,0,0,0,,,,,0,rnd,0,,0,0,,开发乙,3,0,21.11,http://iwater.red:8000/api.php/v1/executions/9/tasks?limit=100&page=1,IN_PROGRESS,TASK,
+1,2,1,0,1,0,0,0,1,0,0,0,0,任务名称,devel,,3,12.1,2.1,10,2022-10-01,wait,,,任务描述<span> </span><br /><div><br /></div>,1,1,devlake,2022-09-19T01:50:37.000+00:00,5,开发乙,2022-09-19T01:50:37.000+00:00,2022-09-20,,0,,,0,,0,,0,0,,0,,,0,0,0,,,,,0,rnd,0,,0,0,,开发乙,3,0,3,http://iwater.red:8000/api.php/v1/executions/9/tasks?limit=100&page=1,IN_PROGRESS,TASK,
+1,3,1,-1,1,0,0,0,1,0,0,0,0,任务名称,devel,,3,11.2,0,0,2022-10-01,wait,,,任务描述<span> </span><br /><div><br /></div>,1,1,devlake,2022-09-19T01:50:37.000+00:00,5,开发乙,2022-09-19T01:50:37.000+00:00,2022-09-20,,0,,,0,,0,,0,0,,0,,2025-03-05T13:35:00.000+00:00,0,0,0,,,,,0,rnd,0,,0,0,,开发乙,3,0,43.22121,http://iwater.red:8000/api.php/v1/executions/9/tasks?limit=100&page=1,IN_PROGRESS,TASK,2025-03-05T05:35:00.000+00:00
diff --git a/backend/plugins/zentao/models/bug.go b/backend/plugins/zentao/models/bug.go
index c44cb8f2e..c1db20408 100644
--- a/backend/plugins/zentao/models/bug.go
+++ b/backend/plugins/zentao/models/bug.go
@@ -56,7 +56,7 @@ func (a *ApiAccount) UnmarshalJSON(data []byte) error {
 }
 
 type ZentaoBugRes struct {
-	AllFeilds      map[string]interface{} `json:"-"`
+	AllFields      map[string]interface{} `json:"-"`
 	ID             int64                  `json:"id"`
 	Project        int64                  `json:"project"`
 	Product        int64                  `json:"product"`
@@ -94,7 +94,7 @@ type ZentaoBugRes struct {
 	OpenedBuild    string                 `json:"openedBuild"`
 	AssignedTo     *ApiAccount            `json:"assignedTo"`
 	AssignedDate   *common.Iso8601Time    `json:"assignedDate"`
-	Deadline       *common.CSTTime        `json:"deadline"`
+	Deadline       interface{}            `json:"deadline"`
 	ResolvedBy     *ApiAccount            `json:"resolvedBy"`
 	Resolution     string                 `json:"resolution"`
 	ResolvedBuild  string                 `json:"resolvedBuild"`
@@ -129,7 +129,7 @@ func (i *ZentaoBugRes) SetAllFeilds(raw json.RawMessage) error {
 	if err := json.Unmarshal(raw, &allFeilds); err != nil {
 		return err
 	}
-	i.AllFeilds = allFeilds
+	i.AllFields = allFeilds
 	return nil
 }
 
@@ -175,7 +175,7 @@ type ZentaoBug struct {
 	AssignedToId   int64
 	AssignedToName string
 	AssignedDate   *common.Iso8601Time `json:"assignedDate"`
-	Deadline       *common.CSTTime     `json:"deadline"`
+	Deadline       string              `json:"deadline"`
 	ResolvedById   int64
 	Resolution     string              `json:"resolution"`
 	ResolvedBuild  string              `json:"resolvedBuild"`
diff --git a/backend/plugins/zentao/models/story.go b/backend/plugins/zentao/models/story.go
index 4281cd345..192cd2a0f 100644
--- a/backend/plugins/zentao/models/story.go
+++ b/backend/plugins/zentao/models/story.go
@@ -25,7 +25,7 @@ import (
 )
 
 type ZentaoStoryRes struct {
-	AllFeilds        map[string]interface{} `json:"-"`
+	AllFields        map[string]interface{} `json:"-"`
 	ID               int64                  `json:"id"`
 	Vision           string                 `json:"vision"`
 	Parent           int64                  `json:"parent"`
@@ -87,7 +87,7 @@ func (i *ZentaoStoryRes) SetAllFeilds(raw json.RawMessage) error {
 	if err := json.Unmarshal(raw, &allFeilds); err != nil {
 		return err
 	}
-	i.AllFeilds = allFeilds
+	i.AllFields = allFeilds
 	return nil
 }
 
diff --git a/backend/plugins/zentao/models/task.go b/backend/plugins/zentao/models/task.go
index 34b5d8b9f..c2deff987 100644
--- a/backend/plugins/zentao/models/task.go
+++ b/backend/plugins/zentao/models/task.go
@@ -25,7 +25,7 @@ import (
 )
 
 type ZentaoTaskRes struct {
-	AllFeilds      map[string]interface{} `json:"-"`
+	AllFields      map[string]interface{} `json:"-"`
 	Id             int64                  `json:"id"`
 	Project        int64                  `json:"project"`
 	Parent         int64                  `json:"parent"`
@@ -45,7 +45,7 @@ type ZentaoTaskRes struct {
 	Estimate       float64                `json:"estimate"`
 	Consumed       float64                `json:"consumed"`
 	Left           float64                `json:"left"`
-	Deadline       *common.CSTTime        `json:"deadline"`
+	Deadline       interface{}            `json:"deadline"`
 	Status         string                 `json:"status"`
 	SubStatus      string                 `json:"subStatus"`
 	Color          string                 `json:"color"`
@@ -103,38 +103,38 @@ func (zentaoTaskRes *ZentaoTaskRes) SetAllFeilds(raw json.RawMessage) error {
 	if err := json.Unmarshal(raw, &allFeilds); err != nil {
 		return err
 	}
-	zentaoTaskRes.AllFeilds = allFeilds
+	zentaoTaskRes.AllFields = allFeilds
 	return nil
 }
 
 type ZentaoTask struct {
 	common.NoPKModel
-	ConnectionId       uint64          `gorm:"primaryKey;type:BIGINT  NOT NULL"`
-	ID                 int64           `json:"id" gorm:"primaryKey;type:BIGINT  NOT NULL;autoIncrement:false"`
-	Project            int64           `json:"project"`
-	Parent             int64           `json:"parent"`
-	Execution          int64           `json:"execution"`
-	Module             int             `json:"module"`
-	Design             int             `json:"design"`
-	Story              int64           `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           float64         `json:"estimate"`
-	Consumed           float64         `json:"consumed"`
-	Left               float64         `json:"left" gorm:"column:db_left"`
-	Deadline           *common.CSTTime `json:"deadline"`
-	Status             string          `json:"status"`
-	SubStatus          string          `json:"subStatus"`
-	Color              string          `json:"color"`
-	Description        string          `json:"desc"`
-	Version            int             `json:"version"`
+	ConnectionId       uint64  `gorm:"primaryKey;type:BIGINT  NOT NULL"`
+	ID                 int64   `json:"id" gorm:"primaryKey;type:BIGINT  NOT NULL;autoIncrement:false"`
+	Project            int64   `json:"project"`
+	Parent             int64   `json:"parent"`
+	Execution          int64   `json:"execution"`
+	Module             int     `json:"module"`
+	Design             int     `json:"design"`
+	Story              int64   `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           float64 `json:"estimate"`
+	Consumed           float64 `json:"consumed"`
+	Left               float64 `json:"left" gorm:"column:db_left"`
+	Deadline           string  `json:"deadline"`
+	Status             string  `json:"status"`
+	SubStatus          string  `json:"subStatus"`
+	Color              string  `json:"color"`
+	Description        string  `json:"desc"`
+	Version            int     `json:"version"`
 	OpenedById         int64
 	OpenedByName       string
 	OpenedDate         *common.Iso8601Time `json:"openedDate"`
diff --git a/backend/plugins/zentao/tasks/bug_extractor.go b/backend/plugins/zentao/tasks/bug_extractor.go
index b71cf5172..d79a7be49 100644
--- a/backend/plugins/zentao/tasks/bug_extractor.go
+++ b/backend/plugins/zentao/tasks/bug_extractor.go
@@ -19,6 +19,7 @@ package tasks
 
 import (
 	"encoding/json"
+	"github.com/spf13/cast"
 	"time"
 
 	"github.com/apache/incubator-devlake/core/errors"
@@ -104,7 +105,7 @@ func ExtractBug(taskCtx plugin.SubTaskContext) errors.Error {
 				AssignedToId:   data.AccountCache.getAccountIDFromApiAccount(res.AssignedTo),
 				AssignedToName: data.AccountCache.getAccountNameFromApiAccount(res.AssignedTo),
 				AssignedDate:   res.AssignedDate,
-				Deadline:       res.Deadline,
+				Deadline:       cast.ToString(res.Deadline),
 				ResolvedById:   data.AccountCache.getAccountIDFromApiAccount(res.ResolvedBy),
 				Resolution:     res.Resolution,
 				ResolvedBuild:  res.ResolvedBuild,
@@ -135,7 +136,7 @@ func ExtractBug(taskCtx plugin.SubTaskContext) errors.Error {
 				Url:            row.Url,
 			}
 			loc, _ := time.LoadLocation("Asia/Shanghai")
-			bug.DueDate, _ = utils.GetTimeFeildFromMap(res.AllFeilds, dueDateField, loc)
+			bug.DueDate, _ = utils.GetTimeFieldFromMap(res.AllFields, dueDateField, loc)
 			switch bug.Status {
 			case "active", "closed", "resolved":
 			default:
diff --git a/backend/plugins/zentao/tasks/story_extractor.go b/backend/plugins/zentao/tasks/story_extractor.go
index 72ee2a863..d09c1935a 100644
--- a/backend/plugins/zentao/tasks/story_extractor.go
+++ b/backend/plugins/zentao/tasks/story_extractor.go
@@ -136,7 +136,7 @@ func ExtractStory(taskCtx plugin.SubTaskContext) errors.Error {
 					return nil, errors.Default.WrapRaw(err)
 				}
 				loc, _ := time.LoadLocation("Asia/Shanghai")
-				story.DueDate, _ = helpers.GetTimeFeildFromMap(res.AllFeilds, dueDateField, loc)
+				story.DueDate, _ = helpers.GetTimeFieldFromMap(res.AllFields, dueDateField, loc)
 			}
 			if story.StdType == "" {
 				story.StdType = ticket.REQUIREMENT
diff --git a/backend/plugins/zentao/tasks/task_extractor.go b/backend/plugins/zentao/tasks/task_extractor.go
index c18ed644b..77d2af56e 100644
--- a/backend/plugins/zentao/tasks/task_extractor.go
+++ b/backend/plugins/zentao/tasks/task_extractor.go
@@ -19,6 +19,7 @@ package tasks
 
 import (
 	"encoding/json"
+	"github.com/spf13/cast"
 	"time"
 
 	"github.com/apache/incubator-devlake/core/errors"
@@ -116,7 +117,7 @@ func (c *taskExtractor) toZentaoTasks(accountCache *AccountCache, res *models.Ze
 		Estimate:           res.Estimate,
 		Consumed:           res.Consumed,
 		Left:               res.Left,
-		Deadline:           res.Deadline,
+		Deadline:           cast.ToString(res.Deadline),
 		Status:             res.Status,
 		SubStatus:          res.SubStatus,
 		Color:              res.Color,
@@ -162,7 +163,7 @@ func (c *taskExtractor) toZentaoTasks(accountCache *AccountCache, res *models.Ze
 	}
 
 	loc, _ := time.LoadLocation("Asia/Shanghai")
-	task.DueDate, _ = utils.GetTimeFeildFromMap(res.AllFeilds, dueDateField, loc)
+	task.DueDate, _ = utils.GetTimeFieldFromMap(res.AllFields, dueDateField, loc)
 	if task.StdType == "" {
 		task.StdType = ticket.TASK
 	}