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 <[email protected]>
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,,[email protected],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,,[email protected],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,,[email protected],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,,[email protected],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
        }

Reply via email to