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/18 08:51:27 UTC
(incubator-devlake) branch main updated: feat: add DueDate field to Issue model and migration script (#8316)
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 7d9d49119 feat: add DueDate field to Issue model and migration script (#8316)
7d9d49119 is described below
commit 7d9d49119713800f7a167db236c688323fa5f790
Author: NaRro <co...@merico.dev>
AuthorDate: Tue Mar 18 16:51:22 2025 +0800
feat: add DueDate field to Issue model and migration script (#8316)
* feat: add DueDate field to Issue model and migration script
* feat: convert issues.DueDate from multi plugins
* test: add e2e test for due date field
* feat: support customize due date field in jira plugin
* feat: enhance due date handling in TAPD plugin with customizable fields
#8315
* feat: add due date fields to scope config for Jira, TAPD, and Zentao plugins
#8315
* fix: handle errors in SetAllFields method for TAPD bug, story, and task extractors
#8315
* feat: refactor due date field handling in TAPD bug, story, and task extractors
- get due date field option before extract loop
* feat: add customizable due date field handling in Zentao bug, story, and task extractors
* test: add customize due date test cases for Zentao plugin
* refactor: streamline due date handling across TAPD and Zentao extractors
* fix: add due_date to tool layer issue table in jira, tapd and zentao
---
backend/core/models/common/iso8601time.go | 14 ++
backend/core/models/common/iso8601time_test.go | 82 ++++++++++
backend/core/models/domainlayer/ticket/issue.go | 1 +
.../20250303_add_due_date_to_issues.go} | 41 +++--
backend/core/models/migrationscripts/register.go | 1 +
backend/helpers/utils/field.go | 62 ++++++++
backend/helpers/utils/field_test.go | 147 +++++++++++++++++
backend/plugins/jira/e2e/issue_test.go | 142 +++++++++++++++++
.../jira/e2e/raw_tables/_raw_jira_api_issues.csv | 2 +-
.../_raw_jira_api_issues_for_due_date.csv | 2 +
.../jira/e2e/snapshot_tables/_tool_jira_issues.csv | 62 ++++----
.../_tool_jira_issues_for_due_date.csv | 2 +
.../plugins/jira/e2e/snapshot_tables/issues.csv | 62 ++++----
.../e2e/snapshot_tables/issues_for_due_date.csv | 2 +
backend/plugins/jira/models/issue.go | 1 +
.../20250305_add_due_date_config.go | 60 +++++++
.../jira/models/migrationscripts/register.go | 1 +
backend/plugins/jira/models/scope_config.go | 1 +
backend/plugins/jira/tasks/apiv2models/issue.go | 2 +-
backend/plugins/jira/tasks/issue_convertor.go | 1 +
backend/plugins/jira/tasks/issue_extractor.go | 10 +-
backend/plugins/tapd/e2e/bugs_test.go | 71 ++++++++-
.../tapd/e2e/raw_tables/_raw_tapd_api_bugs.csv | 2 +-
.../raw_tables/_raw_tapd_api_bugs_for_due_date.csv | 2 +
.../_raw_tapd_api_stories_for_due_date.csv | 2 +
.../_raw_tapd_api_tasks_for_due_date.csv | 2 +
.../tapd/e2e/snapshot_tables/_tool_tapd_bugs.csv | 42 ++---
.../_tool_tapd_bugs_for_due_date.csv | 2 +
.../e2e/snapshot_tables/_tool_tapd_stories.csv | 42 ++---
.../_tool_tapd_stories_for_due_date.csv | 2 +
.../tapd/e2e/snapshot_tables/_tool_tapd_tasks.csv | 32 ++--
.../_tool_tapd_tasks_for_due_date.csv | 2 +
.../{issue_bug.csv => issues_bug.csv} | 42 ++---
.../snapshot_tables/issues_bug_for_due_date.csv | 2 +
.../tapd/e2e/snapshot_tables/issues_story.csv | 42 ++---
.../snapshot_tables/issues_story_for_due_date.csv | 2 +
.../tapd/e2e/snapshot_tables/issues_task.csv | 32 ++--
.../snapshot_tables/issues_task_for_due_date.csv | 2 +
backend/plugins/tapd/e2e/stories_test.go | 37 +++++
backend/plugins/tapd/e2e/tasks_test.go | 36 +++++
backend/plugins/tapd/models/bug.go | 47 ++++--
.../20250305_update_scope_config.go | 80 ++++++++++
.../tapd/models/migrationscripts/register.go | 1 +
backend/plugins/tapd/models/scope_config.go | 3 +
backend/plugins/tapd/models/story.go | 101 +++++++-----
backend/plugins/tapd/models/task.go | 71 +++++----
backend/plugins/tapd/tasks/bug_converter.go | 1 +
backend/plugins/tapd/tasks/bug_extractor.go | 17 +-
backend/plugins/tapd/tasks/story_converter.go | 1 +
backend/plugins/tapd/tasks/story_extractor.go | 16 +-
backend/plugins/tapd/tasks/task_converter.go | 1 +
backend/plugins/tapd/tasks/task_extractor.go | 17 +-
backend/plugins/zentao/e2e/bug_test.go | 45 ++++++
.../_raw_zentao_api_bugs_for_due_date.csv | 2 +
.../_raw_zentao_api_stories_for_due_date.csv | 2 +
.../_raw_zentao_api_tasks_for_due_date.csv | 4 +
.../e2e/snapshot_tables/_tool_zentao_bugs.csv | 14 +-
.../_tool_zentao_bugs_for_due_date.csv | 4 +
.../_tool_zentao_stories_for_due_date.csv | 2 +
.../e2e/snapshot_tables/_tool_zentao_tasks.csv | 8 +-
.../_tool_zentao_tasks_for_due_date.csv | 4 +
.../zentao/e2e/snapshot_tables/issues_bug.csv | 14 +-
.../snapshot_tables/issues_bug_for_due_date.csv | 2 +
.../snapshot_tables/issues_story_for_due_date.csv | 2 +
.../zentao/e2e/snapshot_tables/issues_task.csv | 8 +-
...ssues_task.csv => issues_task_for_due_date.csv} | 8 +-
backend/plugins/zentao/e2e/story_test.go | 44 ++++++
backend/plugins/zentao/e2e/task_test.go | 47 ++++++
backend/plugins/zentao/models/bug.go | 144 +++++++++--------
.../20250305_update_scope_config.go | 80 ++++++++++
.../zentao/models/migrationscripts/register.go | 1 +
backend/plugins/zentao/models/scope_config.go | 3 +
backend/plugins/zentao/models/story.go | 122 ++++++++-------
backend/plugins/zentao/models/task.go | 173 +++++++++++----------
backend/plugins/zentao/tasks/bug_convertor.go | 3 +
backend/plugins/zentao/tasks/bug_extractor.go | 12 ++
backend/plugins/zentao/tasks/story_convertor.go | 3 +
backend/plugins/zentao/tasks/story_extractor.go | 16 +-
backend/plugins/zentao/tasks/task_convertor.go | 3 +
backend/plugins/zentao/tasks/task_extractor.go | 20 ++-
80 files changed, 1725 insertions(+), 515 deletions(-)
diff --git a/backend/core/models/common/iso8601time.go b/backend/core/models/common/iso8601time.go
index 512a22070..cc467db48 100644
--- a/backend/core/models/common/iso8601time.go
+++ b/backend/core/models/common/iso8601time.go
@@ -72,6 +72,10 @@ func init() {
Matcher: regexp.MustCompile(`[+-][\d]{2}-[\d]{2}$`),
Format: "2006-01-02",
},
+ {
+ Matcher: regexp.MustCompile(`[\d]{4}-[\d]{2}-[\d]{2} [\d]{2}:[\d]{2}$`),
+ Format: "2006-01-02 15:04",
+ },
}
}
@@ -138,6 +142,16 @@ func ConvertStringToTime(timeString string) (t time.Time, err error) {
return time.Parse(time.RFC3339, timeString)
}
+// ConvertStringToTimeInLoc converts a string to time.Time in the given location.
+func ConvertStringToTimeInLoc(timeString string, loc *time.Location) (t time.Time, err error) {
+ for _, formatItem := range DateTimeFormats {
+ if formatItem.Matcher.MatchString(timeString) {
+ return time.ParseInLocation(formatItem.Format, timeString, loc)
+ }
+ }
+ return time.ParseInLocation(time.RFC3339, timeString, loc)
+}
+
// Iso8601TimeToTime FIXME ...
func Iso8601TimeToTime(iso8601Time *Iso8601Time) *time.Time {
if iso8601Time == nil {
diff --git a/backend/core/models/common/iso8601time_test.go b/backend/core/models/common/iso8601time_test.go
index 380c4b9f1..5a6448a76 100644
--- a/backend/core/models/common/iso8601time_test.go
+++ b/backend/core/models/common/iso8601time_test.go
@@ -124,3 +124,85 @@ func TestIso8601Time_Scan(t *testing.T) {
})
}
}
+
+func TestConvertStringToTime(t *testing.T) {
+ testCases := []struct {
+ name string
+ input string
+ output time.Time
+ err error
+ }{
+ {
+ name: "Valid time string",
+ input: "2023-03-01T12:30:00+0000",
+ output: time.Date(2023, 3, 1, 12, 30, 0, 0, time.UTC).Local(),
+ err: nil,
+ },
+ {
+ name: "Valid date string",
+ input: "2023-03-01",
+ output: time.Date(2023, 3, 1, 0, 0, 0, 0, time.UTC),
+ err: nil,
+ },
+ {
+ name: "Invalid time string",
+ input: "invalid",
+ output: time.Time{},
+ err: fmt.Errorf("parsing time \"invalid\" as \"2006-01-02T15:04:05Z07:00\": cannot parse \"invalid\" as \"2006\""),
+ },
+ }
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ output, err := ConvertStringToTime(tc.input)
+ if !reflect.DeepEqual(tc.output, output) {
+ t.Errorf("Expected output to be %v, but got %v", tc.output, output)
+ }
+ assert.Equal(t, fmt.Sprintf("%v", err), fmt.Sprintf("%v", tc.err), "Expected error to be %v, but got %v", tc.err, err)
+ })
+ }
+}
+
+func TestConvertStringToTimeInLoc(t *testing.T) {
+ loc, err := time.LoadLocation("Asia/Shanghai")
+ if err != nil {
+ t.Fatalf("Failed to load location: %v", err)
+ }
+ testCases := []struct {
+ name string
+ input string
+ loc *time.Location
+ output time.Time
+ err error
+ }{
+ {
+ name: "Valid time string with location",
+ input: "2023-03-01T12:30:00+0800",
+ loc: loc,
+ output: time.Date(2023, 3, 1, 12, 30, 0, 0, loc),
+ err: nil,
+ },
+ {
+ name: "Valid date string with location",
+ input: "2023-03-01",
+ loc: loc,
+ output: time.Date(2023, 3, 1, 0, 0, 0, 0, loc),
+ err: nil,
+ },
+ {
+ name: "Invalid time string with location",
+ input: "invalid",
+ loc: loc,
+ output: time.Time{},
+ err: fmt.Errorf("parsing time \"invalid\" as \"2006-01-02T15:04:05Z07:00\": cannot parse \"invalid\" as \"2006\""),
+ },
+ }
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ output, err := ConvertStringToTimeInLoc(tc.input, tc.loc)
+ if !reflect.DeepEqual(tc.output, output) {
+ t.Errorf("Expected output to be %v, but got %v", tc.output, output)
+ }
+ assert.Equal(t, fmt.Sprintf("%v", err), fmt.Sprintf("%v", tc.err), "Expected error to be %v, but got %v", tc.err, err)
+ })
+ }
+}
diff --git a/backend/core/models/domainlayer/ticket/issue.go b/backend/core/models/domainlayer/ticket/issue.go
index f7d5cc562..e546ded25 100644
--- a/backend/core/models/domainlayer/ticket/issue.go
+++ b/backend/core/models/domainlayer/ticket/issue.go
@@ -54,6 +54,7 @@ type Issue struct {
Component string `gorm:"type:text"`
OriginalProject string `gorm:"type:varchar(255)"`
IsSubtask bool
+ DueDate *time.Time
}
func (Issue) TableName() string {
diff --git a/backend/plugins/zentao/models/migrationscripts/register.go b/backend/core/models/migrationscripts/20250303_add_due_date_to_issues.go
similarity index 56%
copy from backend/plugins/zentao/models/migrationscripts/register.go
copy to backend/core/models/migrationscripts/20250303_add_due_date_to_issues.go
index 582d5432c..ae6f12e77 100644
--- a/backend/plugins/zentao/models/migrationscripts/register.go
+++ b/backend/core/models/migrationscripts/20250303_add_due_date_to_issues.go
@@ -18,20 +18,37 @@ limitations under the License.
package migrationscripts
import (
+ "time"
+
+ "github.com/apache/incubator-devlake/core/context"
+ "github.com/apache/incubator-devlake/core/errors"
"github.com/apache/incubator-devlake/core/plugin"
)
-// All return all the migration scripts
-func All() []plugin.MigrationScript {
- return []plugin.MigrationScript{
- new(addInitTables),
- new(addScopeConfigTables),
- new(addIssueRepoCommitsTables),
- new(addInitChangelogTables),
- new(addTaskLeft),
- new(addExecutionStoryAndExecutionSummary),
- new(addRawParamTableForScope),
- new(dropTotalReal),
- new(addWorklogs),
+var _ plugin.MigrationScript = (*addDueDateToIssues)(nil)
+
+type issue20250303 struct {
+ DueDate *time.Time
+}
+
+func (issue20250303) TableName() string {
+ return "issues"
+}
+
+type addDueDateToIssues struct{}
+
+func (*addDueDateToIssues) Up(basicRes context.BasicRes) errors.Error {
+ db := basicRes.GetDal()
+ if err := db.AutoMigrate(&issue20250303{}); err != nil {
+ return err
}
+ return nil
+}
+
+func (*addDueDateToIssues) Version() uint64 {
+ return 20250303142101
+}
+
+func (*addDueDateToIssues) Name() string {
+ return "add due_date to issues"
}
diff --git a/backend/core/models/migrationscripts/register.go b/backend/core/models/migrationscripts/register.go
index cd1cfb7c8..c7dd8b759 100644
--- a/backend/core/models/migrationscripts/register.go
+++ b/backend/core/models/migrationscripts/register.go
@@ -134,5 +134,6 @@ func All() []plugin.MigrationScript {
new(addIsSubtaskToIssue),
new(addIsChildToCicdPipeline),
new(addCqIssueImpacts),
+ new(addDueDateToIssues),
}
}
diff --git a/backend/helpers/utils/field.go b/backend/helpers/utils/field.go
new file mode 100644
index 000000000..f75aa7853
--- /dev/null
+++ b/backend/helpers/utils/field.go
@@ -0,0 +1,62 @@
+/*
+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 utils
+
+import (
+ "fmt"
+ "regexp"
+ "time"
+
+ "github.com/apache/incubator-devlake/core/models/common"
+)
+
+// GetTimeFeildFromMap 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.
+// Returns:
+//
+// *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) {
+ val, ok := allFields[fieldName]
+ if !ok {
+ return nil, fmt.Errorf("Field %s not found", fieldName)
+ }
+ var temp time.Time
+ switch v := val.(type) {
+ case string:
+ if v == "" || v == "null" {
+ return nil, nil
+ }
+ // If value is a string with the format yyyy-MM-dd, use loc to parse it
+ isDateFormat, _ := regexp.Match(`\d{4}-\d{2}-\d{2}`, []byte(v))
+ if isDateFormat {
+ temp, _ = common.ConvertStringToTimeInLoc(v, loc)
+ } else {
+ temp, _ = common.ConvertStringToTime(v)
+ }
+
+ default:
+ temp, _ = v.(time.Time)
+ }
+ if temp.IsZero() {
+ return nil, nil
+ }
+ return &temp, nil
+}
diff --git a/backend/helpers/utils/field_test.go b/backend/helpers/utils/field_test.go
new file mode 100644
index 000000000..c39a08202
--- /dev/null
+++ b/backend/helpers/utils/field_test.go
@@ -0,0 +1,147 @@
+/*
+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 utils
+
+import (
+ "testing"
+ "time"
+)
+
+func TestGetTimeFeildFromMap(t *testing.T) {
+ loc, _ := time.LoadLocation("Asia/Shanghai")
+
+ tests := []struct {
+ name string
+ allFields map[string]interface{}
+ fieldName string
+ loc *time.Location
+ want *time.Time
+ wantErr bool
+ expectedErr string
+ }{
+ {
+ name: "Field exists and can be converted to time.Time",
+ allFields: map[string]interface{}{
+ "time_field": "2023-10-26T10:00:00Z",
+ },
+ fieldName: "time_field",
+ loc: time.UTC,
+ want: func() *time.Time {
+ parsedTime, _ := time.Parse(time.RFC3339, "2023-10-26T10:00:00Z")
+ return &parsedTime
+ }(),
+ wantErr: false,
+ },
+ {
+ name: "Field exists and can be converted to time.Time with location",
+ allFields: map[string]interface{}{
+ "time_field": "2023-10-26T10:00:00+08:00",
+ },
+ fieldName: "time_field",
+ loc: loc,
+ want: func() *time.Time {
+ parsedTime, _ := time.Parse(time.RFC3339, "2023-10-26T10:00:00+08:00")
+ return &parsedTime
+ }(),
+ wantErr: false,
+ },
+ {
+ name: "Field does not exist",
+ allFields: map[string]interface{}{
+ "other_field": "some_value",
+ },
+ fieldName: "time_field",
+ loc: time.UTC,
+ want: nil,
+ wantErr: true,
+ expectedErr: "Field time_field not found",
+ },
+ {
+ name: "Field is an empty string",
+ allFields: map[string]interface{}{
+ "time_field": "",
+ },
+ fieldName: "time_field",
+ loc: time.UTC,
+ want: nil,
+ wantErr: false,
+ },
+ {
+ name: "Field is a null string",
+ allFields: map[string]interface{}{
+ "time_field": "null",
+ },
+ fieldName: "time_field",
+ loc: time.UTC,
+ want: nil,
+ wantErr: false,
+ },
+ {
+ name: "Field is already a time.Time",
+ allFields: map[string]interface{}{
+ "time_field": func() time.Time {
+ parsedTime, _ := time.Parse(time.RFC3339, "2023-10-26T10:00:00Z")
+ return parsedTime
+ }(),
+ },
+ fieldName: "time_field",
+ loc: time.UTC,
+ want: func() *time.Time {
+ parsedTime, _ := time.Parse(time.RFC3339, "2023-10-26T10:00:00Z")
+ return &parsedTime
+ }(),
+ wantErr: false,
+ },
+ {
+ name: "Field is a date format string",
+ allFields: map[string]interface{}{
+ "time_field": "2023-10-26",
+ },
+ fieldName: "time_field",
+ loc: loc,
+ want: func() *time.Time {
+ parsedTime, _ := time.ParseInLocation("2006-01-02", "2023-10-26", loc)
+ return &parsedTime
+ }(),
+ wantErr: false,
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ got, err := GetTimeFeildFromMap(tt.allFields, tt.fieldName, tt.loc)
+ if (err != nil) != tt.wantErr {
+ t.Errorf("GetTimeFeildFromMap() 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)
+ return
+ }
+
+ if got != nil && tt.want != nil {
+ if !got.UTC().Equal(tt.want.UTC()) {
+ t.Errorf("GetTimeFeildFromMap() = %v, want %v", got, tt.want)
+ }
+ } else if got != tt.want {
+ t.Errorf("GetTimeFeildFromMap() = %v, want %v", got, tt.want)
+ }
+ })
+ }
+}
diff --git a/backend/plugins/jira/e2e/issue_test.go b/backend/plugins/jira/e2e/issue_test.go
index 1255a62d2..b5ccf8532 100644
--- a/backend/plugins/jira/e2e/issue_test.go
+++ b/backend/plugins/jira/e2e/issue_test.go
@@ -74,6 +74,7 @@ func TestIssueDataFlow(t *testing.T) {
dataflowTester.FlushTabler(&models.JiraAccount{})
dataflowTester.FlushTabler(&models.JiraIssueType{})
dataflowTester.FlushTabler(&models.JiraIssueLabel{})
+ dataflowTester.FlushTabler(&models.JiraIssueField{})
dataflowTester.Subtask(tasks.ExtractIssueTypesMeta, taskData)
dataflowTester.Subtask(tasks.ExtractIssuesMeta, taskData)
dataflowTester.VerifyTable(
@@ -136,6 +137,7 @@ func TestIssueDataFlow(t *testing.T) {
"changelog_total",
"comment_total",
"subtask",
+ "due_date",
),
)
@@ -236,6 +238,7 @@ func TestIssueDataFlow(t *testing.T) {
"severity",
"component",
"original_project",
+ "due_date",
},
)
dataflowTester.VerifyTable(
@@ -318,3 +321,142 @@ func TestIssueSubtaskWithoutMapping(t *testing.T) {
},
)
}
+
+func TestIssueCustomizeDueDate(t *testing.T) {
+ var plugin impl.Jira
+ dataflowTester := e2ehelper.NewDataFlowTester(t, "jira", plugin)
+
+ taskData := &tasks.JiraTaskData{
+ Options: &tasks.JiraOptions{
+ ConnectionId: 2,
+ BoardId: 8,
+ ScopeConfig: &models.JiraScopeConfig{
+ StoryPointField: "customfield_10024",
+ DueDateField: "customfield_10003",
+ TypeMappings: map[string]models.TypeMapping{
+ "子任务": {
+ StandardType: "Sub-task",
+ StatusMappings: map[string]models.StatusMapping{
+ "done": {StandardStatus: "你好世界"},
+ "new": {StandardStatus: "\u6069\u5E95\u6EF4\u68AF\u6B38\u592B\u5178\u4EA2\u59C6"},
+ },
+ },
+ "任务": {
+ StandardType: "Task",
+ StatusMappings: map[string]models.StatusMapping{
+ "done": {StandardStatus: "hello world"},
+ "new": {StandardStatus: "110 100 100 116 102 46 99 111 109"},
+ },
+ },
+ // issueType "Test Execution" in raw_data and not fill here to test issueType not be defined
+ },
+ },
+ },
+ }
+ // import raw data table
+ dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_jira_api_issues_for_due_date.csv", "_raw_jira_api_issues")
+ dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_jira_api_issue_types.csv", "_raw_jira_api_issue_types")
+
+ // verify issue extraction
+ dataflowTester.FlushTabler(&models.JiraIssue{})
+ dataflowTester.FlushTabler(&models.JiraBoardIssue{})
+ dataflowTester.FlushTabler(&models.JiraSprintIssue{})
+ dataflowTester.FlushTabler(&models.JiraIssueComment{})
+ dataflowTester.FlushTabler(&models.JiraIssueChangelogs{})
+ dataflowTester.FlushTabler(&models.JiraIssueChangelogItems{})
+ dataflowTester.FlushTabler(&models.JiraWorklog{})
+ dataflowTester.FlushTabler(&models.JiraAccount{})
+ dataflowTester.FlushTabler(&models.JiraIssueType{})
+ dataflowTester.FlushTabler(&models.JiraIssueLabel{})
+ dataflowTester.FlushTabler(&models.JiraIssueField{})
+ dataflowTester.Subtask(tasks.ExtractIssueTypesMeta, taskData)
+ dataflowTester.Subtask(tasks.ExtractIssuesMeta, taskData)
+
+ dataflowTester.VerifyTable(
+ models.JiraIssue{},
+ "./snapshot_tables/_tool_jira_issues_for_due_date.csv",
+ e2ehelper.ColumnWithRawData(
+ "connection_id",
+ "issue_id",
+ "project_id",
+ "project_name",
+ "self",
+ "issue_key",
+ "summary",
+ "description",
+ "type",
+ "epic_key",
+ "status_name",
+ "status_key",
+ "story_point",
+ "original_estimate_minutes",
+ "aggregate_estimate_minutes",
+ "remaining_estimate_minutes",
+ "creator_account_id",
+ "creator_account_type",
+ "creator_display_name",
+ "assignee_account_id",
+ "assignee_account_type",
+ "assignee_display_name",
+ "priority_id",
+ "priority_name",
+ "parent_id",
+ "parent_key",
+ "sprint_id",
+ "sprint_name",
+ "resolution_date",
+ "created",
+ "updated",
+ "spent_minutes",
+ "lead_time_minutes",
+ "std_type",
+ "std_status",
+ "icon_url",
+ "changelog_total",
+ "comment_total",
+ "due_date",
+ ),
+ )
+
+ // verify issue conversion
+ dataflowTester.FlushTabler(&ticket.Issue{})
+ dataflowTester.FlushTabler(&ticket.BoardIssue{})
+ dataflowTester.FlushTabler(&ticket.IssueAssignee{})
+ dataflowTester.Subtask(tasks.ConvertIssuesMeta, taskData)
+ dataflowTester.VerifyTable(
+ ticket.Issue{},
+ "./snapshot_tables/issues_for_due_date.csv",
+ []string{
+ "id",
+ "url",
+ "icon_url",
+ "issue_key",
+ "title",
+ "description",
+ "epic_key",
+ "type",
+ "original_type",
+ "status",
+ "original_status",
+ "story_point",
+ "resolution_date",
+ "created_date",
+ "updated_date",
+ "lead_time_minutes",
+ "parent_issue_id",
+ "priority",
+ "original_estimate_minutes",
+ "time_spent_minutes",
+ "time_remaining_minutes",
+ "creator_id",
+ "creator_name",
+ "assignee_id",
+ "assignee_name",
+ "severity",
+ "component",
+ "original_project",
+ "due_date",
+ },
+ )
+
+}
\ No newline at end of file
diff --git a/backend/plugins/jira/e2e/raw_tables/_raw_jira_api_issues.csv b/backend/plugins/jira/e2e/raw_tables/_raw_jira_api_issues.csv
index f4e09684b..d26a71122 100644
--- a/backend/plugins/jira/e2e/raw_tables/_raw_jira_api_issues.csv
+++ b/backend/plugins/jira/e2e/raw_tables/_raw_jira_api_issues.csv
@@ -1,5 +1,5 @@
"id","params","data","url","input","created_at"
-12441,"{""ConnectionId"":2,""BoardId"":8}","{""id"": ""10063"", ""key"": ""EE-1"", ""self"": ""https://merico.atlassian.net/rest/agile/1.0/issue/10063"", ""expand"": ""operations,versionedRepresentations,editmeta,changelog,renderedFields"", ""fields"": {""epic"": null, ""votes"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/EE-1/votes"", ""votes"": 0, ""hasVoted"": false}, ""labels"": [""frontEnd"",""Saas""], ""sprint"": null, ""status"": {""id"": ""10068"", ""name"": ""已完成 [...]
+12441,"{""ConnectionId"":2,""BoardId"":8}","{""id"": ""10063"", ""key"": ""EE-1"", ""self"": ""https://merico.atlassian.net/rest/agile/1.0/issue/10063"", ""expand"": ""operations,versionedRepresentations,editmeta,changelog,renderedFields"", ""fields"": {""epic"": null, ""votes"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/EE-1/votes"", ""votes"": 0, ""hasVoted"": false}, ""labels"": [""frontEnd"",""Saas""], ""sprint"": null, ""status"": {""id"": ""10068"", ""name"": ""已完成 [...]
12442,"{""ConnectionId"":2,""BoardId"":8}","{""id"": ""10064"", ""key"": ""EE-2"", ""self"": ""https://merico.atlassian.net/rest/agile/1.0/issue/10064"", ""expand"": ""operations,versionedRepresentations,editmeta,changelog,renderedFields"", ""fields"": {""epic"": null, ""votes"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/EE-2/votes"", ""votes"": 0, ""hasVoted"": false}, ""labels"": [""frontEnd"",""Saas""], ""sprint"": null, ""status"": {""id"": ""10068"", ""name"": ""已完成 [...]
12443,"{""ConnectionId"":2,""BoardId"":8}","{""id"": ""10065"", ""key"": ""EE-3"", ""self"": ""https://merico.atlassian.net/rest/agile/1.0/issue/10065"", ""expand"": ""operations,versionedRepresentations,editmeta,changelog,renderedFields"", ""fields"": {""epic"": null, ""votes"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/EE-3/votes"", ""votes"": 0, ""hasVoted"": false}, ""labels"": [""frontEnd"",""Saas""], ""sprint"": null, ""status"": {""id"": ""10068"", ""name"": ""已完成 [...]
12444,"{""ConnectionId"":2,""BoardId"":8}","{""id"": ""10066"", ""key"": ""EE-4"", ""self"": ""https://merico.atlassian.net/rest/agile/1.0/issue/10066"", ""expand"": ""operations,versionedRepresentations,editmeta,changelog,renderedFields"", ""fields"": {""epic"": null, ""votes"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/EE-4/votes"", ""votes"": 0, ""hasVoted"": false}, ""labels"": [""frontEnd"",""Saas""], ""sprint"": null, ""status"": {""id"": ""10068"", ""name"": ""已完成 [...]
diff --git a/backend/plugins/jira/e2e/raw_tables/_raw_jira_api_issues_for_due_date.csv b/backend/plugins/jira/e2e/raw_tables/_raw_jira_api_issues_for_due_date.csv
new file mode 100644
index 000000000..b8e9dd466
--- /dev/null
+++ b/backend/plugins/jira/e2e/raw_tables/_raw_jira_api_issues_for_due_date.csv
@@ -0,0 +1,2 @@
+"id","params","data","url","input","created_at"
+12441,"{""ConnectionId"":2,""BoardId"":8}","{""id"": ""10063"", ""key"": ""EE-1"", ""self"": ""https://merico.atlassian.net/rest/agile/1.0/issue/10063"", ""expand"": ""operations,versionedRepresentations,editmeta,changelog,renderedFields"", ""fields"": {""epic"": null, ""votes"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/EE-1/votes"", ""votes"": 0, ""hasVoted"": false}, ""labels"": [""frontEnd"",""Saas""], ""sprint"": null, ""status"": {""id"": ""10068"", ""name"": ""已完成 [...]
\ No newline at end of file
diff --git a/backend/plugins/jira/e2e/snapshot_tables/_tool_jira_issues.csv b/backend/plugins/jira/e2e/snapshot_tables/_tool_jira_issues.csv
index 8c1da4572..d08d5d783 100644
--- a/backend/plugins/jira/e2e/snapshot_tables/_tool_jira_issues.csv
+++ b/backend/plugins/jira/e2e/snapshot_tables/_tool_jira_issues.csv
@@ -1,31 +1,31 @@
-connection_id,issue_id,project_id,project_name,self,issue_key,summary,description,type,epic_key,status_name,status_key,story_point,original_estimate_minutes,aggregate_estimate_minutes,remaining_estimate_minutes,creator_account_id,creator_account_type,creator_display_name,assignee_account_id,assignee_account_type,assignee_display_name,priority_id,priority_name,parent_id,parent_key,sprint_id,sprint_name,resolution_date,created,updated,spent_minutes,lead_time_minutes,std_type,std_status,ico [...]
-2,10063,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10063,EE-1,四个排序图:测试/注释覆盖度、复用度、模块性,,故事,,已完成,new,-1,,1260,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,0,,0,,2020-06-19T06:31:18.495+00:00,2020-06-12T00:13:13.360+00:00,2021-03-28T08:06:08.713+00:00,,10458,故事,TODO,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,25,1,0,"{""ConnectionId"":2,""BoardId"":8}",_raw [...]
-2,10064,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10064,EE-2,问题堆叠分布排序图,,故事,,已完成,done,2,,840,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,0,,0,,2020-06-23T10:20:58.999+00:00,2020-06-12T00:15:36.123+00:00,2021-03-28T08:05:55.016+00:00,,16445,故事,DONE,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,24,2,0,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issu [...]
-2,10065,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10065,EE-3,问题积压图率,,故事,,已完成,done,0,,600,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,0,,0,,2020-06-23T10:21:11.996+00:00,2020-06-12T00:15:41.600+00:00,2021-03-28T08:05:55.061+00:00,,16445,故事,DONE,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,26,1,0,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issues,12443,
-2,10066,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10066,EE-4,问题分布的帕累托图,,故事,,已完成,done,0,,480,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,0,,0,,2020-06-23T10:21:23.562+00:00,2020-06-12T00:15:46.144+00:00,2021-03-28T08:06:09.535+00:00,,16445,故事,DONE,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,23,1,0,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issu [...]
-2,10067,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10067,EE-5,通用技术任务,,任务,,已完成,done,0,,360,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,0,,0,,2020-06-18T04:06:00.747+00:00,2020-06-12T00:16:44.157+00:00,2021-03-28T08:05:54.622+00:00,,8869,TASK,hello world,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,18,0,0,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api [...]
-2,10068,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10068,EE-6,变异系数、生产率的四象限图,,故事,,已完成,done,0,,1680,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c2490cf0c09e2e598,,Gerile Tu,3,Medium,0,,0,,2020-06-16T11:56:14.433+00:00,2020-06-12T00:17:26.986+00:00,2021-03-28T08:05:56.750+00:00,,6458,故事,DONE,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,17,0,0,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue [...]
-2,10070,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10070,EE-8,多团队支持,,任务,,已完成,done,0,,5400,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0ba04d9c0c220c18d8,,yanghui,3,Medium,0,,0,,2020-07-08T17:11:45.201+00:00,2020-06-12T00:18:58.050+00:00,2021-03-28T08:05:54.576+00:00,,38452,TASK,hello world,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,17,0,0,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue [...]
-2,10071,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10071,EE-9,Common backend 拆分,,任务,,已完成,done,0,1680,1680,1680,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0ba04d9c0c220c18d8,,yanghui,3,Medium,0,,0,,2020-07-08T17:12:05.663+00:00,2020-06-12T00:19:17.336+00:00,2021-03-28T08:06:20.165+00:00,,38452,TASK,hello world,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,18,0,0,"{""ConnectionId"":2,""BoardId"":8}",_ [...]
-2,10072,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10072,EE-10,部署SaaS版本,,任务,,已完成,new,0,,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0ba04d9c0c220c18d8,,yanghui,3,Medium,0,,0,,2020-07-08T17:11:55.247+00:00,2020-06-12T00:19:24.637+00:00,2021-03-28T08:05:54.472+00:00,,38452,TASK,110 100 100 116 102 46 99 111 109,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,17,0,0,"{""ConnectionId"":2,""BoardId"":8 [...]
-2,10076,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10076,EE-14,调整文件夹结构,,任务,,已完成,done,0,240,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0a47d31e0c2a15fd87,,yuxiang,3,Medium,0,,0,,2020-06-15T08:59:51.304+00:00,2020-06-12T00:24:25.922+00:00,2021-03-28T08:05:56.152+00:00,600,4835,TASK,hello world,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,18,0,0,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_ [...]
-2,10077,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10077,EE-15,路由权限控制,,任务,,已完成,done,0,240,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0a47d31e0c2a15fd87,,yuxiang,3,Medium,0,,0,,2020-06-15T09:00:26.956+00:00,2020-06-12T00:24:39.624+00:00,2021-03-28T08:06:01.995+00:00,480,4835,TASK,hello world,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,20,0,0,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_is [...]
-2,10078,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10078,EE-16,优化前端 webpack 开发阶段构建速度,,任务,,已完成,done,0,,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0a47d31e0c2a15fd87,,yuxiang,3,Medium,0,,0,,2020-06-15T09:01:44.159+00:00,2020-06-12T00:24:49.017+00:00,2021-03-28T08:05:55.863+00:00,60,4836,TASK,hello world,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,18,0,0,"{""ConnectionId"":2,""BoardId"":8}",_raw [...]
-2,10079,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10079,EE-17,新的错误处理机制,,任务,,已完成,done,0,360,240,240,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0a47d31e0c2a15fd87,,yuxiang,3,Medium,0,,0,,2020-07-22T07:25:29.104+00:00,2020-06-12T00:24:56.048+00:00,2021-03-28T08:05:54.426+00:00,120,58020,TASK,hello world,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,31,1,0,"{""ConnectionId"":2,""BoardId"":8}",_raw_jir [...]
-2,10081,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10081,EE-19,LDAP需要支持TLS和证书,,故事,,已完成,done,0,,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0aaa47a00c1997ea8e,,chao.cheng,3,Medium,0,,0,,2020-06-18T08:34:11.117+00:00,2020-06-12T00:28:00.241+00:00,2021-03-28T08:05:57.326+00:00,,9126,故事,DONE,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,17,1,0,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue [...]
-2,10082,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10082,EE-20,团队首页垂直化,,故事,,已完成,done,0,0,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0984083c0c12e5af8f,,lin.hao,3,Medium,0,,0,,2020-06-17T07:25:54.370+00:00,2020-06-12T00:29:43.677+00:00,2021-08-06T06:14:54.647+00:00,,7616,故事,DONE,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,14,0,0,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issues,12455,
-2,10085,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10085,EE-23,批量删除事故,,缺陷,,已完成,done,0,,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0a47d31e0c2a15fd87,,yuxiang,3,Medium,0,,0,,2020-06-15T09:07:56.798+00:00,2020-06-12T00:33:57.204+00:00,2021-03-28T08:05:57.095+00:00,60,4833,缺陷,DONE,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10303?size=medium,20,0,0,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issues,12456,
-2,10086,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10086,EE-24,LDAP支持自定义的证书上传,,故事,,已完成,done,0,,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0aaa47a00c1997ea8e,,chao.cheng,3,Medium,0,,0,,2020-06-12T07:17:28.659+00:00,2020-06-12T00:35:15.489+00:00,2021-03-28T08:05:55.819+00:00,,402,故事,DONE,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,11,1,0,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issues,12457,
-2,10087,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10087,EE-25,组件封装及Demo,,子任务,,已完成,done,0,240,240,240,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,10063,EE-1,0,,2020-06-18T04:02:22.350+00:00,2020-06-12T00:40:54.210+00:00,2021-03-28T08:05:57.189+00:00,,8841,SUB-TASK,你好世界,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,17,0,1,"{""ConnectionId"":2,""BoardId"":8} [...]
-2,10088,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10088,EE-26,定接口,,子任务,,已完成,done,0,,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0a47d31e0c2a15fd87,,yuxiang,3,Medium,10063,EE-1,0,,2020-06-15T09:06:51.438+00:00,2020-06-12T00:41:01.683+00:00,2021-03-28T08:05:55.208+00:00,,4825,SUB-TASK,你好世界,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,14,0,1,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issu [...]
-2,10089,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10089,EE-27,提供后端接口,,子任务,,已完成,done,0,660,660,660,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0ba04d9c0c220c18d8,,yanghui,3,Medium,10063,EE-1,0,,2020-06-19T06:31:31.662+00:00,2020-06-12T00:41:16.622+00:00,2021-03-28T08:05:55.498+00:00,,10430,SUB-TASK,你好世界,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,15,0,1,"{""ConnectionId"":2,""BoardId"":8}",_raw_ji [...]
-2,10090,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10090,EE-28,数据填充与联调,,子任务,,已完成,done,0,360,360,360,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,10063,EE-1,0,,2020-06-18T04:03:04.637+00:00,2020-06-12T00:41:36.317+00:00,2021-03-28T08:06:05.443+00:00,,8841,SUB-TASK,你好世界,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,14,0,1,"{""ConnectionId"":2,""BoardId"":8}", [...]
-2,10091,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10091,EE-29,组件封装及Demo,,子任务,,已完成,done,0,360,360,360,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,10064,EE-2,0,,2020-06-18T04:03:30.760+00:00,2020-06-12T00:48:29.035+00:00,2021-03-28T08:05:55.731+00:00,,8835,SUB-TASK,你好世界,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,15,0,1,"{""ConnectionId"":2,""BoardId"":8} [...]
-2,10092,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10092,EE-30,定接口,,子任务,,已完成,done,0,,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0a47d31e0c2a15fd87,,yuxiang,3,Medium,10064,EE-2,0,,2020-06-15T09:06:40.206+00:00,2020-06-12T00:48:39.803+00:00,2021-03-28T08:05:55.159+00:00,,4818,SUB-TASK,你好世界,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,11,0,1,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issu [...]
-2,10093,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10093,EE-31,后端接口,,子任务,,已完成,done,0,120,120,120,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0ba04d9c0c220c18d8,,yanghui,3,Medium,10064,EE-2,0,,2020-06-19T07:35:31.762+00:00,2020-06-12T00:48:46.751+00:00,2021-03-28T08:05:55.544+00:00,,10486,SUB-TASK,你好世界,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,15,0,1,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira [...]
-2,10094,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10094,EE-32,数据填充与联调,,子任务,,已完成,done,0,360,360,360,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,10064,EE-2,0,,2020-06-18T04:03:48.818+00:00,2020-06-12T00:48:53.279+00:00,2021-03-28T08:05:55.592+00:00,,8834,SUB-TASK,你好世界,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,14,0,1,"{""ConnectionId"":2,""BoardId"":8}", [...]
-2,10095,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10095,EE-33,准备测试用例,,子任务,,已完成,done,0,,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0984083c0c12e5af8f,,lin.hao,3,Medium,10063,EE-1,0,,2020-06-19T06:32:19.340+00:00,2020-06-12T00:50:45.674+00:00,2021-03-28T08:05:55.253+00:00,,10421,SUB-TASK,你好世界,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,10,0,1,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_i [...]
-2,10096,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10096,EE-34, 组件封装及Demo,,子任务,,已完成,done,0,240,360,360,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,10065,EE-3,0,,2020-06-18T04:04:05.951+00:00,2020-06-12T00:51:57.807+00:00,2021-03-28T08:05:57.232+00:00,,8832,SUB-TASK,你好世界,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,16,0,1,"{""ConnectionId"":2,""BoardId"":8 [...]
-2,10097,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10097,EE-35,定接口,,子任务,,已完成,new,0,,120,120,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0a47d31e0c2a15fd87,,yuxiang,3,Medium,10065,EE-3,0,,2020-06-15T09:06:30.942+00:00,2020-06-12T00:52:04.767+00:00,2021-03-28T08:05:55.353+00:00,,4814,SUB-TASK,恩底滴梯欸夫典亢姆,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,14,0,1,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_a [...]
-2,10098,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10098,EE-36,后端接口,,子任务,,已完成,new,0,120,120,120,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0ba04d9c0c220c18d8,,yanghui,3,Medium,10065,EE-3,0,,2020-06-19T07:35:44.696+00:00,2020-06-12T00:52:12.678+00:00,2021-03-28T08:05:55.685+00:00,,10483,SUB-TASK,恩底滴梯欸夫典亢姆,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,15,0,1,"{""ConnectionId"":2,""BoardId"":8}",_raw_j [...]
-2,10099,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10099,EE-37,数据填充与联调 ,,Test Execution,,已完成,new,0,,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,10065,EE-3,0,,2020-06-18T04:04:31.261+00:00,2020-06-12T00:52:23.456+00:00,2021-03-28T08:05:55.638+00:00,,8832,TEST EXECUTION,TODO,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10564?size=medium,13,0,0,"{""ConnectionId"":2,""Board [...]
+connection_id,issue_id,project_id,project_name,self,issue_key,summary,description,type,epic_key,status_name,status_key,story_point,original_estimate_minutes,aggregate_estimate_minutes,remaining_estimate_minutes,creator_account_id,creator_account_type,creator_display_name,assignee_account_id,assignee_account_type,assignee_display_name,priority_id,priority_name,parent_id,parent_key,sprint_id,sprint_name,resolution_date,created,updated,spent_minutes,lead_time_minutes,std_type,std_status,ico [...]
+2,10063,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10063,EE-1,四个排序图:测试/注释覆盖度、复用度、模块性,,故事,,已完成,new,-1,,1260,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,0,,0,,2020-06-19T06:31:18.495+00:00,2020-06-12T00:13:13.360+00:00,2021-03-28T08:06:08.713+00:00,,10458,故事,TODO,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,25,1,0,2025-03-08T16:00:00.000+00:00,"{""Connect [...]
+2,10064,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10064,EE-2,问题堆叠分布排序图,,故事,,已完成,done,2,,840,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,0,,0,,2020-06-23T10:20:58.999+00:00,2020-06-12T00:15:36.123+00:00,2021-03-28T08:05:55.016+00:00,,16445,故事,DONE,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,24,2,0,,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_iss [...]
+2,10065,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10065,EE-3,问题积压图率,,故事,,已完成,done,0,,600,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,0,,0,,2020-06-23T10:21:11.996+00:00,2020-06-12T00:15:41.600+00:00,2021-03-28T08:05:55.061+00:00,,16445,故事,DONE,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,26,1,0,,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issues,12443,
+2,10066,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10066,EE-4,问题分布的帕累托图,,故事,,已完成,done,0,,480,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,0,,0,,2020-06-23T10:21:23.562+00:00,2020-06-12T00:15:46.144+00:00,2021-03-28T08:06:09.535+00:00,,16445,故事,DONE,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,23,1,0,,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_iss [...]
+2,10067,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10067,EE-5,通用技术任务,,任务,,已完成,done,0,,360,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,0,,0,,2020-06-18T04:06:00.747+00:00,2020-06-12T00:16:44.157+00:00,2021-03-28T08:05:54.622+00:00,,8869,TASK,hello world,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,18,0,0,,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_ap [...]
+2,10068,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10068,EE-6,变异系数、生产率的四象限图,,故事,,已完成,done,0,,1680,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c2490cf0c09e2e598,,Gerile Tu,3,Medium,0,,0,,2020-06-16T11:56:14.433+00:00,2020-06-12T00:17:26.986+00:00,2021-03-28T08:05:56.750+00:00,,6458,故事,DONE,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,17,0,0,,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issu [...]
+2,10070,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10070,EE-8,多团队支持,,任务,,已完成,done,0,,5400,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0ba04d9c0c220c18d8,,yanghui,3,Medium,0,,0,,2020-07-08T17:11:45.201+00:00,2020-06-12T00:18:58.050+00:00,2021-03-28T08:05:54.576+00:00,,38452,TASK,hello world,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,17,0,0,,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issu [...]
+2,10071,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10071,EE-9,Common backend 拆分,,任务,,已完成,done,0,1680,1680,1680,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0ba04d9c0c220c18d8,,yanghui,3,Medium,0,,0,,2020-07-08T17:12:05.663+00:00,2020-06-12T00:19:17.336+00:00,2021-03-28T08:06:20.165+00:00,,38452,TASK,hello world,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,18,0,0,,"{""ConnectionId"":2,""BoardId"":8}", [...]
+2,10072,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10072,EE-10,部署SaaS版本,,任务,,已完成,new,0,,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0ba04d9c0c220c18d8,,yanghui,3,Medium,0,,0,,2020-07-08T17:11:55.247+00:00,2020-06-12T00:19:24.637+00:00,2021-03-28T08:05:54.472+00:00,,38452,TASK,110 100 100 116 102 46 99 111 109,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,17,0,0,,"{""ConnectionId"":2,""BoardId"": [...]
+2,10076,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10076,EE-14,调整文件夹结构,,任务,,已完成,done,0,240,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0a47d31e0c2a15fd87,,yuxiang,3,Medium,0,,0,,2020-06-15T08:59:51.304+00:00,2020-06-12T00:24:25.922+00:00,2021-03-28T08:05:56.152+00:00,600,4835,TASK,hello world,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,18,0,0,,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api [...]
+2,10077,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10077,EE-15,路由权限控制,,任务,,已完成,done,0,240,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0a47d31e0c2a15fd87,,yuxiang,3,Medium,0,,0,,2020-06-15T09:00:26.956+00:00,2020-06-12T00:24:39.624+00:00,2021-03-28T08:06:01.995+00:00,480,4835,TASK,hello world,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,20,0,0,,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_i [...]
+2,10078,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10078,EE-16,优化前端 webpack 开发阶段构建速度,,任务,,已完成,done,0,,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0a47d31e0c2a15fd87,,yuxiang,3,Medium,0,,0,,2020-06-15T09:01:44.159+00:00,2020-06-12T00:24:49.017+00:00,2021-03-28T08:05:55.863+00:00,60,4836,TASK,hello world,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,18,0,0,,"{""ConnectionId"":2,""BoardId"":8}",_ra [...]
+2,10079,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10079,EE-17,新的错误处理机制,,任务,,已完成,done,0,360,240,240,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0a47d31e0c2a15fd87,,yuxiang,3,Medium,0,,0,,2020-07-22T07:25:29.104+00:00,2020-06-12T00:24:56.048+00:00,2021-03-28T08:05:54.426+00:00,120,58020,TASK,hello world,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,31,1,0,,"{""ConnectionId"":2,""BoardId"":8}",_raw_ji [...]
+2,10081,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10081,EE-19,LDAP需要支持TLS和证书,,故事,,已完成,done,0,,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0aaa47a00c1997ea8e,,chao.cheng,3,Medium,0,,0,,2020-06-18T08:34:11.117+00:00,2020-06-12T00:28:00.241+00:00,2021-03-28T08:05:57.326+00:00,,9126,故事,DONE,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,17,1,0,,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issu [...]
+2,10082,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10082,EE-20,团队首页垂直化,,故事,,已完成,done,0,0,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0984083c0c12e5af8f,,lin.hao,3,Medium,0,,0,,2020-06-17T07:25:54.370+00:00,2020-06-12T00:29:43.677+00:00,2021-08-06T06:14:54.647+00:00,,7616,故事,DONE,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,14,0,0,,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issues,12455,
+2,10085,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10085,EE-23,批量删除事故,,缺陷,,已完成,done,0,,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0a47d31e0c2a15fd87,,yuxiang,3,Medium,0,,0,,2020-06-15T09:07:56.798+00:00,2020-06-12T00:33:57.204+00:00,2021-03-28T08:05:57.095+00:00,60,4833,缺陷,DONE,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10303?size=medium,20,0,0,,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issues,12456,
+2,10086,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10086,EE-24,LDAP支持自定义的证书上传,,故事,,已完成,done,0,,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0aaa47a00c1997ea8e,,chao.cheng,3,Medium,0,,0,,2020-06-12T07:17:28.659+00:00,2020-06-12T00:35:15.489+00:00,2021-03-28T08:05:55.819+00:00,,402,故事,DONE,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,11,1,0,,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue [...]
+2,10087,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10087,EE-25,组件封装及Demo,,子任务,,已完成,done,0,240,240,240,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,10063,EE-1,0,,2020-06-18T04:02:22.350+00:00,2020-06-12T00:40:54.210+00:00,2021-03-28T08:05:57.189+00:00,,8841,SUB-TASK,你好世界,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,17,0,1,,"{""ConnectionId"":2,""BoardId"":8 [...]
+2,10088,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10088,EE-26,定接口,,子任务,,已完成,done,0,,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0a47d31e0c2a15fd87,,yuxiang,3,Medium,10063,EE-1,0,,2020-06-15T09:06:51.438+00:00,2020-06-12T00:41:01.683+00:00,2021-03-28T08:05:55.208+00:00,,4825,SUB-TASK,你好世界,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,14,0,1,,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_iss [...]
+2,10089,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10089,EE-27,提供后端接口,,子任务,,已完成,done,0,660,660,660,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0ba04d9c0c220c18d8,,yanghui,3,Medium,10063,EE-1,0,,2020-06-19T06:31:31.662+00:00,2020-06-12T00:41:16.622+00:00,2021-03-28T08:05:55.498+00:00,,10430,SUB-TASK,你好世界,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,15,0,1,,"{""ConnectionId"":2,""BoardId"":8}",_raw_j [...]
+2,10090,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10090,EE-28,数据填充与联调,,子任务,,已完成,done,0,360,360,360,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,10063,EE-1,0,,2020-06-18T04:03:04.637+00:00,2020-06-12T00:41:36.317+00:00,2021-03-28T08:06:05.443+00:00,,8841,SUB-TASK,你好世界,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,14,0,1,,"{""ConnectionId"":2,""BoardId"":8}" [...]
+2,10091,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10091,EE-29,组件封装及Demo,,子任务,,已完成,done,0,360,360,360,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,10064,EE-2,0,,2020-06-18T04:03:30.760+00:00,2020-06-12T00:48:29.035+00:00,2021-03-28T08:05:55.731+00:00,,8835,SUB-TASK,你好世界,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,15,0,1,,"{""ConnectionId"":2,""BoardId"":8 [...]
+2,10092,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10092,EE-30,定接口,,子任务,,已完成,done,0,,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0a47d31e0c2a15fd87,,yuxiang,3,Medium,10064,EE-2,0,,2020-06-15T09:06:40.206+00:00,2020-06-12T00:48:39.803+00:00,2021-03-28T08:05:55.159+00:00,,4818,SUB-TASK,你好世界,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,11,0,1,,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_iss [...]
+2,10093,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10093,EE-31,后端接口,,子任务,,已完成,done,0,120,120,120,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0ba04d9c0c220c18d8,,yanghui,3,Medium,10064,EE-2,0,,2020-06-19T07:35:31.762+00:00,2020-06-12T00:48:46.751+00:00,2021-03-28T08:05:55.544+00:00,,10486,SUB-TASK,你好世界,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,15,0,1,,"{""ConnectionId"":2,""BoardId"":8}",_raw_jir [...]
+2,10094,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10094,EE-32,数据填充与联调,,子任务,,已完成,done,0,360,360,360,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,10064,EE-2,0,,2020-06-18T04:03:48.818+00:00,2020-06-12T00:48:53.279+00:00,2021-03-28T08:05:55.592+00:00,,8834,SUB-TASK,你好世界,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,14,0,1,,"{""ConnectionId"":2,""BoardId"":8}" [...]
+2,10095,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10095,EE-33,准备测试用例,,子任务,,已完成,done,0,,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0984083c0c12e5af8f,,lin.hao,3,Medium,10063,EE-1,0,,2020-06-19T06:32:19.340+00:00,2020-06-12T00:50:45.674+00:00,2021-03-28T08:05:55.253+00:00,,10421,SUB-TASK,你好世界,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,10,0,1,,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_ [...]
+2,10096,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10096,EE-34, 组件封装及Demo,,子任务,,已完成,done,0,240,360,360,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,10065,EE-3,0,,2020-06-18T04:04:05.951+00:00,2020-06-12T00:51:57.807+00:00,2021-03-28T08:05:57.232+00:00,,8832,SUB-TASK,你好世界,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,16,0,1,,"{""ConnectionId"":2,""BoardId"": [...]
+2,10097,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10097,EE-35,定接口,,子任务,,已完成,new,0,,120,120,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0a47d31e0c2a15fd87,,yuxiang,3,Medium,10065,EE-3,0,,2020-06-15T09:06:30.942+00:00,2020-06-12T00:52:04.767+00:00,2021-03-28T08:05:55.353+00:00,,4814,SUB-TASK,恩底滴梯欸夫典亢姆,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,14,0,1,,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_ [...]
+2,10098,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10098,EE-36,后端接口,,子任务,,已完成,new,0,120,120,120,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0ba04d9c0c220c18d8,,yanghui,3,Medium,10065,EE-3,0,,2020-06-19T07:35:44.696+00:00,2020-06-12T00:52:12.678+00:00,2021-03-28T08:05:55.685+00:00,,10483,SUB-TASK,恩底滴梯欸夫典亢姆,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,15,0,1,,"{""ConnectionId"":2,""BoardId"":8}",_raw_ [...]
+2,10099,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10099,EE-37,数据填充与联调 ,,Test Execution,,已完成,new,0,,0,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,10065,EE-3,0,,2020-06-18T04:04:31.261+00:00,2020-06-12T00:52:23.456+00:00,2021-03-28T08:05:55.638+00:00,,8832,TEST EXECUTION,TODO,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10564?size=medium,13,0,0,,"{""ConnectionId"":2,""Boar [...]
diff --git a/backend/plugins/jira/e2e/snapshot_tables/_tool_jira_issues_for_due_date.csv b/backend/plugins/jira/e2e/snapshot_tables/_tool_jira_issues_for_due_date.csv
new file mode 100644
index 000000000..e96bc0b2c
--- /dev/null
+++ b/backend/plugins/jira/e2e/snapshot_tables/_tool_jira_issues_for_due_date.csv
@@ -0,0 +1,2 @@
+connection_id,issue_id,project_id,project_name,self,issue_key,summary,description,type,epic_key,status_name,status_key,story_point,original_estimate_minutes,aggregate_estimate_minutes,remaining_estimate_minutes,creator_account_id,creator_account_type,creator_display_name,assignee_account_id,assignee_account_type,assignee_display_name,priority_id,priority_name,parent_id,parent_key,sprint_id,sprint_name,resolution_date,created,updated,spent_minutes,lead_time_minutes,std_type,std_status,ico [...]
+2,10063,10003,Enterprise Edition,https://merico.atlassian.net/rest/agile/1.0/issue/10063,EE-1,四个排序图:测试/注释覆盖度、复用度、模块性,,故事,,已完成,new,-1,,1260,0,5e9711ba34f7b90c0fbc37d3,,Rankin Zheng,5ecfbd0c730ec90c1999cadf,,Dingding Zhang,3,Medium,0,,0,,2020-06-19T06:31:18.495+00:00,2020-06-12T00:13:13.360+00:00,2021-03-28T08:06:08.713+00:00,,10458,故事,TODO,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,25,1,2025-03-03T16:00:00.000+00:00,"{""Connectio [...]
diff --git a/backend/plugins/jira/e2e/snapshot_tables/issues.csv b/backend/plugins/jira/e2e/snapshot_tables/issues.csv
index 45653eecf..3ccf92d88 100644
--- a/backend/plugins/jira/e2e/snapshot_tables/issues.csv
+++ b/backend/plugins/jira/e2e/snapshot_tables/issues.csv
@@ -1,31 +1,31 @@
-id,url,icon_url,issue_key,title,description,epic_key,type,original_type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,parent_issue_id,priority,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,severity,component,original_project
-jira:JiraIssue:2:10063,https://merico.atlassian.net/browse/EE-1,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,EE-1,四个排序图:测试/注释覆盖度、复用度、模块性,,,故事,故事,TODO,已完成,-1,2020-06-19T06:31:18.495+00:00,2020-06-12T00:13:13.360+00:00,2021-03-28T08:06:08.713+00:00,10458,,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition
-jira:JiraIssue:2:10064,https://merico.atlassian.net/browse/EE-2,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,EE-2,问题堆叠分布排序图,,,故事,故事,DONE,已完成,2,2020-06-23T10:20:58.999+00:00,2020-06-12T00:15:36.123+00:00,2021-03-28T08:05:55.016+00:00,16445,,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition
-jira:JiraIssue:2:10065,https://merico.atlassian.net/browse/EE-3,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,EE-3,问题积压图率,,,故事,故事,DONE,已完成,0,2020-06-23T10:21:11.996+00:00,2020-06-12T00:15:41.600+00:00,2021-03-28T08:05:55.061+00:00,16445,,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition
-jira:JiraIssue:2:10066,https://merico.atlassian.net/browse/EE-4,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,EE-4,问题分布的帕累托图,,,故事,故事,DONE,已完成,0,2020-06-23T10:21:23.562+00:00,2020-06-12T00:15:46.144+00:00,2021-03-28T08:06:09.535+00:00,16445,,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition
-jira:JiraIssue:2:10067,https://merico.atlassian.net/browse/EE-5,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,EE-5,通用技术任务,,,TASK,任务,hello world,已完成,0,2020-06-18T04:06:00.747+00:00,2020-06-12T00:16:44.157+00:00,2021-03-28T08:05:54.622+00:00,8869,,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition
-jira:JiraIssue:2:10068,https://merico.atlassian.net/browse/EE-6,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,EE-6,变异系数、生产率的四象限图,,,故事,故事,DONE,已完成,0,2020-06-16T11:56:14.433+00:00,2020-06-12T00:17:26.986+00:00,2021-03-28T08:05:56.750+00:00,6458,,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c2490cf0c09e2e598,Gerile Tu,,,Enterprise Edition
-jira:JiraIssue:2:10070,https://merico.atlassian.net/browse/EE-8,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,EE-8,多团队支持,,,TASK,任务,hello world,已完成,0,2020-07-08T17:11:45.201+00:00,2020-06-12T00:18:58.050+00:00,2021-03-28T08:05:54.576+00:00,38452,,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,,Enterprise Edition
-jira:JiraIssue:2:10071,https://merico.atlassian.net/browse/EE-9,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,EE-9,Common backend 拆分,,,TASK,任务,hello world,已完成,0,2020-07-08T17:12:05.663+00:00,2020-06-12T00:19:17.336+00:00,2021-03-28T08:06:20.165+00:00,38452,,Medium,1680,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,,Enterprise Edition
-jira:JiraIssue:2:10072,https://merico.atlassian.net/browse/EE-10,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,EE-10,部署SaaS版本,,,TASK,任务,110 100 100 116 102 46 99 111 109,已完成,0,2020-07-08T17:11:55.247+00:00,2020-06-12T00:19:24.637+00:00,2021-03-28T08:05:54.472+00:00,38452,,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,,Enterprise Edition
-jira:JiraIssue:2:10076,https://merico.atlassian.net/browse/EE-14,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,EE-14,调整文件夹结构,,,TASK,任务,hello world,已完成,0,2020-06-15T08:59:51.304+00:00,2020-06-12T00:24:25.922+00:00,2021-03-28T08:05:56.152+00:00,4835,,Medium,240,600,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,,Enterprise Edition
-jira:JiraIssue:2:10077,https://merico.atlassian.net/browse/EE-15,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,EE-15,路由权限控制,,,TASK,任务,hello world,已完成,0,2020-06-15T09:00:26.956+00:00,2020-06-12T00:24:39.624+00:00,2021-03-28T08:06:01.995+00:00,4835,,Medium,240,480,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,,Enterprise Edition
-jira:JiraIssue:2:10078,https://merico.atlassian.net/browse/EE-16,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,EE-16,优化前端 webpack 开发阶段构建速度,,,TASK,任务,hello world,已完成,0,2020-06-15T09:01:44.159+00:00,2020-06-12T00:24:49.017+00:00,2021-03-28T08:05:55.863+00:00,4836,,Medium,,60,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,,Enterprise Edition
-jira:JiraIssue:2:10079,https://merico.atlassian.net/browse/EE-17,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,EE-17,新的错误处理机制,,,TASK,任务,hello world,已完成,0,2020-07-22T07:25:29.104+00:00,2020-06-12T00:24:56.048+00:00,2021-03-28T08:05:54.426+00:00,58020,,Medium,360,120,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,,Enterprise Edition
-jira:JiraIssue:2:10081,https://merico.atlassian.net/browse/EE-19,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,EE-19,LDAP需要支持TLS和证书,,,故事,故事,DONE,已完成,0,2020-06-18T08:34:11.117+00:00,2020-06-12T00:28:00.241+00:00,2021-03-28T08:05:57.326+00:00,9126,,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0aaa47a00c1997ea8e,chao.cheng,,,Enterprise Edition
-jira:JiraIssue:2:10082,https://merico.atlassian.net/browse/EE-20,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,EE-20,团队首页垂直化,,,故事,故事,DONE,已完成,0,2020-06-17T07:25:54.370+00:00,2020-06-12T00:29:43.677+00:00,2021-08-06T06:14:54.647+00:00,7616,,Medium,0,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0984083c0c12e5af8f,lin.hao,,,Enterprise Edition
-jira:JiraIssue:2:10085,https://merico.atlassian.net/browse/EE-23,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10303?size=medium,EE-23,批量删除事故,,,缺陷,缺陷,DONE,已完成,0,2020-06-15T09:07:56.798+00:00,2020-06-12T00:33:57.204+00:00,2021-03-28T08:05:57.095+00:00,4833,,Medium,,60,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,,Enterprise Edition
-jira:JiraIssue:2:10086,https://merico.atlassian.net/browse/EE-24,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,EE-24,LDAP支持自定义的证书上传,,,故事,故事,DONE,已完成,0,2020-06-12T07:17:28.659+00:00,2020-06-12T00:35:15.489+00:00,2021-03-28T08:05:55.819+00:00,402,,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0aaa47a00c1997ea8e,chao.cheng,,,Enterprise Edition
-jira:JiraIssue:2:10087,https://merico.atlassian.net/browse/EE-25,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-25,组件封装及Demo,,,SUB-TASK,子任务,你好世界,已完成,0,2020-06-18T04:02:22.350+00:00,2020-06-12T00:40:54.210+00:00,2021-03-28T08:05:57.189+00:00,8841,jira:JiraIssue:2:10063,Medium,240,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition
-jira:JiraIssue:2:10088,https://merico.atlassian.net/browse/EE-26,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-26,定接口,,,SUB-TASK,子任务,你好世界,已完成,0,2020-06-15T09:06:51.438+00:00,2020-06-12T00:41:01.683+00:00,2021-03-28T08:05:55.208+00:00,4825,jira:JiraIssue:2:10063,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,,Enterprise Edition
-jira:JiraIssue:2:10089,https://merico.atlassian.net/browse/EE-27,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-27,提供后端接口,,,SUB-TASK,子任务,你好世界,已完成,0,2020-06-19T06:31:31.662+00:00,2020-06-12T00:41:16.622+00:00,2021-03-28T08:05:55.498+00:00,10430,jira:JiraIssue:2:10063,Medium,660,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,,Enterprise Edition
-jira:JiraIssue:2:10090,https://merico.atlassian.net/browse/EE-28,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-28,数据填充与联调,,,SUB-TASK,子任务,你好世界,已完成,0,2020-06-18T04:03:04.637+00:00,2020-06-12T00:41:36.317+00:00,2021-03-28T08:06:05.443+00:00,8841,jira:JiraIssue:2:10063,Medium,360,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition
-jira:JiraIssue:2:10091,https://merico.atlassian.net/browse/EE-29,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-29,组件封装及Demo,,,SUB-TASK,子任务,你好世界,已完成,0,2020-06-18T04:03:30.760+00:00,2020-06-12T00:48:29.035+00:00,2021-03-28T08:05:55.731+00:00,8835,jira:JiraIssue:2:10064,Medium,360,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition
-jira:JiraIssue:2:10092,https://merico.atlassian.net/browse/EE-30,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-30,定接口,,,SUB-TASK,子任务,你好世界,已完成,0,2020-06-15T09:06:40.206+00:00,2020-06-12T00:48:39.803+00:00,2021-03-28T08:05:55.159+00:00,4818,jira:JiraIssue:2:10064,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,,Enterprise Edition
-jira:JiraIssue:2:10093,https://merico.atlassian.net/browse/EE-31,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-31,后端接口,,,SUB-TASK,子任务,你好世界,已完成,0,2020-06-19T07:35:31.762+00:00,2020-06-12T00:48:46.751+00:00,2021-03-28T08:05:55.544+00:00,10486,jira:JiraIssue:2:10064,Medium,120,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,,Enterprise Edition
-jira:JiraIssue:2:10094,https://merico.atlassian.net/browse/EE-32,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-32,数据填充与联调,,,SUB-TASK,子任务,你好世界,已完成,0,2020-06-18T04:03:48.818+00:00,2020-06-12T00:48:53.279+00:00,2021-03-28T08:05:55.592+00:00,8834,jira:JiraIssue:2:10064,Medium,360,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition
-jira:JiraIssue:2:10095,https://merico.atlassian.net/browse/EE-33,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-33,准备测试用例,,,SUB-TASK,子任务,你好世界,已完成,0,2020-06-19T06:32:19.340+00:00,2020-06-12T00:50:45.674+00:00,2021-03-28T08:05:55.253+00:00,10421,jira:JiraIssue:2:10063,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0984083c0c12e5af8f,lin.hao,,,Enterprise Edition
-jira:JiraIssue:2:10096,https://merico.atlassian.net/browse/EE-34,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-34, 组件封装及Demo,,,SUB-TASK,子任务,你好世界,已完成,0,2020-06-18T04:04:05.951+00:00,2020-06-12T00:51:57.807+00:00,2021-03-28T08:05:57.232+00:00,8832,jira:JiraIssue:2:10065,Medium,240,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition
-jira:JiraIssue:2:10097,https://merico.atlassian.net/browse/EE-35,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-35,定接口,,,SUB-TASK,子任务,恩底滴梯欸夫典亢姆,已完成,0,2020-06-15T09:06:30.942+00:00,2020-06-12T00:52:04.767+00:00,2021-03-28T08:05:55.353+00:00,4814,jira:JiraIssue:2:10065,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,,Enterprise Edition
-jira:JiraIssue:2:10098,https://merico.atlassian.net/browse/EE-36,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-36,后端接口,,,SUB-TASK,子任务,恩底滴梯欸夫典亢姆,已完成,0,2020-06-19T07:35:44.696+00:00,2020-06-12T00:52:12.678+00:00,2021-03-28T08:05:55.685+00:00,10483,jira:JiraIssue:2:10065,Medium,120,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,,Enterprise Edition
-jira:JiraIssue:2:10099,https://merico.atlassian.net/browse/EE-37,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10564?size=medium,EE-37,数据填充与联调 ,,,TEST EXECUTION,Test Execution,TODO,已完成,0,2020-06-18T04:04:31.261+00:00,2020-06-12T00:52:23.456+00:00,2021-03-28T08:05:55.638+00:00,8832,jira:JiraIssue:2:10065,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition
+id,url,icon_url,issue_key,title,description,epic_key,type,original_type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,parent_issue_id,priority,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,severity,component,original_project,due_date
+jira:JiraIssue:2:10063,https://merico.atlassian.net/browse/EE-1,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,EE-1,四个排序图:测试/注释覆盖度、复用度、模块性,,,故事,故事,TODO,已完成,-1,2020-06-19T06:31:18.495+00:00,2020-06-12T00:13:13.360+00:00,2021-03-28T08:06:08.713+00:00,10458,,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition,2025-03-08T16:00:00.000+00:00
+jira:JiraIssue:2:10064,https://merico.atlassian.net/browse/EE-2,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,EE-2,问题堆叠分布排序图,,,故事,故事,DONE,已完成,2,2020-06-23T10:20:58.999+00:00,2020-06-12T00:15:36.123+00:00,2021-03-28T08:05:55.016+00:00,16445,,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition,
+jira:JiraIssue:2:10065,https://merico.atlassian.net/browse/EE-3,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,EE-3,问题积压图率,,,故事,故事,DONE,已完成,0,2020-06-23T10:21:11.996+00:00,2020-06-12T00:15:41.600+00:00,2021-03-28T08:05:55.061+00:00,16445,,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition,
+jira:JiraIssue:2:10066,https://merico.atlassian.net/browse/EE-4,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,EE-4,问题分布的帕累托图,,,故事,故事,DONE,已完成,0,2020-06-23T10:21:23.562+00:00,2020-06-12T00:15:46.144+00:00,2021-03-28T08:06:09.535+00:00,16445,,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition,
+jira:JiraIssue:2:10067,https://merico.atlassian.net/browse/EE-5,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,EE-5,通用技术任务,,,TASK,任务,hello world,已完成,0,2020-06-18T04:06:00.747+00:00,2020-06-12T00:16:44.157+00:00,2021-03-28T08:05:54.622+00:00,8869,,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition,
+jira:JiraIssue:2:10068,https://merico.atlassian.net/browse/EE-6,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,EE-6,变异系数、生产率的四象限图,,,故事,故事,DONE,已完成,0,2020-06-16T11:56:14.433+00:00,2020-06-12T00:17:26.986+00:00,2021-03-28T08:05:56.750+00:00,6458,,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c2490cf0c09e2e598,Gerile Tu,,,Enterprise Edition,
+jira:JiraIssue:2:10070,https://merico.atlassian.net/browse/EE-8,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,EE-8,多团队支持,,,TASK,任务,hello world,已完成,0,2020-07-08T17:11:45.201+00:00,2020-06-12T00:18:58.050+00:00,2021-03-28T08:05:54.576+00:00,38452,,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,,Enterprise Edition,
+jira:JiraIssue:2:10071,https://merico.atlassian.net/browse/EE-9,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,EE-9,Common backend 拆分,,,TASK,任务,hello world,已完成,0,2020-07-08T17:12:05.663+00:00,2020-06-12T00:19:17.336+00:00,2021-03-28T08:06:20.165+00:00,38452,,Medium,1680,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,,Enterprise Edition,
+jira:JiraIssue:2:10072,https://merico.atlassian.net/browse/EE-10,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,EE-10,部署SaaS版本,,,TASK,任务,110 100 100 116 102 46 99 111 109,已完成,0,2020-07-08T17:11:55.247+00:00,2020-06-12T00:19:24.637+00:00,2021-03-28T08:05:54.472+00:00,38452,,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,,Enterprise Edition,
+jira:JiraIssue:2:10076,https://merico.atlassian.net/browse/EE-14,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,EE-14,调整文件夹结构,,,TASK,任务,hello world,已完成,0,2020-06-15T08:59:51.304+00:00,2020-06-12T00:24:25.922+00:00,2021-03-28T08:05:56.152+00:00,4835,,Medium,240,600,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,,Enterprise Edition,
+jira:JiraIssue:2:10077,https://merico.atlassian.net/browse/EE-15,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,EE-15,路由权限控制,,,TASK,任务,hello world,已完成,0,2020-06-15T09:00:26.956+00:00,2020-06-12T00:24:39.624+00:00,2021-03-28T08:06:01.995+00:00,4835,,Medium,240,480,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,,Enterprise Edition,
+jira:JiraIssue:2:10078,https://merico.atlassian.net/browse/EE-16,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,EE-16,优化前端 webpack 开发阶段构建速度,,,TASK,任务,hello world,已完成,0,2020-06-15T09:01:44.159+00:00,2020-06-12T00:24:49.017+00:00,2021-03-28T08:05:55.863+00:00,4836,,Medium,,60,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,,Enterprise Edition,
+jira:JiraIssue:2:10079,https://merico.atlassian.net/browse/EE-17,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium,EE-17,新的错误处理机制,,,TASK,任务,hello world,已完成,0,2020-07-22T07:25:29.104+00:00,2020-06-12T00:24:56.048+00:00,2021-03-28T08:05:54.426+00:00,58020,,Medium,360,120,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,,Enterprise Edition,
+jira:JiraIssue:2:10081,https://merico.atlassian.net/browse/EE-19,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,EE-19,LDAP需要支持TLS和证书,,,故事,故事,DONE,已完成,0,2020-06-18T08:34:11.117+00:00,2020-06-12T00:28:00.241+00:00,2021-03-28T08:05:57.326+00:00,9126,,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0aaa47a00c1997ea8e,chao.cheng,,,Enterprise Edition,
+jira:JiraIssue:2:10082,https://merico.atlassian.net/browse/EE-20,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,EE-20,团队首页垂直化,,,故事,故事,DONE,已完成,0,2020-06-17T07:25:54.370+00:00,2020-06-12T00:29:43.677+00:00,2021-08-06T06:14:54.647+00:00,7616,,Medium,0,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0984083c0c12e5af8f,lin.hao,,,Enterprise Edition,
+jira:JiraIssue:2:10085,https://merico.atlassian.net/browse/EE-23,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10303?size=medium,EE-23,批量删除事故,,,缺陷,缺陷,DONE,已完成,0,2020-06-15T09:07:56.798+00:00,2020-06-12T00:33:57.204+00:00,2021-03-28T08:05:57.095+00:00,4833,,Medium,,60,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,,Enterprise Edition,
+jira:JiraIssue:2:10086,https://merico.atlassian.net/browse/EE-24,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,EE-24,LDAP支持自定义的证书上传,,,故事,故事,DONE,已完成,0,2020-06-12T07:17:28.659+00:00,2020-06-12T00:35:15.489+00:00,2021-03-28T08:05:55.819+00:00,402,,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0aaa47a00c1997ea8e,chao.cheng,,,Enterprise Edition,
+jira:JiraIssue:2:10087,https://merico.atlassian.net/browse/EE-25,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-25,组件封装及Demo,,,SUB-TASK,子任务,你好世界,已完成,0,2020-06-18T04:02:22.350+00:00,2020-06-12T00:40:54.210+00:00,2021-03-28T08:05:57.189+00:00,8841,jira:JiraIssue:2:10063,Medium,240,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition,
+jira:JiraIssue:2:10088,https://merico.atlassian.net/browse/EE-26,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-26,定接口,,,SUB-TASK,子任务,你好世界,已完成,0,2020-06-15T09:06:51.438+00:00,2020-06-12T00:41:01.683+00:00,2021-03-28T08:05:55.208+00:00,4825,jira:JiraIssue:2:10063,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,,Enterprise Edition,
+jira:JiraIssue:2:10089,https://merico.atlassian.net/browse/EE-27,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-27,提供后端接口,,,SUB-TASK,子任务,你好世界,已完成,0,2020-06-19T06:31:31.662+00:00,2020-06-12T00:41:16.622+00:00,2021-03-28T08:05:55.498+00:00,10430,jira:JiraIssue:2:10063,Medium,660,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,,Enterprise Edition,
+jira:JiraIssue:2:10090,https://merico.atlassian.net/browse/EE-28,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-28,数据填充与联调,,,SUB-TASK,子任务,你好世界,已完成,0,2020-06-18T04:03:04.637+00:00,2020-06-12T00:41:36.317+00:00,2021-03-28T08:06:05.443+00:00,8841,jira:JiraIssue:2:10063,Medium,360,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition,
+jira:JiraIssue:2:10091,https://merico.atlassian.net/browse/EE-29,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-29,组件封装及Demo,,,SUB-TASK,子任务,你好世界,已完成,0,2020-06-18T04:03:30.760+00:00,2020-06-12T00:48:29.035+00:00,2021-03-28T08:05:55.731+00:00,8835,jira:JiraIssue:2:10064,Medium,360,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition,
+jira:JiraIssue:2:10092,https://merico.atlassian.net/browse/EE-30,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-30,定接口,,,SUB-TASK,子任务,你好世界,已完成,0,2020-06-15T09:06:40.206+00:00,2020-06-12T00:48:39.803+00:00,2021-03-28T08:05:55.159+00:00,4818,jira:JiraIssue:2:10064,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,,Enterprise Edition,
+jira:JiraIssue:2:10093,https://merico.atlassian.net/browse/EE-31,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-31,后端接口,,,SUB-TASK,子任务,你好世界,已完成,0,2020-06-19T07:35:31.762+00:00,2020-06-12T00:48:46.751+00:00,2021-03-28T08:05:55.544+00:00,10486,jira:JiraIssue:2:10064,Medium,120,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,,Enterprise Edition,
+jira:JiraIssue:2:10094,https://merico.atlassian.net/browse/EE-32,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-32,数据填充与联调,,,SUB-TASK,子任务,你好世界,已完成,0,2020-06-18T04:03:48.818+00:00,2020-06-12T00:48:53.279+00:00,2021-03-28T08:05:55.592+00:00,8834,jira:JiraIssue:2:10064,Medium,360,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition,
+jira:JiraIssue:2:10095,https://merico.atlassian.net/browse/EE-33,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-33,准备测试用例,,,SUB-TASK,子任务,你好世界,已完成,0,2020-06-19T06:32:19.340+00:00,2020-06-12T00:50:45.674+00:00,2021-03-28T08:05:55.253+00:00,10421,jira:JiraIssue:2:10063,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0984083c0c12e5af8f,lin.hao,,,Enterprise Edition,
+jira:JiraIssue:2:10096,https://merico.atlassian.net/browse/EE-34,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-34, 组件封装及Demo,,,SUB-TASK,子任务,你好世界,已完成,0,2020-06-18T04:04:05.951+00:00,2020-06-12T00:51:57.807+00:00,2021-03-28T08:05:57.232+00:00,8832,jira:JiraIssue:2:10065,Medium,240,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition,
+jira:JiraIssue:2:10097,https://merico.atlassian.net/browse/EE-35,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-35,定接口,,,SUB-TASK,子任务,恩底滴梯欸夫典亢姆,已完成,0,2020-06-15T09:06:30.942+00:00,2020-06-12T00:52:04.767+00:00,2021-03-28T08:05:55.353+00:00,4814,jira:JiraIssue:2:10065,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,,Enterprise Edition,
+jira:JiraIssue:2:10098,https://merico.atlassian.net/browse/EE-36,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-36,后端接口,,,SUB-TASK,子任务,恩底滴梯欸夫典亢姆,已完成,0,2020-06-19T07:35:44.696+00:00,2020-06-12T00:52:12.678+00:00,2021-03-28T08:05:55.685+00:00,10483,jira:JiraIssue:2:10065,Medium,120,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,,Enterprise Edition,
+jira:JiraIssue:2:10099,https://merico.atlassian.net/browse/EE-37,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10564?size=medium,EE-37,数据填充与联调 ,,,TEST EXECUTION,Test Execution,TODO,已完成,0,2020-06-18T04:04:31.261+00:00,2020-06-12T00:52:23.456+00:00,2021-03-28T08:05:55.638+00:00,8832,jira:JiraIssue:2:10065,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition,
diff --git a/backend/plugins/jira/e2e/snapshot_tables/issues_for_due_date.csv b/backend/plugins/jira/e2e/snapshot_tables/issues_for_due_date.csv
new file mode 100644
index 000000000..11e907816
--- /dev/null
+++ b/backend/plugins/jira/e2e/snapshot_tables/issues_for_due_date.csv
@@ -0,0 +1,2 @@
+id,url,icon_url,issue_key,title,description,epic_key,type,original_type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,parent_issue_id,priority,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,severity,component,original_project,due_date
+jira:JiraIssue:2:10063,https://merico.atlassian.net/browse/EE-1,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,EE-1,四个排序图:测试/注释覆盖度、复用度、模块性,,,故事,故事,TODO,已完成,-1,2020-06-19T06:31:18.495+00:00,2020-06-12T00:13:13.360+00:00,2021-03-28T08:06:08.713+00:00,10458,,Medium,,,,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,,Enterprise Edition,2025-03-03T16:00:00.000+00:00
diff --git a/backend/plugins/jira/models/issue.go b/backend/plugins/jira/models/issue.go
index 12db2b00b..1c880bcf8 100644
--- a/backend/plugins/jira/models/issue.go
+++ b/backend/plugins/jira/models/issue.go
@@ -66,6 +66,7 @@ type JiraIssue struct {
Subtask bool
ChangelogTotal int
WorklogTotal int
+ DueDate *time.Time
common.NoPKModel
}
diff --git a/backend/plugins/jira/models/migrationscripts/20250305_add_due_date_config.go b/backend/plugins/jira/models/migrationscripts/20250305_add_due_date_config.go
new file mode 100644
index 000000000..bfa802b0c
--- /dev/null
+++ b/backend/plugins/jira/models/migrationscripts/20250305_add_due_date_config.go
@@ -0,0 +1,60 @@
+/*
+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 migrationscripts
+
+import (
+ "time"
+
+ "github.com/apache/incubator-devlake/core/context"
+ "github.com/apache/incubator-devlake/core/errors"
+ "github.com/apache/incubator-devlake/helpers/migrationhelper"
+)
+
+type JiraScopeConfig20250305 struct {
+ DueDateField string `mapstructure:"dueDateField,omitempty" json:"dueDateField" gorm:"type:varchar(255)"`
+}
+
+func (t JiraScopeConfig20250305) TableName() string {
+ return "_tool_jira_scope_configs"
+}
+
+type JiraIssue20250310 struct {
+ DueDate *time.Time
+}
+
+func (t JiraIssue20250310) TableName() string {
+ return "_tool_jira_issues"
+}
+
+type updateScopeConfig struct{}
+
+func (*updateScopeConfig) Up(basicRes context.BasicRes) errors.Error {
+ return migrationhelper.AutoMigrateTables(
+ basicRes,
+ &JiraScopeConfig20250305{},
+ &JiraIssue20250310{},
+ )
+}
+
+func (*updateScopeConfig) Version() uint64 {
+ return 20250305092900
+}
+
+func (*updateScopeConfig) Name() string {
+ return "jira update scope config, add due date field"
+}
diff --git a/backend/plugins/jira/models/migrationscripts/register.go b/backend/plugins/jira/models/migrationscripts/register.go
index 5f32aef7c..787565087 100644
--- a/backend/plugins/jira/models/migrationscripts/register.go
+++ b/backend/plugins/jira/models/migrationscripts/register.go
@@ -53,5 +53,6 @@ func All() []plugin.MigrationScript {
new(addIssueFieldTable),
new(changeIssueComponentType),
new(flushJiraIssues),
+ new(updateScopeConfig),
}
}
diff --git a/backend/plugins/jira/models/scope_config.go b/backend/plugins/jira/models/scope_config.go
index bb267a0f6..a8bd78a98 100644
--- a/backend/plugins/jira/models/scope_config.go
+++ b/backend/plugins/jira/models/scope_config.go
@@ -48,6 +48,7 @@ type JiraScopeConfig struct {
RemotelinkRepoPattern []CommitUrlPattern `mapstructure:"remotelinkRepoPattern,omitempty" json:"remotelinkRepoPattern" gorm:"type:json;serializer:json"`
TypeMappings map[string]TypeMapping `mapstructure:"typeMappings,omitempty" json:"typeMappings" gorm:"type:json;serializer:json"`
ApplicationType string `mapstructure:"applicationType,omitempty" json:"applicationType" gorm:"type:varchar(255)"`
+ DueDateField string `mapstructure:"dueDateField,omitempty" json:"dueDateField" gorm:"type:varchar(255)"`
}
func (r *JiraScopeConfig) SetConnectionId(c *JiraScopeConfig, connectionId uint64) {
diff --git a/backend/plugins/jira/tasks/apiv2models/issue.go b/backend/plugins/jira/tasks/apiv2models/issue.go
index 68b5a26b6..c62183d0f 100644
--- a/backend/plugins/jira/tasks/apiv2models/issue.go
+++ b/backend/plugins/jira/tasks/apiv2models/issue.go
@@ -136,7 +136,7 @@ type Issue struct {
Total int `json:"total"`
} `json:"aggregateprogress"`
Environment interface{} `json:"environment"`
- Duedate interface{} `json:"duedate"`
+ Duedate string `json:"duedate"` // yyyy-MM-dd
Progress struct {
Progress int `json:"progress"`
Total int `json:"total"`
diff --git a/backend/plugins/jira/tasks/issue_convertor.go b/backend/plugins/jira/tasks/issue_convertor.go
index 8a329ddf7..aefda6be4 100644
--- a/backend/plugins/jira/tasks/issue_convertor.go
+++ b/backend/plugins/jira/tasks/issue_convertor.go
@@ -123,6 +123,7 @@ func ConvertIssues(subtaskCtx plugin.SubTaskContext) errors.Error {
OriginalProject: jiraIssue.ProjectName,
Component: jiraIssue.Components,
IsSubtask: jiraIssue.Subtask,
+ DueDate: jiraIssue.DueDate,
}
if jiraIssue.CreatorAccountId != "" {
issue.CreatorId = accountIdGen.Generate(data.Options.ConnectionId, jiraIssue.CreatorAccountId)
diff --git a/backend/plugins/jira/tasks/issue_extractor.go b/backend/plugins/jira/tasks/issue_extractor.go
index 11277a0a4..a38387a2a 100644
--- a/backend/plugins/jira/tasks/issue_extractor.go
+++ b/backend/plugins/jira/tasks/issue_extractor.go
@@ -26,6 +26,7 @@ import (
"github.com/apache/incubator-devlake/core/errors"
"github.com/apache/incubator-devlake/core/plugin"
"github.com/apache/incubator-devlake/helpers/pluginhelper/api"
+ "github.com/apache/incubator-devlake/helpers/utils"
"github.com/apache/incubator-devlake/plugins/jira/models"
"github.com/apache/incubator-devlake/plugins/jira/tasks/apiv2models"
)
@@ -143,7 +144,14 @@ func extractIssues(data *JiraTaskData, mappings *typeMappings, apiIssue *apiv2mo
}
}
-
+ // default due date field is "duedate"
+ dueDateField := "duedate"
+ if data.Options.ScopeConfig != nil && data.Options.ScopeConfig.DueDateField != "" {
+ dueDateField = data.Options.ScopeConfig.DueDateField
+ }
+ // using location of issues.Created
+ loc := issue.Created.Location()
+ issue.DueDate, _ = utils.GetTimeFeildFromMap(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/e2e/bugs_test.go b/backend/plugins/tapd/e2e/bugs_test.go
index 0e664b7d6..6c676fdaa 100644
--- a/backend/plugins/tapd/e2e/bugs_test.go
+++ b/backend/plugins/tapd/e2e/bugs_test.go
@@ -104,7 +104,7 @@ func TestTapdBugDataFlow(t *testing.T) {
dataflowTester.Subtask(tasks.ConvertBugMeta, taskData)
dataflowTester.VerifyTable(
ticket.Issue{},
- "./snapshot_tables/issue_bug.csv",
+ "./snapshot_tables/issues_bug.csv",
e2ehelper.ColumnWithRawData(
"id",
"url",
@@ -132,6 +132,7 @@ func TestTapdBugDataFlow(t *testing.T) {
"component",
"icon_url",
"creator_name",
+ "due_date",
),
)
dataflowTester.VerifyTable(
@@ -164,3 +165,71 @@ func TestTapdBugDataFlow(t *testing.T) {
),
)
}
+
+func TestTapdBugCustomizeDueDate(t *testing.T) {
+ var tapd impl.Tapd
+ dataflowTester := e2ehelper.NewDataFlowTester(t, "tapd", tapd)
+
+ taskData := &tasks.TapdTaskData{
+ Options: &tasks.TapdOptions{
+ ConnectionId: 1,
+ WorkspaceId: 991,
+ ScopeConfig: &models.TapdScopeConfig{
+ TypeMappings: map[string]string{
+ "BUG": "缺陷",
+ "TASK": "任务",
+ },
+ StatusMappings: map[string]string{
+ "已关闭": "完成",
+ "接受/处理": "处理中",
+ },
+ BugDueDateField: "custom_field_four",
+ },
+ },
+ }
+
+ dataflowTester.FlushTabler(&models.TapdBug{})
+ // import raw data table
+ dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_tapd_api_bugs_for_due_date.csv", "_raw_tapd_api_bugs")
+ dataflowTester.Subtask(tasks.ExtractBugMeta, taskData)
+ dataflowTester.VerifyTableWithOptions(&models.TapdBug{}, e2ehelper.TableOptions{
+ CSVRelPath: "./snapshot_tables/_tool_tapd_bugs_for_due_date.csv",
+ IgnoreTypes: []interface{}{common.NoPKModel{}},
+ })
+
+ dataflowTester.FlushTabler(&ticket.Issue{})
+ dataflowTester.Subtask(tasks.ConvertBugMeta, taskData)
+ dataflowTester.VerifyTable(
+ ticket.Issue{},
+ "./snapshot_tables/issues_bug_for_due_date.csv",
+ e2ehelper.ColumnWithRawData(
+ "id",
+ "url",
+ "issue_key",
+ "title",
+ "description",
+ "epic_key",
+ "type",
+ "status",
+ "original_status",
+ "story_point",
+ "resolution_date",
+ "created_date",
+ "updated_date",
+ "lead_time_minutes",
+ "parent_issue_id",
+ "priority",
+ "original_estimate_minutes",
+ "time_spent_minutes",
+ "time_remaining_minutes",
+ "creator_id",
+ "assignee_id",
+ "assignee_name",
+ "severity",
+ "component",
+ "icon_url",
+ "creator_name",
+ "due_date",
+ ),
+ )
+}
diff --git a/backend/plugins/tapd/e2e/raw_tables/_raw_tapd_api_bugs.csv b/backend/plugins/tapd/e2e/raw_tables/_raw_tapd_api_bugs.csv
index af039d50d..e5e531f4a 100644
--- a/backend/plugins/tapd/e2e/raw_tables/_raw_tapd_api_bugs.csv
+++ b/backend/plugins/tapd/e2e/raw_tables/_raw_tapd_api_bugs.csv
@@ -1,5 +1,5 @@
id,params,data,url,input,created_at
-1271,"{""ConnectionId"":1,""WorkspaceId"":991}","{""Bug"":{""id"":""11991001001025"",""sid"":""0"",""parent_id"":null,""title"":""test-11test-11test-11test-11test-11est-11test-11test-11"",""description"":""<div>test-11test-11test-11test-11test-11<\/div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11<a href=\""http:\/\/insurance.xxx-com-sss\/index-0212.html\"" target=\""_blank\"">http:\/\/insurance.xxx-com-sss\/index-0212.html<\/a>test-11<\/div><div>2test-11te [...]
+1271,"{""ConnectionId"":1,""WorkspaceId"":991}","{""Bug"":{""id"":""11991001001025"",""sid"":""0"",""parent_id"":null,""title"":""test-11test-11test-11test-11test-11est-11test-11test-11"",""description"":""<div>test-11test-11test-11test-11test-11<\/div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11<a href=\""http:\/\/insurance.xxx-com-sss\/index-0212.html\"" target=\""_blank\"">http:\/\/insurance.xxx-com-sss\/index-0212.html<\/a>test-11<\/div><div>2test-11te [...]
1272,"{""ConnectionId"":1,""WorkspaceId"":991}","{""Bug"":{""id"":""11991001001030"",""sid"":""0"",""parent_id"":null,""title"":""test-11test-11test-11t11test-11"",""description"":""<div>test-11test-11test-11test-11test-11<\/div><div>1test-11test-11test-11test-11test-11test-11test-11test-11<\/div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11<\/div><div><br \/><\/div><div>test-11test-11test-11test-11test-11<\/div><div>test-11test [...]
1273,"{""ConnectionId"":1,""WorkspaceId"":991}","{""Bug"":{""id"":""11991001001031"",""sid"":""0"",""parent_id"":null,""title"":""test-11test-11test-11test-11test-11test-11test-11test-11test-11"",""description"":""<div>test-11test-11test-11test-11test-11<\/div><div>1test-11test-11test-11test-11test-11test-11test-11test-11<\/div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11<\/div><div><br \/><\/div><div>test-11test-11test-11test-11test-11<\/di [...]
1274,"{""ConnectionId"":1,""WorkspaceId"":991}","{""Bug"":{""id"":""11991001001032"",""sid"":""0"",""parent_id"":null,""title"":""test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11"",""description"":""<div>test-11test-11test-11test-11test-11<\/div><div>1test-11test-11test-11test-11test-11test-11test-11test-11<\/div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11<\/div><div><br [...]
diff --git a/backend/plugins/tapd/e2e/raw_tables/_raw_tapd_api_bugs_for_due_date.csv b/backend/plugins/tapd/e2e/raw_tables/_raw_tapd_api_bugs_for_due_date.csv
new file mode 100644
index 000000000..b3a494140
--- /dev/null
+++ b/backend/plugins/tapd/e2e/raw_tables/_raw_tapd_api_bugs_for_due_date.csv
@@ -0,0 +1,2 @@
+id,params,data,url,input,created_at
+1271,"{""ConnectionId"":1,""WorkspaceId"":991}","{""Bug"":{""id"":""11991001001025"",""sid"":""0"",""parent_id"":null,""title"":""test-11test-11test-11test-11test-11est-11test-11test-11"",""description"":""<div>test-11test-11test-11test-11test-11<\/div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11<a href=\""http:\/\/insurance.xxx-com-sss\/index-0212.html\"" target=\""_blank\"">http:\/\/insurance.xxx-com-sss\/index-0212.html<\/a>test-11<\/div><div>2test-11te [...]
diff --git a/backend/plugins/tapd/e2e/raw_tables/_raw_tapd_api_stories_for_due_date.csv b/backend/plugins/tapd/e2e/raw_tables/_raw_tapd_api_stories_for_due_date.csv
new file mode 100644
index 000000000..ac8b34a10
--- /dev/null
+++ b/backend/plugins/tapd/e2e/raw_tables/_raw_tapd_api_stories_for_due_date.csv
@@ -0,0 +1,2 @@
+id,params,data,url,input,created_at
+1,"{""ConnectionId"":1,""WorkspaceId"":991}","{""Story"":{""id"":""11991001037563"",""secret_root_id"":""0"",""sort"":""103756300000"",""workitem_type_id"":""11991001000026"",""name"":""test-11test-11test-11test-11test-11test-11test-11test-11"",""description"":""<div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--><\/div><\/div><style>@font-face{font-family:\""Times New Roman\"";}@font-face{font-family:\""test-11test-11\"";}@font-face{font-family:\""Calibri\"";}p.Mso [...]
diff --git a/backend/plugins/tapd/e2e/raw_tables/_raw_tapd_api_tasks_for_due_date.csv b/backend/plugins/tapd/e2e/raw_tables/_raw_tapd_api_tasks_for_due_date.csv
new file mode 100644
index 000000000..90d7cb79a
--- /dev/null
+++ b/backend/plugins/tapd/e2e/raw_tables/_raw_tapd_api_tasks_for_due_date.csv
@@ -0,0 +1,2 @@
+id,params,data,url,input,created_at
+4339,"{""ConnectionId"":1,""WorkspaceId"":991}","{""Task"":{""id"":""11991001015107"",""name"":""test-11test-11test-11test-11test-11test-11test-11"",""description"":"""",""markdown_description"":"""",""description_type"":""1"",""creator"":""test-11test-11"",""created"":""2020-11-03 17:52:00"",""modified"":""2022-06-01 19:53:30"",""parent_id"":""0"",""children_id"":""|"",""ancestor_id"":""0"",""path"":"""",""level"":null,""workspace_id"":""991"",""status"":""done"",""flows"":"""",""priori [...]
diff --git a/backend/plugins/tapd/e2e/snapshot_tables/_tool_tapd_bugs.csv b/backend/plugins/tapd/e2e/snapshot_tables/_tool_tapd_bugs.csv
index 6a90fe69c..791e8dbc5 100644
--- a/backend/plugins/tapd/e2e/snapshot_tables/_tool_tapd_bugs.csv
+++ b/backend/plugins/tapd/e2e/snapshot_tables/_tool_tapd_bugs.csv
@@ -1,21 +1,21 @@
-connection_id,id,epic_key,title,description,workspace_id,created,modified,status,cc,begin,due,priority,iteration_id,source,module,release_id,created_from,feature,severity,reporter,resolved,closed,lastmodify,auditer,de,fixer,version_test,version_report,version_close,version_fix,baseline_find,baseline_join,baseline_close,baseline_test,sourcephase,te,current_owner,resolution,originphase,confirmer,participator,closer,platform,os,testtype,testphase,frequency,regression_number,flows,testmode,i [...]
-1,11991001001025,,test-11test-11test-11test-11test-11est-11test-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11<a href=""http://insurance.xxx-com-sss/index-0212.html"" target=""_blank"">http://insurance.xxx-com-sss/index-0212.html</a>test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div> [...]
-1,11991001001030,,test-11test-11test-11t11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11<a href=""http://insurance.xxx-com-sss/insurclass/"" target=""_blank"">http:// [...]
-1,11991001001031,,test-11test-11test-11test-11test-11test-11test-11test-11test-11,<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11<br /></div><div><br /></div><d [...]
-1,11991001001032,,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11<a h [...]
-1,11991001001417,,test-11test-11-11test-11tesst-11test-11test-11test-11,<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div>< [...]
-1,11991001001418,,test-11tesest-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11test-11test-11test-11test [...]
-1,11991001001420,,test-11test-11test-11test-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>3test-11test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div> [...]
-1,11991001001422,,test-11te11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,"<div><br /></div><div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11 [...]
-1,11991001001423,,test--11test-11test-11test-11test-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11tes [...]
-1,11991001001425,,test-11test1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11test-11</div><div><b [...]
-1,11991001001426,,test-11test-11te11test-11test-11test-11test-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11te [...]
-1,11991001001447,,IE11 test-11te1test-11test-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test- [...]
-1,11991001001448,,IE11 test-11test-11test-11test-11test-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11t [...]
-1,11991001001450,,IE11 tes-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11</div>< [...]
-1,11991001001451,,IE11 test-11test-11test-st-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test- [...]
-1,11991001001710,,test-11-11test-11test-11test-11test-11test-11test-11test-11test-11,<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11<br /></div><div><br /></div><div>t [...]
-1,11991001001711,,test-11tesst-11test-11test-11test-11test-11test-11test-11test-11...test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11...test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11< [...]
-1,11991001001737,,test-11tesst-11test-1test-11test-11test-11test-11test-11test-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>3test-11test-11test-11test-11test-11test-11test-11test-11</div><div>4test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test- [...]
-1,11991001001739,,tt6d3btt52a8tt62a5tt5730tt65b986tt7a7att683c,"<div>tt64cdtt4f5ctt6b65tt9aa4ttff1a</div><div>1tt3001tt8fdbtt5165tt6d3btt52a8tt62a5tt540dtt5bfctt822att9875</div><div>2tt3001tt67e5tt770btt6d3btt52a8tt8be6tt60c5tt533att57dftt5c55tt793a</div><div><br /></div><div>tt9884tt671ftt7ed3tt679cttff1a</div><div>tt6d3btt52a8tt8be6tt60c5tt533att57dftt5c55tt793att6b63tt5e38</div><div><br /></div><div>tt5b9ett9645tt7ed3tt679cttff1a</div><div>tt6d3btt52a8tt8be6tt60c5tt6587tt5b57tt6587t [...]
-1,11991001001740,,tt6d3btt52a8tt6ctt5230tt4e13tt5bb6tt4ecbtt7ecdtt9875,<div>tt64cdtt4f5ctt6b65tt9aa4ttff1a</div><div>1tt3001tt8fdbtt5165tt6d3btt52a8tt62a5tt540dtt5bfctt822att9875</div><div>2tt3001tt5728tt4e13tt5bb6tt5c55tt793att533att57dftt70b9tt51fbtt4e13tt5bb6tt5934tt50cftt6216tt540dtt5b57</div><div>3tt3001tt67e5tt770btt9875tt9762tt8df3tt8f6c</div><div><br /></div><div>tt9884tt671ftt7ed3tt679cttff1a</div><div>tt9875tt9762tt8df3转正常,跳转后地址正常</div><div><br /></div><div>实际结果:</div><div>页面 [...]
+connection_id,id,epic_key,title,description,workspace_id,created,modified,status,cc,begin,due,priority,iteration_id,source,module,release_id,created_from,feature,severity,reporter,resolved,closed,lastmodify,auditer,de,fixer,version_test,version_report,version_close,version_fix,baseline_find,baseline_join,baseline_close,baseline_test,sourcephase,te,current_owner,resolution,originphase,confirmer,participator,closer,platform,os,testtype,testphase,frequency,regression_number,flows,testmode,i [...]
+1,11991001001025,,test-11test-11test-11test-11test-11est-11test-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11<a href=""http://insurance.xxx-com-sss/index-0212.html"" target=""_blank"">http://insurance.xxx-com-sss/index-0212.html</a>test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div> [...]
+1,11991001001030,,test-11test-11test-11t11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11<a href=""http://insurance.xxx-com-sss/insurclass/"" target=""_blank"">http:// [...]
+1,11991001001031,,test-11test-11test-11test-11test-11test-11test-11test-11test-11,<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11<br /></div><div><br /></div><d [...]
+1,11991001001032,,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11<a h [...]
+1,11991001001417,,test-11test-11-11test-11tesst-11test-11test-11test-11,<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div>< [...]
+1,11991001001418,,test-11tesest-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11test-11test-11test-11test [...]
+1,11991001001420,,test-11test-11test-11test-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>3test-11test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div> [...]
+1,11991001001422,,test-11te11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,"<div><br /></div><div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11 [...]
+1,11991001001423,,test--11test-11test-11test-11test-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11tes [...]
+1,11991001001425,,test-11test1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11test-11</div><div><b [...]
+1,11991001001426,,test-11test-11te11test-11test-11test-11test-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11te [...]
+1,11991001001447,,IE11 test-11te1test-11test-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test- [...]
+1,11991001001448,,IE11 test-11test-11test-11test-11test-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11t [...]
+1,11991001001450,,IE11 tes-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11</div>< [...]
+1,11991001001451,,IE11 test-11test-11test-st-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test- [...]
+1,11991001001710,,test-11-11test-11test-11test-11test-11test-11test-11test-11test-11,<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11</div><div>test-11test-11test-11test-11test-11test-11<br /></div><div><br /></div><div>t [...]
+1,11991001001711,,test-11tesst-11test-11test-11test-11test-11test-11test-11test-11...test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11...test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test-11< [...]
+1,11991001001737,,test-11tesst-11test-1test-11test-11test-11test-11test-11test-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div><div>3test-11test-11test-11test-11test-11test-11test-11test-11</div><div>4test-11test-11test-11test-11test-11test-11test-11</div><div><br /></div><div>test-11test-11test-11test-11test- [...]
+1,11991001001739,,tt6d3btt52a8tt62a5tt5730tt65b986tt7a7att683c,"<div>tt64cdtt4f5ctt6b65tt9aa4ttff1a</div><div>1tt3001tt8fdbtt5165tt6d3btt52a8tt62a5tt540dtt5bfctt822att9875</div><div>2tt3001tt67e5tt770btt6d3btt52a8tt8be6tt60c5tt533att57dftt5c55tt793a</div><div><br /></div><div>tt9884tt671ftt7ed3tt679cttff1a</div><div>tt6d3btt52a8tt8be6tt60c5tt533att57dftt5c55tt793att6b63tt5e38</div><div><br /></div><div>tt5b9ett9645tt7ed3tt679cttff1a</div><div>tt6d3btt52a8tt8be6tt60c5tt6587tt5b57tt6587t [...]
+1,11991001001740,,tt6d3btt52a8tt6ctt5230tt4e13tt5bb6tt4ecbtt7ecdtt9875,<div>tt64cdtt4f5ctt6b65tt9aa4ttff1a</div><div>1tt3001tt8fdbtt5165tt6d3btt52a8tt62a5tt540dtt5bfctt822att9875</div><div>2tt3001tt5728tt4e13tt5bb6tt5c55tt793att533att57dftt70b9tt51fbtt4e13tt5bb6tt5934tt50cftt6216tt540dtt5b57</div><div>3tt3001tt67e5tt770btt9875tt9762tt8df3tt8f6c</div><div><br /></div><div>tt9884tt671ftt7ed3tt679cttff1a</div><div>tt9875tt9762tt8df3转正常,跳转后地址正常</div><div><br /></div><div>实际结果:</div><div>页面 [...]
diff --git a/backend/plugins/tapd/e2e/snapshot_tables/_tool_tapd_bugs_for_due_date.csv b/backend/plugins/tapd/e2e/snapshot_tables/_tool_tapd_bugs_for_due_date.csv
new file mode 100644
index 000000000..f32c4c94a
--- /dev/null
+++ b/backend/plugins/tapd/e2e/snapshot_tables/_tool_tapd_bugs_for_due_date.csv
@@ -0,0 +1,2 @@
+connection_id,id,epic_key,title,description,workspace_id,created,modified,status,cc,begin,due,priority,iteration_id,source,module,release_id,created_from,feature,severity,reporter,resolved,closed,lastmodify,auditer,de,fixer,version_test,version_report,version_close,version_fix,baseline_find,baseline_join,baseline_close,baseline_test,sourcephase,te,current_owner,resolution,originphase,confirmer,participator,closer,platform,os,testtype,testphase,frequency,regression_number,flows,testmode,i [...]
+1,11991001001025,,test-11test-11test-11test-11test-11est-11test-11test-11,"<div>test-11test-11test-11test-11test-11</div><div>1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11<a href=""http://insurance.xxx-com-sss/index-0212.html"" target=""_blank"">http://insurance.xxx-com-sss/index-0212.html</a>test-11</div><div>2test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11</div> [...]
diff --git a/backend/plugins/tapd/e2e/snapshot_tables/_tool_tapd_stories.csv b/backend/plugins/tapd/e2e/snapshot_tables/_tool_tapd_stories.csv
index 69ca4d527..672d85844 100644
--- a/backend/plugins/tapd/e2e/snapshot_tables/_tool_tapd_stories.csv
+++ b/backend/plugins/tapd/e2e/snapshot_tables/_tool_tapd_stories.csv
@@ -1,21 +1,21 @@
-connection_id,id,workitem_type_id,name,description,workspace_id,creator,created,modified,status,owner,cc,begin,due,size,priority,developer,iteration_id,test_focus,type,source,module,version,completed,category_id,path,parent_id,children_id,ancestor_id,business_value,effort,effort_completed,exceed,remain,release_id,confidential,templated_id,created_from,feature,std_status,std_type,url,attachment_count,has_attachment,bug_id,follower,sync_type,predecessor_count,is_archived,modifier,progress_ [...]
-1,11991001037563,11991001000026,test-11test-11test-11test-11test-11test-11test-11test-11,"<div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""test-11test-11"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:test-11test-11;mso-style-parent:"""";margin:0.00px;margin-bottom:0.00px;mso-pagination:none;text-align:justify;text-justify:inter-ideograph;font-family:Calibri [...]
-1,11991001037696,1146949574001000036,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2021-08-31T07:24:19.000+00:00,2021-09-03T08:13:49.000+00:00,test111test111,test-11test-11,,2021-08-31T16:00:00.000+00:00,2021-09-01T16:00:00.000+00:00,0,,,0,,技术债,,,,2021-09-03T08:13:49.000+00:00,11991001000175,11991001037696:,0,||11991001037697,11991001037696,,0,0,0,0,0,N,11991001001129,,,IN_PROGRESS,技术需求债务,https://www.tapd.cn/991/pro [...]
-1,11991001037697,11991001000026,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,"<div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""test-11test-11"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:test-11test-11;mso-style-parent:"""";margin:0.00px;margin-bottom:0.00px;mso-pagination:none;text-align:justify;text-j [...]
-1,11991001038322,11991001000269,PCtest-11test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2021-09-07T08:07:25.000+00:00,2021-10-15T10:51:24.000+00:00,test111test111,test-11test-11,,2021-09-12T16:00:00.000+00:00,2021-10-07T16:00:00.000+00:00,0,Middle,,0,,需求,,,,2021-10-08T06:33:50.000+00:00,11991001000175,11991001038322:,0,||11991001038323,11991001038322,,57,57,0,0,0,N,11991001001129,,,IN_PROGRESS,故事需求,https://www.tapd.cn/991/prong/stories/view/11991001038322,0,0,0,,,0 [...]
-1,11991001038323,1146949574001000036,PCtest-11test-11test-11test-11test-11test-11test-11test-11,"<div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""test-11test-11"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:test-11test-11;mso-style-parent:"""";margin:0.00px;margin-bottom:0.00px;mso-pagination:none;text-align:justify;text-justify:inter-ideograph;font-family: [...]
-1,11991001038697,11991001000026,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,"<div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""test-11test-11"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:test-11test-11;mso-style-parent:"""";margin:0.00px;margin-bottom:0.00px;mso-pagination:none;text-align:justify;text-justify: [...]
-1,11991001038911,11991001000269,PCtest-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2021-09-13T10:28:23.000+00:00,2022-03-26T08:56:07.000+00:00,test111test111test111,test-11test-11,,2021-09-13T16:00:00.000+00:00,2022-03-18T16:00:00.000+00:00,0,,,0,,需求,,,,2022-03-17T04:04:39.000+00:00,11991001000175,11991001038911:,0,||11991001038912,11991001038911,,22,21.5,-0.5,0,0,N,11991001001129,,"""""",IN_PROGRESS,故事需求,https://www.tapd.cn/991/prong/stories/view/11991001038911,0,0, [...]
-1,11991001038912,1146949574001000036,PCtest-11test-11test-11test-11test-11test-11test-11,"<div><div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""test-11test-11"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:test-11test-11;mso-style-parent:"""";margin:0.00px;margin-bottom:0.00px;mso-pagination:none;text-align:justify;text-justify:inter-ideograph;font-family:Ca [...]
-1,11991001039664,11991001000269,PCtest-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2021-09-24T07:46:47.000+00:00,2021-10-08T06:31:48.000+00:00,test111test111,test-11test-11,,2021-09-26T16:00:00.000+00:00,2021-09-29T16:00:00.000+00:00,0,,,0,,需求,,,,2021-10-08T06:31:48.000+00:00,11991001000175,11991001039664:,0,||11991001039673,11991001039664,,3,3,0,0,0,N,11991001001129,,,IN_PROGRESS,故事需求,https://www. [...]
-1,11991001039673,11991001000026,PCtest-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,"<div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""test-11test-11"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:test-11test-11;mso-style-parent:"""";margin:0.00px;margin-bottom:0.00px;mso-pagination:none;te [...]
-1,11991001040086,11991001000269,PCtest-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2021-09-29T06:52:01.000+00:00,2021-10-18T05:46:59.000+00:00,test111test111,test-11test-11,,2021-10-07T16:00:00.000+00:00,2021-10-26T16:00:00.000+00:00,0,,,0,,需求,,,,2021-10-18T05:46:59.000+00:00,11991001000175,11991001040086:,0,||11991001040088,11991001040086,,20,20,0,0,0,N,11991001001129,,,IN_PROGRESS,故事需求,https://www.tapd.cn/991/prong/stories/view/11991001040086,0 [...]
-1,11991001040088,1146949574001000036,PCtest-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,"<div><p></p><div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""test-11test-11"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:test-11test-11;mso-style-parent:"""";margin:0.00px;margin-bottom:0.00px;mso-pagination:none;text-align:justify;text-justify:in [...]
-1,11991001041163,11991001000269,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2021-10-19T07:58:33.000+00:00,2021-10-21T01:30:53.000+00:00,test111test111,test-11test-11,,2021-10-19T16:00:00.000+00:00,2021-10-20T16:00:00.000+00:00,0,,,0,,需求,,,,2021-10-21T01:30:53.000+00:00,11991001000175,11991001041163:,0,||11991001041164,11991001041163,,0,0,0,0,0,N,11991001001129,,,IN_PROGRESS,故事需求,https://www.tapd.cn/991/prong/stories/view/119910 [...]
-1,11991001041164,11991001000026,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,"<div><div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""test-11test-11"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:test-11test-11;mso-style-parent:"""";margin:0.00px;margin-bottom:0.00px;mso-pagination:none;text-align:justify;text-justify:in [...]
-1,11991001041165,11991001000269,PCtest-11test-11test-11test-11test-11test-11test-11testUnicode516btestUnicode671ftestUnicodeff09,"<div><p>testUnicode672ctestUnicode671ftestUnicode9700testUnicode8981testUnicode6539testUnicode9020testUnicode7684testUnicode9875testUnicode9762testUnicode6709</p><p>1testUnicode3001</p><p><a href=""http://news.xxx-com-sss/economy/"" rel=""noopener"" target=""_blank"">http://news.xxx-com-sss/economy/</a></p><p><a href=""http://news.xxx-com-sss/international/"" [...]
-1,11991001041166,1146949574001000035,PCtestUnicode7aefhttpstestUnicode6539testUnicode9020testUnicode5de5testUnicode4f5ctestUnicodeff08testUnicode7b2ctestUnicode516btestUnicode671ftestUnicodeff09,"<div><div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""testUnicode5b8btestUnicode4f53"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:testUnicode5b8btestUnicode6587;m [...]
-1,11991001041788,11991001000269,testUnicode300atestUnicode777ftestUnicode89c1testUnicode300btestUnicode680ftestUnicode76eetestUnicode9875testUnicodeff08pc&mtestUnicode7ad9testUnicodeff09,,991,testUnicode6768testUnicode4e39,2021-10-27T08:55:27.000+00:00,2021-11-30T10:04:48.000+00:00,test111test111,testUnicode6768testUnicode4e39,,2021-11-02T16:00:00.000+00:00,2021-11-29T16:00:00.000+00:00,0,,,0,,需求,,,,2021-11-30T05:57:19.000+00:00,11991001000175,11991001041788:,0,||11991001041789,119910010 [...]
-1,11991001041789,1146949574001000035,testUnicode300atestUnicode777ftestUnicode89c1testUnicode300btestUnicode680ftestUnicode76eetestUnicode9875testUnicodeff08pc&mtestUnicode7ad9testUnicodeff09,"<div><div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""testUnicode5b8btestUnicode4f53"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:testUnicode6b63testUnicode6587;mso- [...]
-1,11991001041899,11991001000269,2021testUnicode8d22testUnicode7ecftestUnicode98cetestUnicode4e91testUnicode699c,,991,testUnicode5218testUnicode5b87testUnicode6615,2021-10-28T02:56:01.000+00:00,2021-12-20T01:51:46.000+00:00,test111test111,testUnicode5218testUnicode5b87testUnicode6615,,2021-11-02T16:00:00.000+00:00,2021-12-07T16:00:00.000+00:00,0,Middle,,0,,需求,,,,2021-12-20T01:51:46.000+00:00,11991001000175,11991001041899:,0,||11991001041900|11991001042964,11991001041899,,250,250,0,0,0,N,1 [...]
-1,11991001041900,11991001000026,testUnicode4e3btestUnicode8bbatestUnicode575b-testUnicode4f1atestUnicode524d,"<div><div><div><div><div><div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div></div></div></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""testUnicode5b8btestUnicode4f53"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:testUnicode6b63testUnicode6587;mso-style-parent:"""";margin:0.00px;margin- [...]
+connection_id,id,workitem_type_id,name,description,workspace_id,creator,created,modified,status,owner,cc,begin,due,size,priority,developer,iteration_id,test_focus,type,source,module,version,completed,category_id,path,parent_id,children_id,ancestor_id,business_value,effort,effort_completed,exceed,remain,release_id,confidential,templated_id,created_from,feature,std_status,std_type,url,due_date,attachment_count,has_attachment,bug_id,follower,sync_type,predecessor_count,is_archived,modifier, [...]
+1,11991001037563,11991001000026,test-11test-11test-11test-11test-11test-11test-11test-11,"<div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""test-11test-11"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:test-11test-11;mso-style-parent:"""";margin:0.00px;margin-bottom:0.00px;mso-pagination:none;text-align:justify;text-justify:inter-ideograph;font-family:Calibri [...]
+1,11991001037696,1146949574001000036,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2021-08-31T07:24:19.000+00:00,2021-09-03T08:13:49.000+00:00,test111test111,test-11test-11,,2021-08-31T16:00:00.000+00:00,2021-09-01T16:00:00.000+00:00,0,,,0,,技术债,,,,2021-09-03T08:13:49.000+00:00,11991001000175,11991001037696:,0,||11991001037697,11991001037696,,0,0,0,0,0,N,11991001001129,,,IN_PROGRESS,技术需求债务,https://www.tapd.cn/991/pro [...]
+1,11991001037697,11991001000026,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,"<div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""test-11test-11"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:test-11test-11;mso-style-parent:"""";margin:0.00px;margin-bottom:0.00px;mso-pagination:none;text-align:justify;text-j [...]
+1,11991001038322,11991001000269,PCtest-11test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2021-09-07T08:07:25.000+00:00,2021-10-15T10:51:24.000+00:00,test111test111,test-11test-11,,2021-09-12T16:00:00.000+00:00,2021-10-07T16:00:00.000+00:00,0,Middle,,0,,需求,,,,2021-10-08T06:33:50.000+00:00,11991001000175,11991001038322:,0,||11991001038323,11991001038322,,57,57,0,0,0,N,11991001001129,,,IN_PROGRESS,故事需求,https://www.tapd.cn/991/prong/stories/view/11991001038322,2021-10-0 [...]
+1,11991001038323,1146949574001000036,PCtest-11test-11test-11test-11test-11test-11test-11test-11,"<div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""test-11test-11"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:test-11test-11;mso-style-parent:"""";margin:0.00px;margin-bottom:0.00px;mso-pagination:none;text-align:justify;text-justify:inter-ideograph;font-family: [...]
+1,11991001038697,11991001000026,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,"<div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""test-11test-11"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:test-11test-11;mso-style-parent:"""";margin:0.00px;margin-bottom:0.00px;mso-pagination:none;text-align:justify;text-justify: [...]
+1,11991001038911,11991001000269,PCtest-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2021-09-13T10:28:23.000+00:00,2022-03-26T08:56:07.000+00:00,test111test111test111,test-11test-11,,2021-09-13T16:00:00.000+00:00,2022-03-18T16:00:00.000+00:00,0,,,0,,需求,,,,2022-03-17T04:04:39.000+00:00,11991001000175,11991001038911:,0,||11991001038912,11991001038911,,22,21.5,-0.5,0,0,N,11991001001129,,"""""",IN_PROGRESS,故事需求,https://www.tapd.cn/991/prong/stories/view/11991001038911,2022 [...]
+1,11991001038912,1146949574001000036,PCtest-11test-11test-11test-11test-11test-11test-11,"<div><div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""test-11test-11"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:test-11test-11;mso-style-parent:"""";margin:0.00px;margin-bottom:0.00px;mso-pagination:none;text-align:justify;text-justify:inter-ideograph;font-family:Ca [...]
+1,11991001039664,11991001000269,PCtest-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2021-09-24T07:46:47.000+00:00,2021-10-08T06:31:48.000+00:00,test111test111,test-11test-11,,2021-09-26T16:00:00.000+00:00,2021-09-29T16:00:00.000+00:00,0,,,0,,需求,,,,2021-10-08T06:31:48.000+00:00,11991001000175,11991001039664:,0,||11991001039673,11991001039664,,3,3,0,0,0,N,11991001001129,,,IN_PROGRESS,故事需求,https://www. [...]
+1,11991001039673,11991001000026,PCtest-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,"<div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""test-11test-11"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:test-11test-11;mso-style-parent:"""";margin:0.00px;margin-bottom:0.00px;mso-pagination:none;te [...]
+1,11991001040086,11991001000269,PCtest-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2021-09-29T06:52:01.000+00:00,2021-10-18T05:46:59.000+00:00,test111test111,test-11test-11,,2021-10-07T16:00:00.000+00:00,2021-10-26T16:00:00.000+00:00,0,,,0,,需求,,,,2021-10-18T05:46:59.000+00:00,11991001000175,11991001040086:,0,||11991001040088,11991001040086,,20,20,0,0,0,N,11991001001129,,,IN_PROGRESS,故事需求,https://www.tapd.cn/991/prong/stories/view/11991001040086,2 [...]
+1,11991001040088,1146949574001000036,PCtest-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,"<div><p></p><div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""test-11test-11"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:test-11test-11;mso-style-parent:"""";margin:0.00px;margin-bottom:0.00px;mso-pagination:none;text-align:justify;text-justify:in [...]
+1,11991001041163,11991001000269,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2021-10-19T07:58:33.000+00:00,2021-10-21T01:30:53.000+00:00,test111test111,test-11test-11,,2021-10-19T16:00:00.000+00:00,2021-10-20T16:00:00.000+00:00,0,,,0,,需求,,,,2021-10-21T01:30:53.000+00:00,11991001000175,11991001041163:,0,||11991001041164,11991001041163,,0,0,0,0,0,N,11991001001129,,,IN_PROGRESS,故事需求,https://www.tapd.cn/991/prong/stories/view/119910 [...]
+1,11991001041164,11991001000026,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,"<div><div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""test-11test-11"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:test-11test-11;mso-style-parent:"""";margin:0.00px;margin-bottom:0.00px;mso-pagination:none;text-align:justify;text-justify:in [...]
+1,11991001041165,11991001000269,PCtest-11test-11test-11test-11test-11test-11test-11testUnicode516btestUnicode671ftestUnicodeff09,"<div><p>testUnicode672ctestUnicode671ftestUnicode9700testUnicode8981testUnicode6539testUnicode9020testUnicode7684testUnicode9875testUnicode9762testUnicode6709</p><p>1testUnicode3001</p><p><a href=""http://news.xxx-com-sss/economy/"" rel=""noopener"" target=""_blank"">http://news.xxx-com-sss/economy/</a></p><p><a href=""http://news.xxx-com-sss/international/"" [...]
+1,11991001041166,1146949574001000035,PCtestUnicode7aefhttpstestUnicode6539testUnicode9020testUnicode5de5testUnicode4f5ctestUnicodeff08testUnicode7b2ctestUnicode516btestUnicode671ftestUnicodeff09,"<div><div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""testUnicode5b8btestUnicode4f53"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:testUnicode5b8btestUnicode6587;m [...]
+1,11991001041788,11991001000269,testUnicode300atestUnicode777ftestUnicode89c1testUnicode300btestUnicode680ftestUnicode76eetestUnicode9875testUnicodeff08pc&mtestUnicode7ad9testUnicodeff09,,991,testUnicode6768testUnicode4e39,2021-10-27T08:55:27.000+00:00,2021-11-30T10:04:48.000+00:00,test111test111,testUnicode6768testUnicode4e39,,2021-11-02T16:00:00.000+00:00,2021-11-29T16:00:00.000+00:00,0,,,0,,需求,,,,2021-11-30T05:57:19.000+00:00,11991001000175,11991001041788:,0,||11991001041789,119910010 [...]
+1,11991001041789,1146949574001000035,testUnicode300atestUnicode777ftestUnicode89c1testUnicode300btestUnicode680ftestUnicode76eetestUnicode9875testUnicodeff08pc&mtestUnicode7ad9testUnicodeff09,"<div><div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""testUnicode5b8btestUnicode4f53"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:testUnicode6b63testUnicode6587;mso- [...]
+1,11991001041899,11991001000269,2021testUnicode8d22testUnicode7ecftestUnicode98cetestUnicode4e91testUnicode699c,,991,testUnicode5218testUnicode5b87testUnicode6615,2021-10-28T02:56:01.000+00:00,2021-12-20T01:51:46.000+00:00,test111test111,testUnicode5218testUnicode5b87testUnicode6615,,2021-11-02T16:00:00.000+00:00,2021-12-07T16:00:00.000+00:00,0,Middle,,0,,需求,,,,2021-12-20T01:51:46.000+00:00,11991001000175,11991001041899:,0,||11991001041900|11991001042964,11991001041899,,250,250,0,0,0,N,1 [...]
+1,11991001041900,11991001000026,testUnicode4e3btestUnicode8bbatestUnicode575b-testUnicode4f1atestUnicode524d,"<div><div><div><div><div><div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div></div></div></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""testUnicode5b8btestUnicode4f53"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:testUnicode6b63testUnicode6587;mso-style-parent:"""";margin:0.00px;margin- [...]
diff --git a/backend/plugins/tapd/e2e/snapshot_tables/_tool_tapd_stories_for_due_date.csv b/backend/plugins/tapd/e2e/snapshot_tables/_tool_tapd_stories_for_due_date.csv
new file mode 100644
index 000000000..f6c14a879
--- /dev/null
+++ b/backend/plugins/tapd/e2e/snapshot_tables/_tool_tapd_stories_for_due_date.csv
@@ -0,0 +1,2 @@
+connection_id,id,workitem_type_id,name,description,workspace_id,creator,created,modified,status,owner,cc,begin,due,size,priority,developer,iteration_id,test_focus,type,source,module,version,completed,category_id,path,parent_id,children_id,ancestor_id,business_value,effort,effort_completed,exceed,remain,release_id,confidential,templated_id,created_from,feature,std_status,std_type,url,due_date,attachment_count,has_attachment,bug_id,follower,sync_type,predecessor_count,is_archived,modifier, [...]
+1,11991001037563,11991001000026,test-11test-11test-11test-11test-11test-11test-11test-11,"<div><div><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--></div></div><style>@font-face{font-family:""Times New Roman"";}@font-face{font-family:""test-11test-11"";}@font-face{font-family:""Calibri"";}p.MsoNormal{mso-style-name:test-11test-11;mso-style-parent:"""";margin:0.00px;margin-bottom:0.00px;mso-pagination:none;text-align:justify;text-justify:inter-ideograph;font-family:Calibri [...]
diff --git a/backend/plugins/tapd/e2e/snapshot_tables/_tool_tapd_tasks.csv b/backend/plugins/tapd/e2e/snapshot_tables/_tool_tapd_tasks.csv
index 9f24f4eec..d505aa9a4 100644
--- a/backend/plugins/tapd/e2e/snapshot_tables/_tool_tapd_tasks.csv
+++ b/backend/plugins/tapd/e2e/snapshot_tables/_tool_tapd_tasks.csv
@@ -1,16 +1,16 @@
-connection_id,id,name,description,workspace_id,creator,created,modified,status,owner,cc,begin,due,priority,iteration_id,completed,effort,effort_completed,exceed,remain,std_status,std_type,type,story_id,progress,has_attachment,url,attachment_count,follower,created_from,predecessor_count,successor_count,release_id,label,new_story_id,custom_field_one,custom_field_two,custom_field_three,custom_field_four,custom_field_five,custom_field_six,custom_field_seven,custom_field_eight,custom_field_9, [...]
-1,11991001015107,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2020-11-03T09:52:00.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11,,2020-11-02T16:00:00.000+00:00,2020-11-02T16:00:00.000+00:00,,0,2020-11-03T09:53:39.000+00:00,9,9,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015107,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-1,11991001015121,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11;,2020-11-03T10:39:57.000+00:00,2020-11-03T10:40:17.000+00:00,done,test-11test-11,,2020-11-02T16:00:00.000+00:00,2020-11-02T16:00:00.000+00:00,,0,2020-11-03T10:40:17.000+00:00,9,9,0,0,DONE,任务,TASK,0,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015121,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-1,11991001015142,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11test-11,2020-11-03T10:58:43.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11test-11,,2020-11-02T16:00:00.000+00:00,2020-11-02T16:00:00.000+00:00,,0,2020-11-03T11:00:18.000+00:00,9,9,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015142,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-1,11991001015184,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2020-11-04T09:12:11.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11,,2020-11-03T16:00:00.000+00:00,2020-11-03T16:00:00.000+00:00,,0,2020-11-04T09:14:22.000+00:00,9,9,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015184,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-1,11991001015203,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11test-11,2020-11-04T10:38:10.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11test-11,,2020-11-03T16:00:00.000+00:00,2020-11-03T16:00:00.000+00:00,,0,2020-11-04T10:38:54.000+00:00,9,9,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015203,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-1,11991001015207,pctest-11test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2020-11-04T10:43:02.000+00:00,2020-11-10T11:01:47.000+00:00,done,test-11test-11,test-11test-11;,2020-11-03T16:00:00.000+00:00,2020-11-09T16:00:00.000+00:00,,0,2020-11-10T11:01:47.000+00:00,27,27,0,0,DONE,任务,TASK,0,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015207,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-1,11991001015253,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2020-11-05T08:49:42.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11,,2020-11-04T16:00:00.000+00:00,2020-11-04T16:00:00.000+00:00,,0,2020-11-05T08:50:55.000+00:00,9,9,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015253,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-1,11991001015307,Mtest-11test-11test-11test-11test-11,,991,test-11test-11,2020-11-05T11:12:13.000+00:00,2020-11-06T11:03:43.000+00:00,done,test-11test-11,,2020-11-04T16:00:00.000+00:00,2020-11-05T16:00:00.000+00:00,,0,2020-11-06T11:03:43.000+00:00,19,18,-1,0,DONE,任务,TASK,0,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015307,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-1,11991001015309,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11test-11,2020-11-05T11:14:41.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11test-11,,2020-11-04T16:00:00.000+00:00,2020-11-04T16:00:00.000+00:00,,0,2020-11-05T11:16:00.000+00:00,9,9,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015309,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-1,11991001015340,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2020-11-06T09:10:44.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11,,2020-11-05T16:00:00.000+00:00,2020-11-05T16:00:00.000+00:00,,0,2020-11-06T09:12:19.000+00:00,9,9,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015340,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-1,11991001015361,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11test-11,2020-11-06T10:49:54.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11test-11,,2020-11-05T16:00:00.000+00:00,2020-11-05T16:00:00.000+00:00,,0,2020-11-06T10:50:31.000+00:00,9,9,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015361,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-1,11991001015431,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11test-11,2020-11-09T04:45:27.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11test-11,,2020-11-08T16:00:00.000+00:00,2020-11-08T16:00:00.000+00:00,,0,2020-11-09T04:46:54.000+00:00,3,3,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015431,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-1,11991001015441,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2020-11-09T09:14:15.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11,,2020-11-08T16:00:00.000+00:00,2020-11-08T16:00:00.000+00:00,,0,2020-11-09T09:16:32.000+00:00,9,9,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015441,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-1,11991001015452,Mtest-11test-11test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2020-11-09T10:22:28.000+00:00,2020-11-11T10:47:24.000+00:00,done,test-11test-11,,2020-11-08T16:00:00.000+00:00,2020-11-10T16:00:00.000+00:00,,0,2020-11-11T10:47:24.000+00:00,27,27,0,0,DONE,任务,TASK,0,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015452,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-1,11991001015583,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11test-11,2020-11-10T03:45:34.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11test-11,,2020-11-09T16:00:00.000+00:00,2020-11-09T16:00:00.000+00:00,,0,2020-11-10T03:47:30.000+00:00,3,3,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015583,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+connection_id,id,name,description,workspace_id,creator,created,modified,status,owner,cc,begin,due,priority,iteration_id,completed,effort,effort_completed,exceed,remain,std_status,std_type,type,story_id,progress,has_attachment,url,due_date,attachment_count,follower,created_from,predecessor_count,successor_count,release_id,label,new_story_id,custom_field_one,custom_field_two,custom_field_three,custom_field_four,custom_field_five,custom_field_six,custom_field_seven,custom_field_eight,custom [...]
+1,11991001015107,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2020-11-03T09:52:00.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11,,2020-11-02T16:00:00.000+00:00,2020-11-02T16:00:00.000+00:00,,0,2020-11-03T09:53:39.000+00:00,9,9,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015107,2020-11-02T16:00:00.000+00:00,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+1,11991001015121,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11;,2020-11-03T10:39:57.000+00:00,2020-11-03T10:40:17.000+00:00,done,test-11test-11,,2020-11-02T16:00:00.000+00:00,2020-11-02T16:00:00.000+00:00,,0,2020-11-03T10:40:17.000+00:00,9,9,0,0,DONE,任务,TASK,0,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015121,2020-11-02T16:00:00.000+00:00,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+1,11991001015142,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11test-11,2020-11-03T10:58:43.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11test-11,,2020-11-02T16:00:00.000+00:00,2020-11-02T16:00:00.000+00:00,,0,2020-11-03T11:00:18.000+00:00,9,9,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015142,2020-11-02T16:00:00.000+00:00,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+1,11991001015184,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2020-11-04T09:12:11.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11,,2020-11-03T16:00:00.000+00:00,2020-11-03T16:00:00.000+00:00,,0,2020-11-04T09:14:22.000+00:00,9,9,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015184,2020-11-03T16:00:00.000+00:00,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+1,11991001015203,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11test-11,2020-11-04T10:38:10.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11test-11,,2020-11-03T16:00:00.000+00:00,2020-11-03T16:00:00.000+00:00,,0,2020-11-04T10:38:54.000+00:00,9,9,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015203,2020-11-03T16:00:00.000+00:00,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+1,11991001015207,pctest-11test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2020-11-04T10:43:02.000+00:00,2020-11-10T11:01:47.000+00:00,done,test-11test-11,test-11test-11;,2020-11-03T16:00:00.000+00:00,2020-11-09T16:00:00.000+00:00,,0,2020-11-10T11:01:47.000+00:00,27,27,0,0,DONE,任务,TASK,0,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015207,2020-11-09T16:00:00.000+00:00,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+1,11991001015253,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2020-11-05T08:49:42.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11,,2020-11-04T16:00:00.000+00:00,2020-11-04T16:00:00.000+00:00,,0,2020-11-05T08:50:55.000+00:00,9,9,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015253,2020-11-04T16:00:00.000+00:00,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+1,11991001015307,Mtest-11test-11test-11test-11test-11,,991,test-11test-11,2020-11-05T11:12:13.000+00:00,2020-11-06T11:03:43.000+00:00,done,test-11test-11,,2020-11-04T16:00:00.000+00:00,2020-11-05T16:00:00.000+00:00,,0,2020-11-06T11:03:43.000+00:00,19,18,-1,0,DONE,任务,TASK,0,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015307,2020-11-05T16:00:00.000+00:00,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+1,11991001015309,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11test-11,2020-11-05T11:14:41.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11test-11,,2020-11-04T16:00:00.000+00:00,2020-11-04T16:00:00.000+00:00,,0,2020-11-05T11:16:00.000+00:00,9,9,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015309,2020-11-04T16:00:00.000+00:00,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+1,11991001015340,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2020-11-06T09:10:44.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11,,2020-11-05T16:00:00.000+00:00,2020-11-05T16:00:00.000+00:00,,0,2020-11-06T09:12:19.000+00:00,9,9,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015340,2020-11-05T16:00:00.000+00:00,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+1,11991001015361,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11test-11,2020-11-06T10:49:54.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11test-11,,2020-11-05T16:00:00.000+00:00,2020-11-05T16:00:00.000+00:00,,0,2020-11-06T10:50:31.000+00:00,9,9,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015361,2020-11-05T16:00:00.000+00:00,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+1,11991001015431,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11test-11,2020-11-09T04:45:27.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11test-11,,2020-11-08T16:00:00.000+00:00,2020-11-08T16:00:00.000+00:00,,0,2020-11-09T04:46:54.000+00:00,3,3,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015431,2020-11-08T16:00:00.000+00:00,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+1,11991001015441,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2020-11-09T09:14:15.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11,,2020-11-08T16:00:00.000+00:00,2020-11-08T16:00:00.000+00:00,,0,2020-11-09T09:16:32.000+00:00,9,9,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015441,2020-11-08T16:00:00.000+00:00,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+1,11991001015452,Mtest-11test-11test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2020-11-09T10:22:28.000+00:00,2020-11-11T10:47:24.000+00:00,done,test-11test-11,,2020-11-08T16:00:00.000+00:00,2020-11-10T16:00:00.000+00:00,,0,2020-11-11T10:47:24.000+00:00,27,27,0,0,DONE,任务,TASK,0,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015452,2020-11-10T16:00:00.000+00:00,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+1,11991001015583,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11test-11,2020-11-10T03:45:34.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11test-11,,2020-11-09T16:00:00.000+00:00,2020-11-09T16:00:00.000+00:00,,0,2020-11-10T03:47:30.000+00:00,3,3,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015583,2020-11-09T16:00:00.000+00:00,0,,,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
diff --git a/backend/plugins/tapd/e2e/snapshot_tables/_tool_tapd_tasks_for_due_date.csv b/backend/plugins/tapd/e2e/snapshot_tables/_tool_tapd_tasks_for_due_date.csv
new file mode 100644
index 000000000..9be8da6f0
--- /dev/null
+++ b/backend/plugins/tapd/e2e/snapshot_tables/_tool_tapd_tasks_for_due_date.csv
@@ -0,0 +1,2 @@
+connection_id,id,name,description,workspace_id,creator,created,modified,status,owner,cc,begin,due,priority,iteration_id,completed,effort,effort_completed,exceed,remain,std_status,std_type,type,story_id,progress,has_attachment,url,due_date,attachment_count,follower,created_from,predecessor_count,successor_count,release_id,label,new_story_id,custom_field_one,custom_field_two,custom_field_three,custom_field_four,custom_field_five,custom_field_six,custom_field_seven,custom_field_eight,custom [...]
+1,11991001015107,test-11test-11test-11test-11test-11test-11test-11,,991,test-11test-11,2020-11-03T09:52:00.000+00:00,2022-06-01T11:53:30.000+00:00,done,test-11test-11,,2020-11-02T16:00:00.000+00:00,2020-11-02T16:00:00.000+00:00,,0,2020-11-03T09:53:39.000+00:00,9,9,0,0,DONE,任务,TASK,11991001001301,100,,https://www.tapd.cn/991/prong/tasks/view/11991001015107,2025-03-03T16:00:00.000+00:00,0,,,0,0,0,,0,2025-03-04,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
diff --git a/backend/plugins/tapd/e2e/snapshot_tables/issue_bug.csv b/backend/plugins/tapd/e2e/snapshot_tables/issues_bug.csv
similarity index 77%
rename from backend/plugins/tapd/e2e/snapshot_tables/issue_bug.csv
rename to backend/plugins/tapd/e2e/snapshot_tables/issues_bug.csv
index a97fb09cd..66ac5324b 100644
--- a/backend/plugins/tapd/e2e/snapshot_tables/issue_bug.csv
+++ b/backend/plugins/tapd/e2e/snapshot_tables/issues_bug.csv
@@ -1,21 +1,21 @@
-id,url,issue_key,title,description,epic_key,type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,parent_issue_id,priority,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,assignee_id,assignee_name,severity,component,icon_url,creator_name,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
-tapd:TapdBug:1:11991001001025,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001025,11991001001025,test-11test-11test-11test-11test-11est-11test-11test-11,,,缺陷,完成,已关闭,,2020-02-14T07:14:30.000+00:00,2020-02-13T06:04:29.000+00:00,2020-02-14T08:50:03.000+00:00,1510,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11.,,,normal,,,test-11test-11.,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1271,
-tapd:TapdBug:1:11991001001030,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001030,11991001001030,test-11test-11test-11t11test-11,,,缺陷,处理中,接受/处理,,2020-02-14T07:12:58.000+00:00,2020-02-13T06:33:47.000+00:00,2020-02-17T03:57:42.000+00:00,1479,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11.,,,normal,,,test-11test-11.,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1272,
-tapd:TapdBug:1:11991001001031,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001031,11991001001031,test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,缺陷,处理中,接受/处理,,2020-02-14T08:30:23.000+00:00,2020-02-13T06:45:11.000+00:00,2020-02-17T03:56:58.000+00:00,1545,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11.,,,normal,,,test-11test-11.,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1273,
-tapd:TapdBug:1:11991001001032,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001032,11991001001032,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,缺陷,完成,已关闭,,2020-02-13T09:33:17.000+00:00,2020-02-13T06:50:33.000+00:00,2020-02-17T03:56:36.000+00:00,162,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11.,,,normal,,,test-11test-11.,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bu [...]
-tapd:TapdBug:1:11991001001417,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001417,11991001001417,test-11test-11-11test-11tesst-11test-11test-11test-11,,,缺陷,,已拒绝,,,2020-02-25T08:01:11.000+00:00,2020-03-04T08:12:14.000+00:00,,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,normal,,,test-11test-11test-11,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1275,
-tapd:TapdBug:1:11991001001418,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001418,11991001001418,test-11tesest-11test-11,,,缺陷,,已拒绝,,,2020-02-25T08:04:12.000+00:00,2020-03-04T08:27:29.000+00:00,,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,normal,,,test-11test-11test-11,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1276,
-tapd:TapdBug:1:11991001001420,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001420,11991001001420,test-11test-11test-11test-11test-11,,,缺陷,完成,已关闭,,2020-03-04T07:41:18.000+00:00,2020-02-25T08:07:04.000+00:00,2020-03-04T08:20:12.000+00:00,11494,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,,,normal,,,test-11test-11test-11,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1277,
-tapd:TapdBug:1:11991001001422,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001422,11991001001422,test-11te11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,缺陷,,已拒绝,,,2020-02-25T08:10:51.000+00:00,2020-03-04T08:12:17.000+00:00,,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,normal,,,test-11test-11test-11,"{""ConnectionId"":1,""WorkspaceId"": [...]
-tapd:TapdBug:1:11991001001423,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001423,11991001001423,test--11test-11test-11test-11test-11test-11,,,缺陷,,已拒绝,,,2020-02-25T08:12:56.000+00:00,2020-03-04T08:25:19.000+00:00,,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,normal,,,test-11test-11test-11,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1279,
-tapd:TapdBug:1:11991001001425,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001425,11991001001425,test-11test1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,缺陷,完成,已关闭,,2020-03-04T07:41:01.000+00:00,2020-02-25T08:18:40.000+00:00,2020-03-04T08:19:48.000+00:00,11482,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,,,normal,,,test-11test-11test-11,"{""Connecti [...]
-tapd:TapdBug:1:11991001001426,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001426,11991001001426,test-11test-11te11test-11test-11test-11test-11test-11,,,缺陷,,已拒绝,,,2020-02-25T08:23:39.000+00:00,2020-03-04T08:12:19.000+00:00,,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,normal,,,test-11test-11test-11,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1281,
-tapd:TapdBug:1:11991001001447,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001447,11991001001447,IE11 test-11te1test-11test-11test-11,,,缺陷,完成,已关闭,,2020-03-17T08:43:28.000+00:00,2020-02-27T03:06:59.000+00:00,2020-03-18T08:24:37.000+00:00,27696,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,,,normal,,,test-11test-11test-11,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1282,
-tapd:TapdBug:1:11991001001448,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001448,11991001001448,IE11 test-11test-11test-11test-11test-11test-11,,,缺陷,,已拒绝,,,2020-02-27T03:14:02.000+00:00,2020-04-27T02:53:11.000+00:00,,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,normal,,,test-11test-11test-11,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1283,
-tapd:TapdBug:1:11991001001450,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001450,11991001001450,IE11 tes-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,缺陷,完成,已关闭,,2020-03-17T08:43:04.000+00:00,2020-02-27T03:18:04.000+00:00,2020-03-18T08:24:15.000+00:00,27685,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,,,normal,,,test-11test-11test-11,"{""Connectio [...]
-tapd:TapdBug:1:11991001001451,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001451,11991001001451,IE11 test-11test-11test-st-11test-11,,,缺陷,完成,已关闭,,2020-03-17T08:42:17.000+00:00,2020-02-27T03:36:29.000+00:00,2020-03-18T08:23:08.000+00:00,27665,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,,,normal,,,test-11test-11test-11,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1285,
-tapd:TapdBug:1:11991001001710,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001710,11991001001710,test-11-11test-11test-11test-11test-11test-11test-11test-11test-11,,,缺陷,,已拒绝,,,2020-03-13T06:14:26.000+00:00,2020-04-01T09:38:36.000+00:00,,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,normal,,,test-11test-11test-11,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1286,
-tapd:TapdBug:1:11991001001711,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001711,11991001001711,test-11tesst-11test-11test-11test-11test-11test-11test-11test-11...test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11...test-11,,,缺陷,,已拒绝,,,2020-03-13T06:20:04.000+00:00,2020-04-01T09:37:52.000+00:00,,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,tes [...]
-tapd:TapdBug:1:11991001001737,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001737,11991001001737,test-11tesst-11test-1test-11test-11test-11test-11test-11test-11test-11,,,缺陷,完成,已关闭,,2020-03-26T08:31:05.000+00:00,2020-03-18T07:27:14.000+00:00,2020-03-26T09:02:54.000+00:00,11583,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,,,normal,,,test-11test-11test-11,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1288,
-tapd:TapdBug:1:11991001001739,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001739,11991001001739,tt6d3btt52a8tt62a5tt5730tt65b986tt7a7att683c,,,缺陷,完成,已关闭,,2020-03-26T08:25:10.000+00:00,2020-03-18T07:32:55.000+00:00,2020-03-26T09:02:37.000+00:00,11572,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:tt90ddtt9a81tt5bb5,,,normal,,,tt90ddtt9a81tt5bb5,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1289,
-tapd:TapdBug:1:11991001001740,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001740,11991001001740,tt6d3btt52a8tt6ctt5230tt4e13tt5bb6tt4ecbtt7ecdtt9875,,,缺陷,,已拒绝,,,2020-03-18T07:37:43.000+00:00,2020-03-25T02:38:34.000+00:00,,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:郝骁宵,tapd:TapdAccount:1:郝骁宵,郝骁宵,normal,,,郝骁宵,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1290,
+id,url,issue_key,title,description,epic_key,type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,parent_issue_id,priority,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,assignee_id,assignee_name,severity,component,icon_url,creator_name,due_date,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
+tapd:TapdBug:1:11991001001025,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001025,11991001001025,test-11test-11test-11test-11test-11est-11test-11test-11,,,缺陷,完成,已关闭,,2020-02-14T07:14:30.000+00:00,2020-02-13T06:04:29.000+00:00,2020-02-14T08:50:03.000+00:00,1510,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11.,,,normal,,,test-11test-11.,2021-10-10T16:00:00.000+00:00,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1271,
+tapd:TapdBug:1:11991001001030,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001030,11991001001030,test-11test-11test-11t11test-11,,,缺陷,处理中,接受/处理,,2020-02-14T07:12:58.000+00:00,2020-02-13T06:33:47.000+00:00,2020-02-17T03:57:42.000+00:00,1479,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11.,,,normal,,,test-11test-11.,,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1272,
+tapd:TapdBug:1:11991001001031,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001031,11991001001031,test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,缺陷,处理中,接受/处理,,2020-02-14T08:30:23.000+00:00,2020-02-13T06:45:11.000+00:00,2020-02-17T03:56:58.000+00:00,1545,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11.,,,normal,,,test-11test-11.,,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1273,
+tapd:TapdBug:1:11991001001032,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001032,11991001001032,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,缺陷,完成,已关闭,,2020-02-13T09:33:17.000+00:00,2020-02-13T06:50:33.000+00:00,2020-02-17T03:56:36.000+00:00,162,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11.,,,normal,,,test-11test-11.,,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_b [...]
+tapd:TapdBug:1:11991001001417,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001417,11991001001417,test-11test-11-11test-11tesst-11test-11test-11test-11,,,缺陷,,已拒绝,,,2020-02-25T08:01:11.000+00:00,2020-03-04T08:12:14.000+00:00,,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,normal,,,test-11test-11test-11,,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1275,
+tapd:TapdBug:1:11991001001418,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001418,11991001001418,test-11tesest-11test-11,,,缺陷,,已拒绝,,,2020-02-25T08:04:12.000+00:00,2020-03-04T08:27:29.000+00:00,,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,normal,,,test-11test-11test-11,,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1276,
+tapd:TapdBug:1:11991001001420,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001420,11991001001420,test-11test-11test-11test-11test-11,,,缺陷,完成,已关闭,,2020-03-04T07:41:18.000+00:00,2020-02-25T08:07:04.000+00:00,2020-03-04T08:20:12.000+00:00,11494,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,,,normal,,,test-11test-11test-11,,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1277,
+tapd:TapdBug:1:11991001001422,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001422,11991001001422,test-11te11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,缺陷,,已拒绝,,,2020-02-25T08:10:51.000+00:00,2020-03-04T08:12:17.000+00:00,,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,normal,,,test-11test-11test-11,,"{""ConnectionId"":1,""WorkspaceId"" [...]
+tapd:TapdBug:1:11991001001423,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001423,11991001001423,test--11test-11test-11test-11test-11test-11,,,缺陷,,已拒绝,,,2020-02-25T08:12:56.000+00:00,2020-03-04T08:25:19.000+00:00,,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,normal,,,test-11test-11test-11,,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1279,
+tapd:TapdBug:1:11991001001425,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001425,11991001001425,test-11test1test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,缺陷,完成,已关闭,,2020-03-04T07:41:01.000+00:00,2020-02-25T08:18:40.000+00:00,2020-03-04T08:19:48.000+00:00,11482,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,,,normal,,,test-11test-11test-11,,"{""Connect [...]
+tapd:TapdBug:1:11991001001426,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001426,11991001001426,test-11test-11te11test-11test-11test-11test-11test-11,,,缺陷,,已拒绝,,,2020-02-25T08:23:39.000+00:00,2020-03-04T08:12:19.000+00:00,,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,normal,,,test-11test-11test-11,,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1281,
+tapd:TapdBug:1:11991001001447,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001447,11991001001447,IE11 test-11te1test-11test-11test-11,,,缺陷,完成,已关闭,,2020-03-17T08:43:28.000+00:00,2020-02-27T03:06:59.000+00:00,2020-03-18T08:24:37.000+00:00,27696,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,,,normal,,,test-11test-11test-11,,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1282,
+tapd:TapdBug:1:11991001001448,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001448,11991001001448,IE11 test-11test-11test-11test-11test-11test-11,,,缺陷,,已拒绝,,,2020-02-27T03:14:02.000+00:00,2020-04-27T02:53:11.000+00:00,,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,normal,,,test-11test-11test-11,,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1283,
+tapd:TapdBug:1:11991001001450,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001450,11991001001450,IE11 tes-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,缺陷,完成,已关闭,,2020-03-17T08:43:04.000+00:00,2020-02-27T03:18:04.000+00:00,2020-03-18T08:24:15.000+00:00,27685,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,,,normal,,,test-11test-11test-11,,"{""Connecti [...]
+tapd:TapdBug:1:11991001001451,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001451,11991001001451,IE11 test-11test-11test-st-11test-11,,,缺陷,完成,已关闭,,2020-03-17T08:42:17.000+00:00,2020-02-27T03:36:29.000+00:00,2020-03-18T08:23:08.000+00:00,27665,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,,,normal,,,test-11test-11test-11,,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1285,
+tapd:TapdBug:1:11991001001710,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001710,11991001001710,test-11-11test-11test-11test-11test-11test-11test-11test-11test-11,,,缺陷,,已拒绝,,,2020-03-13T06:14:26.000+00:00,2020-04-01T09:38:36.000+00:00,,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,normal,,,test-11test-11test-11,,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1286,
+tapd:TapdBug:1:11991001001711,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001711,11991001001711,test-11tesst-11test-11test-11test-11test-11test-11test-11test-11...test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11...test-11,,,缺陷,,已拒绝,,,2020-03-13T06:20:04.000+00:00,2020-04-01T09:37:52.000+00:00,,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,tes [...]
+tapd:TapdBug:1:11991001001737,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001737,11991001001737,test-11tesst-11test-1test-11test-11test-11test-11test-11test-11test-11,,,缺陷,完成,已关闭,,2020-03-26T08:31:05.000+00:00,2020-03-18T07:27:14.000+00:00,2020-03-26T09:02:54.000+00:00,11583,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11test-11,,,normal,,,test-11test-11test-11,,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1288,
+tapd:TapdBug:1:11991001001739,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001739,11991001001739,tt6d3btt52a8tt62a5tt5730tt65b986tt7a7att683c,,,缺陷,完成,已关闭,,2020-03-26T08:25:10.000+00:00,2020-03-18T07:32:55.000+00:00,2020-03-26T09:02:37.000+00:00,11572,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:tt90ddtt9a81tt5bb5,,,normal,,,tt90ddtt9a81tt5bb5,,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1289,
+tapd:TapdBug:1:11991001001740,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001740,11991001001740,tt6d3btt52a8tt6ctt5230tt4e13tt5bb6tt4ecbtt7ecdtt9875,,,缺陷,,已拒绝,,,2020-03-18T07:37:43.000+00:00,2020-03-25T02:38:34.000+00:00,,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:郝骁宵,tapd:TapdAccount:1:郝骁宵,郝骁宵,normal,,,郝骁宵,,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1290,
diff --git a/backend/plugins/tapd/e2e/snapshot_tables/issues_bug_for_due_date.csv b/backend/plugins/tapd/e2e/snapshot_tables/issues_bug_for_due_date.csv
new file mode 100644
index 000000000..e4c0d4696
--- /dev/null
+++ b/backend/plugins/tapd/e2e/snapshot_tables/issues_bug_for_due_date.csv
@@ -0,0 +1,2 @@
+id,url,issue_key,title,description,epic_key,type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,parent_issue_id,priority,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,assignee_id,assignee_name,severity,component,icon_url,creator_name,due_date,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
+tapd:TapdBug:1:11991001001025,https://www.tapd.cn/991/bugtrace/bugs/view?bug_id=11991001001025,11991001001025,test-11test-11test-11test-11test-11est-11test-11test-11,,,缺陷,完成,已关闭,,2020-02-14T07:14:30.000+00:00,2020-02-13T06:04:29.000+00:00,2020-02-14T08:50:03.000+00:00,1510,tapd:TapdBug:1:0,medium,,,,tapd:TapdAccount:1:test-11test-11.,,,normal,,,test-11test-11.,2025-03-03T16:00:00.000+00:00,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_bugs,1271,
diff --git a/backend/plugins/tapd/e2e/snapshot_tables/issues_story.csv b/backend/plugins/tapd/e2e/snapshot_tables/issues_story.csv
index 6984d7014..c28323be7 100644
--- a/backend/plugins/tapd/e2e/snapshot_tables/issues_story.csv
+++ b/backend/plugins/tapd/e2e/snapshot_tables/issues_story.csv
@@ -1,21 +1,21 @@
-id,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark,url,icon_url,issue_key,title,description,epic_key,type,original_type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,parent_issue_id,priority,severity,urgency,component,original_project,is_subtask
-tapd:TapdStory:1:11991001037563,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,1,,https://www.tapd.cn/991/prong/stories/view/11991001037563,,11991001037563,test-11test-11test-11test-11test-11test-11test-11test-11,,,REQUIREMENT,,IN_PROGRESS,test111test111,0,2021-09-29T09:54:01.000+00:00,2021-08-30T07:59:44.000+00:00,2021-09-29T09:54:01.000+00:00,43314,,,0,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-1 [...]
-tapd:TapdStory:1:11991001037696,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,2,,https://www.tapd.cn/991/prong/stories/view/11991001037696,,11991001037696,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,技术需求债务,技术债,IN_PROGRESS,test111test111,0,2021-09-03T08:13:49.000+00:00,2021-08-31T07:24:19.000+00:00,2021-09-03T08:13:49.000+00:00,4369,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11tes [...]
-tapd:TapdStory:1:11991001037697,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,3,,https://www.tapd.cn/991/prong/stories/view/11991001037697,,11991001037697,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,REQUIREMENT,,IN_PROGRESS,test111test111,0,2021-09-03T08:13:35.000+00:00,2021-08-31T07:27:52.000+00:00,2021-09-03T08:13:35.000+00:00,4365,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11t [...]
-tapd:TapdStory:1:11991001038322,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,4,,https://www.tapd.cn/991/prong/stories/view/11991001038322,,11991001038322,PCtest-11test-11test-11test-11test-11test-11test-11test-11,,,故事需求,需求,IN_PROGRESS,test111test111,0,2021-10-08T06:33:50.000+00:00,2021-09-07T08:07:25.000+00:00,2021-10-15T10:51:24.000+00:00,44546,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:0,Mid [...]
-tapd:TapdStory:1:11991001038323,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,5,,https://www.tapd.cn/991/prong/stories/view/11991001038323,,11991001038323,PCtest-11test-11test-11test-11test-11test-11test-11test-11,,,技术需求债务,技术债,DONE,已解决,0,2021-10-08T06:33:36.000+00:00,2021-09-07T08:08:40.000+00:00,2021-10-15T10:51:24.000+00:00,44544,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:11991001038322,Middle,,,,,0
-tapd:TapdStory:1:11991001038697,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,6,,https://www.tapd.cn/991/prong/stories/view/11991001038697,,11991001038697,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,REQUIREMENT,,IN_PROGRESS,test111test111,0,2021-09-13T02:24:50.000+00:00,2021-09-10T07:15:37.000+00:00,2021-09-13T02:24:50.000+00:00,4029,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11, [...]
-tapd:TapdStory:1:11991001038911,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,7,,https://www.tapd.cn/991/prong/stories/view/11991001038911,,11991001038911,PCtest-11test-11test-11test-11test-11test-11test-11,,,故事需求,需求,IN_PROGRESS,test111test111test111,0,2022-03-17T04:04:39.000+00:00,2021-09-13T10:28:23.000+00:00,2022-03-26T08:56:07.000+00:00,266016,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:0,,, [...]
-tapd:TapdStory:1:11991001038912,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,8,,https://www.tapd.cn/991/prong/stories/view/11991001038912,,11991001038912,PCtest-11test-11test-11test-11test-11test-11test-11,,,技术需求债务,技术债,DONE,已拒绝,0,2022-03-17T04:04:50.000+00:00,2021-09-13T10:29:22.000+00:00,2022-03-26T08:56:07.000+00:00,266015,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:11991001038911,,,,"""""",,0
-tapd:TapdStory:1:11991001039664,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,9,,https://www.tapd.cn/991/prong/stories/view/11991001039664,,11991001039664,PCtest-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,故事需求,需求,IN_PROGRESS,test111test111,0,2021-10-08T06:31:48.000+00:00,2021-09-24T07:46:47.000+00:00,2021-10-08T06:31:48.000+00:00,20085,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:Tap [...]
-tapd:TapdStory:1:11991001039673,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,10,,https://www.tapd.cn/991/prong/stories/view/11991001039673,,11991001039673,PCtest-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,REQUIREMENT,,IN_PROGRESS,test111test111,0,2021-10-08T06:31:35.000+00:00,2021-09-24T09:31:03.000+00:00,2021-10-08T06:31:35.000+00:00,19980,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,ta [...]
-tapd:TapdStory:1:11991001040086,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,11,,https://www.tapd.cn/991/prong/stories/view/11991001040086,,11991001040086,PCtest-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,故事需求,需求,IN_PROGRESS,test111test111,0,2021-10-18T05:46:59.000+00:00,2021-09-29T06:52:01.000+00:00,2021-10-18T05:46:59.000+00:00,27294,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:Ta [...]
-tapd:TapdStory:1:11991001040088,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,12,,https://www.tapd.cn/991/prong/stories/view/11991001040088,,11991001040088,PCtest-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,技术需求债务,技术债,IN_PROGRESS,test111test111,0,2021-10-18T05:46:40.000+00:00,2021-09-29T06:53:14.000+00:00,2021-10-18T05:46:40.000+00:00,27293,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd [...]
-tapd:TapdStory:1:11991001041163,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,13,,https://www.tapd.cn/991/prong/stories/view/11991001041163,,11991001041163,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,故事需求,需求,IN_PROGRESS,test111test111,0,2021-10-21T01:30:53.000+00:00,2021-10-19T07:58:33.000+00:00,2021-10-21T01:30:53.000+00:00,2492,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test [...]
-tapd:TapdStory:1:11991001041164,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,14,,https://www.tapd.cn/991/prong/stories/view/11991001041164,,11991001041164,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,REQUIREMENT,,IN_PROGRESS,test111test111,0,2021-10-21T01:30:40.000+00:00,2021-10-19T08:12:26.000+00:00,2021-10-21T01:30:41.000+00:00,2478,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-1 [...]
-tapd:TapdStory:1:11991001041165,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,15,,https://www.tapd.cn/991/prong/stories/view/11991001041165,,11991001041165,PCtest-11test-11test-11test-11test-11test-11test-11testUnicode516btestUnicode671ftestUnicodeff09,,,故事需求,需求,IN_PROGRESS,test111test111,0,2021-11-16T08:52:01.000+00:00,2021-10-19T08:31:03.000+00:00,2021-11-16T10:13:26.000+00:00,40340,,,0,tapd:TapdAccount:1:testUnicode9f50testUnicode9e9f,testUnicode9f50testUnicode9e9f, [...]
-tapd:TapdStory:1:11991001041166,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,16,,https://www.tapd.cn/991/prong/stories/view/11991001041166,,11991001041166,PCtestUnicode7aefhttpstestUnicode6539testUnicode9020testUnicode5de5testUnicode4f5ctestUnicodeff08testUnicode7b2ctestUnicode516btestUnicode671ftestUnicodeff09,,,EPIC需求,长篇故事,IN_PROGRESS,test111test111,0,2021-11-16T08:51:42.000+00:00,2021-10-19T08:31:56.000+00:00,2022-05-04T03:56:53.000+00:00,40339,,,0,tapd:TapdAccount [...]
-tapd:TapdStory:1:11991001041788,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,17,,https://www.tapd.cn/991/prong/stories/view/11991001041788,,11991001041788,testUnicode300atestUnicode777ftestUnicode89c1testUnicode300btestUnicode680ftestUnicode76eetestUnicode9875testUnicodeff08pc&mtestUnicode7ad9testUnicodeff09,,,故事需求,需求,IN_PROGRESS,test111test111,0,2021-11-30T05:57:19.000+00:00,2021-10-27T08:55:27.000+00:00,2021-11-30T10:04:48.000+00:00,48781,,,0,tapd:TapdAccount:1:test [...]
-tapd:TapdStory:1:11991001041789,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,18,,https://www.tapd.cn/991/prong/stories/view/11991001041789,,11991001041789,testUnicode300atestUnicode777ftestUnicode89c1testUnicode300btestUnicode680ftestUnicode76eetestUnicode9875testUnicodeff08pc&mtestUnicode7ad9testUnicodeff09,,,EPIC需求,长篇故事,IN_PROGRESS,test111test111,0,2021-11-30T05:56:15.000+00:00,2021-10-27T09:00:55.000+00:00,2021-11-30T10:04:48.000+00:00,48775,,,0,tapd:TapdAccount:1: [...]
-tapd:TapdStory:1:11991001041899,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,19,,https://www.tapd.cn/991/prong/stories/view/11991001041899,,11991001041899,2021testUnicode8d22testUnicode7ecftestUnicode98cetestUnicode4e91testUnicode699c,,,故事需求,需求,IN_PROGRESS,test111test111,0,2021-12-20T01:51:46.000+00:00,2021-10-28T02:56:01.000+00:00,2021-12-20T01:51:46.000+00:00,76255,,,0,tapd:TapdAccount:1:testUnicode5218testUnicode5b87testUnicode6615,testUnicode5218testUnicode5b87tes [...]
-tapd:TapdStory:1:11991001041900,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,20,,https://www.tapd.cn/991/prong/stories/view/11991001041900,,11991001041900,testUnicode4e3btestUnicode8bbatestUnicode575b-testUnicode4f1atestUnicode524d,,,REQUIREMENT,,IN_PROGRESS,test111test111,0,2021-12-20T01:51:36.000+00:00,2021-10-28T02:58:07.000+00:00,2021-12-20T01:51:36.000+00:00,76253,,,0,tapd:TapdAccount:1:testUnicode5218testUnicode5b87testUnicode6615,testUnicode5218testUnicode5b87t [...]
+id,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark,url,icon_url,issue_key,title,description,epic_key,type,original_type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,parent_issue_id,priority,severity,urgency,component,original_project,is_subtask,due_date
+tapd:TapdStory:1:11991001037563,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,1,,https://www.tapd.cn/991/prong/stories/view/11991001037563,,11991001037563,test-11test-11test-11test-11test-11test-11test-11test-11,,,REQUIREMENT,,IN_PROGRESS,test111test111,0,2021-09-29T09:54:01.000+00:00,2021-08-30T07:59:44.000+00:00,2021-09-29T09:54:01.000+00:00,43314,,,0,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-1 [...]
+tapd:TapdStory:1:11991001037696,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,2,,https://www.tapd.cn/991/prong/stories/view/11991001037696,,11991001037696,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,技术需求债务,技术债,IN_PROGRESS,test111test111,0,2021-09-03T08:13:49.000+00:00,2021-08-31T07:24:19.000+00:00,2021-09-03T08:13:49.000+00:00,4369,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11tes [...]
+tapd:TapdStory:1:11991001037697,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,3,,https://www.tapd.cn/991/prong/stories/view/11991001037697,,11991001037697,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,REQUIREMENT,,IN_PROGRESS,test111test111,0,2021-09-03T08:13:35.000+00:00,2021-08-31T07:27:52.000+00:00,2021-09-03T08:13:35.000+00:00,4365,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11t [...]
+tapd:TapdStory:1:11991001038322,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,4,,https://www.tapd.cn/991/prong/stories/view/11991001038322,,11991001038322,PCtest-11test-11test-11test-11test-11test-11test-11test-11,,,故事需求,需求,IN_PROGRESS,test111test111,0,2021-10-08T06:33:50.000+00:00,2021-09-07T08:07:25.000+00:00,2021-10-15T10:51:24.000+00:00,44546,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:0,Mid [...]
+tapd:TapdStory:1:11991001038323,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,5,,https://www.tapd.cn/991/prong/stories/view/11991001038323,,11991001038323,PCtest-11test-11test-11test-11test-11test-11test-11test-11,,,技术需求债务,技术债,DONE,已解决,0,2021-10-08T06:33:36.000+00:00,2021-09-07T08:08:40.000+00:00,2021-10-15T10:51:24.000+00:00,44544,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:11991001038322,Middl [...]
+tapd:TapdStory:1:11991001038697,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,6,,https://www.tapd.cn/991/prong/stories/view/11991001038697,,11991001038697,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,REQUIREMENT,,IN_PROGRESS,test111test111,0,2021-09-13T02:24:50.000+00:00,2021-09-10T07:15:37.000+00:00,2021-09-13T02:24:50.000+00:00,4029,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11, [...]
+tapd:TapdStory:1:11991001038911,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,7,,https://www.tapd.cn/991/prong/stories/view/11991001038911,,11991001038911,PCtest-11test-11test-11test-11test-11test-11test-11,,,故事需求,需求,IN_PROGRESS,test111test111test111,0,2022-03-17T04:04:39.000+00:00,2021-09-13T10:28:23.000+00:00,2022-03-26T08:56:07.000+00:00,266016,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:0,,, [...]
+tapd:TapdStory:1:11991001038912,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,8,,https://www.tapd.cn/991/prong/stories/view/11991001038912,,11991001038912,PCtest-11test-11test-11test-11test-11test-11test-11,,,技术需求债务,技术债,DONE,已拒绝,0,2022-03-17T04:04:50.000+00:00,2021-09-13T10:29:22.000+00:00,2022-03-26T08:56:07.000+00:00,266015,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:11991001038911,,,,"""""",, [...]
+tapd:TapdStory:1:11991001039664,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,9,,https://www.tapd.cn/991/prong/stories/view/11991001039664,,11991001039664,PCtest-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,故事需求,需求,IN_PROGRESS,test111test111,0,2021-10-08T06:31:48.000+00:00,2021-09-24T07:46:47.000+00:00,2021-10-08T06:31:48.000+00:00,20085,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:Tap [...]
+tapd:TapdStory:1:11991001039673,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,10,,https://www.tapd.cn/991/prong/stories/view/11991001039673,,11991001039673,PCtest-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,REQUIREMENT,,IN_PROGRESS,test111test111,0,2021-10-08T06:31:35.000+00:00,2021-09-24T09:31:03.000+00:00,2021-10-08T06:31:35.000+00:00,19980,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,ta [...]
+tapd:TapdStory:1:11991001040086,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,11,,https://www.tapd.cn/991/prong/stories/view/11991001040086,,11991001040086,PCtest-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,故事需求,需求,IN_PROGRESS,test111test111,0,2021-10-18T05:46:59.000+00:00,2021-09-29T06:52:01.000+00:00,2021-10-18T05:46:59.000+00:00,27294,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:Ta [...]
+tapd:TapdStory:1:11991001040088,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,12,,https://www.tapd.cn/991/prong/stories/view/11991001040088,,11991001040088,PCtest-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,技术需求债务,技术债,IN_PROGRESS,test111test111,0,2021-10-18T05:46:40.000+00:00,2021-09-29T06:53:14.000+00:00,2021-10-18T05:46:40.000+00:00,27293,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd [...]
+tapd:TapdStory:1:11991001041163,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,13,,https://www.tapd.cn/991/prong/stories/view/11991001041163,,11991001041163,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,故事需求,需求,IN_PROGRESS,test111test111,0,2021-10-21T01:30:53.000+00:00,2021-10-19T07:58:33.000+00:00,2021-10-21T01:30:53.000+00:00,2492,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test [...]
+tapd:TapdStory:1:11991001041164,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,14,,https://www.tapd.cn/991/prong/stories/view/11991001041164,,11991001041164,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,REQUIREMENT,,IN_PROGRESS,test111test111,0,2021-10-21T01:30:40.000+00:00,2021-10-19T08:12:26.000+00:00,2021-10-21T01:30:41.000+00:00,2478,,,0,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-1 [...]
+tapd:TapdStory:1:11991001041165,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,15,,https://www.tapd.cn/991/prong/stories/view/11991001041165,,11991001041165,PCtest-11test-11test-11test-11test-11test-11test-11testUnicode516btestUnicode671ftestUnicodeff09,,,故事需求,需求,IN_PROGRESS,test111test111,0,2021-11-16T08:52:01.000+00:00,2021-10-19T08:31:03.000+00:00,2021-11-16T10:13:26.000+00:00,40340,,,0,tapd:TapdAccount:1:testUnicode9f50testUnicode9e9f,testUnicode9f50testUnicode9e9f, [...]
+tapd:TapdStory:1:11991001041166,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,16,,https://www.tapd.cn/991/prong/stories/view/11991001041166,,11991001041166,PCtestUnicode7aefhttpstestUnicode6539testUnicode9020testUnicode5de5testUnicode4f5ctestUnicodeff08testUnicode7b2ctestUnicode516btestUnicode671ftestUnicodeff09,,,EPIC需求,长篇故事,IN_PROGRESS,test111test111,0,2021-11-16T08:51:42.000+00:00,2021-10-19T08:31:56.000+00:00,2022-05-04T03:56:53.000+00:00,40339,,,0,tapd:TapdAccount [...]
+tapd:TapdStory:1:11991001041788,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,17,,https://www.tapd.cn/991/prong/stories/view/11991001041788,,11991001041788,testUnicode300atestUnicode777ftestUnicode89c1testUnicode300btestUnicode680ftestUnicode76eetestUnicode9875testUnicodeff08pc&mtestUnicode7ad9testUnicodeff09,,,故事需求,需求,IN_PROGRESS,test111test111,0,2021-11-30T05:57:19.000+00:00,2021-10-27T08:55:27.000+00:00,2021-11-30T10:04:48.000+00:00,48781,,,0,tapd:TapdAccount:1:test [...]
+tapd:TapdStory:1:11991001041789,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,18,,https://www.tapd.cn/991/prong/stories/view/11991001041789,,11991001041789,testUnicode300atestUnicode777ftestUnicode89c1testUnicode300btestUnicode680ftestUnicode76eetestUnicode9875testUnicodeff08pc&mtestUnicode7ad9testUnicodeff09,,,EPIC需求,长篇故事,IN_PROGRESS,test111test111,0,2021-11-30T05:56:15.000+00:00,2021-10-27T09:00:55.000+00:00,2021-11-30T10:04:48.000+00:00,48775,,,0,tapd:TapdAccount:1: [...]
+tapd:TapdStory:1:11991001041899,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,19,,https://www.tapd.cn/991/prong/stories/view/11991001041899,,11991001041899,2021testUnicode8d22testUnicode7ecftestUnicode98cetestUnicode4e91testUnicode699c,,,故事需求,需求,IN_PROGRESS,test111test111,0,2021-12-20T01:51:46.000+00:00,2021-10-28T02:56:01.000+00:00,2021-12-20T01:51:46.000+00:00,76255,,,0,tapd:TapdAccount:1:testUnicode5218testUnicode5b87testUnicode6615,testUnicode5218testUnicode5b87tes [...]
+tapd:TapdStory:1:11991001041900,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,20,,https://www.tapd.cn/991/prong/stories/view/11991001041900,,11991001041900,testUnicode4e3btestUnicode8bbatestUnicode575b-testUnicode4f1atestUnicode524d,,,REQUIREMENT,,IN_PROGRESS,test111test111,0,2021-12-20T01:51:36.000+00:00,2021-10-28T02:58:07.000+00:00,2021-12-20T01:51:36.000+00:00,76253,,,0,tapd:TapdAccount:1:testUnicode5218testUnicode5b87testUnicode6615,testUnicode5218testUnicode5b87t [...]
diff --git a/backend/plugins/tapd/e2e/snapshot_tables/issues_story_for_due_date.csv b/backend/plugins/tapd/e2e/snapshot_tables/issues_story_for_due_date.csv
new file mode 100644
index 000000000..e9f6db3e4
--- /dev/null
+++ b/backend/plugins/tapd/e2e/snapshot_tables/issues_story_for_due_date.csv
@@ -0,0 +1,2 @@
+id,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark,url,icon_url,issue_key,title,description,epic_key,type,original_type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,parent_issue_id,priority,severity,urgency,component,original_project,is_subtask,due_date
+tapd:TapdStory:1:11991001037563,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_stories,1,,https://www.tapd.cn/991/prong/stories/view/11991001037563,,11991001037563,test-11test-11test-11test-11test-11test-11test-11test-11,,,REQUIREMENT,,IN_PROGRESS,test111test111,0,2021-09-29T09:54:01.000+00:00,2021-08-30T07:59:44.000+00:00,2021-09-29T09:54:01.000+00:00,43314,,,0,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-1 [...]
diff --git a/backend/plugins/tapd/e2e/snapshot_tables/issues_task.csv b/backend/plugins/tapd/e2e/snapshot_tables/issues_task.csv
index 5fc400a91..fcc00dd77 100644
--- a/backend/plugins/tapd/e2e/snapshot_tables/issues_task.csv
+++ b/backend/plugins/tapd/e2e/snapshot_tables/issues_task.csv
@@ -1,16 +1,16 @@
-id,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark,url,icon_url,issue_key,title,description,epic_key,type,original_type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,parent_issue_id,priority,severity,urgency,component,original_project,is_subtask
-tapd:TapdTask:1:11991001015107,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4339,,https://www.tapd.cn/991/prong/tasks/view/11991001015107,,11991001015107,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-03T09:53:39.000+00:00,2020-11-03T09:52:00.000+00:00,2022-06-01T11:53:30.000+00:00,1,,,,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:11991001001301,,,,,,0
-tapd:TapdTask:1:11991001015121,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4340,,https://www.tapd.cn/991/prong/tasks/view/11991001015121,,11991001015121,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-03T10:40:17.000+00:00,2020-11-03T10:39:57.000+00:00,2020-11-03T10:40:17.000+00:00,0,,,,tapd:TapdAccount:1:test-11test-11;,test-11test-11;,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:0,,,,,,0
-tapd:TapdTask:1:11991001015142,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4341,,https://www.tapd.cn/991/prong/tasks/view/11991001015142,,11991001015142,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-03T11:00:18.000+00:00,2020-11-03T10:58:43.000+00:00,2022-06-01T11:53:30.000+00:00,1,,,,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdStory:1:11991001001 [...]
-tapd:TapdTask:1:11991001015184,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4342,,https://www.tapd.cn/991/prong/tasks/view/11991001015184,,11991001015184,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-04T09:14:22.000+00:00,2020-11-04T09:12:11.000+00:00,2022-06-01T11:53:30.000+00:00,2,,,,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:11991001001301,,,,,,0
-tapd:TapdTask:1:11991001015203,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4343,,https://www.tapd.cn/991/prong/tasks/view/11991001015203,,11991001015203,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-04T10:38:54.000+00:00,2020-11-04T10:38:10.000+00:00,2022-06-01T11:53:30.000+00:00,0,,,,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdStory:1:11991001001 [...]
-tapd:TapdTask:1:11991001015207,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4344,,https://www.tapd.cn/991/prong/tasks/view/11991001015207,,11991001015207,pctest-11test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-10T11:01:47.000+00:00,2020-11-04T10:43:02.000+00:00,2020-11-10T11:01:47.000+00:00,8658,,,,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:0,,,,,,0
-tapd:TapdTask:1:11991001015253,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4345,,https://www.tapd.cn/991/prong/tasks/view/11991001015253,,11991001015253,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-05T08:50:55.000+00:00,2020-11-05T08:49:42.000+00:00,2022-06-01T11:53:30.000+00:00,1,,,,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:11991001001301,,,,,,0
-tapd:TapdTask:1:11991001015307,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4346,,https://www.tapd.cn/991/prong/tasks/view/11991001015307,,11991001015307,Mtest-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-06T11:03:43.000+00:00,2020-11-05T11:12:13.000+00:00,2020-11-06T11:03:43.000+00:00,1431,,,,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:0,,,,,,0
-tapd:TapdTask:1:11991001015309,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4347,,https://www.tapd.cn/991/prong/tasks/view/11991001015309,,11991001015309,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-05T11:16:00.000+00:00,2020-11-05T11:14:41.000+00:00,2022-06-01T11:53:30.000+00:00,1,,,,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdStory:1:11991001001 [...]
-tapd:TapdTask:1:11991001015340,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4348,,https://www.tapd.cn/991/prong/tasks/view/11991001015340,,11991001015340,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-06T09:12:19.000+00:00,2020-11-06T09:10:44.000+00:00,2022-06-01T11:53:30.000+00:00,1,,,,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:11991001001301,,,,,,0
-tapd:TapdTask:1:11991001015361,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4349,,https://www.tapd.cn/991/prong/tasks/view/11991001015361,,11991001015361,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-06T10:50:31.000+00:00,2020-11-06T10:49:54.000+00:00,2022-06-01T11:53:30.000+00:00,0,,,,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdStory:1:11991001001 [...]
-tapd:TapdTask:1:11991001015431,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4350,,https://www.tapd.cn/991/prong/tasks/view/11991001015431,,11991001015431,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-09T04:46:54.000+00:00,2020-11-09T04:45:27.000+00:00,2022-06-01T11:53:30.000+00:00,1,,,,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdStory:1:11991001001 [...]
-tapd:TapdTask:1:11991001015441,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4351,,https://www.tapd.cn/991/prong/tasks/view/11991001015441,,11991001015441,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-09T09:16:32.000+00:00,2020-11-09T09:14:15.000+00:00,2022-06-01T11:53:30.000+00:00,2,,,,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:11991001001301,,,,,,0
-tapd:TapdTask:1:11991001015452,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4352,,https://www.tapd.cn/991/prong/tasks/view/11991001015452,,11991001015452,Mtest-11test-11test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-11T10:47:24.000+00:00,2020-11-09T10:22:28.000+00:00,2020-11-11T10:47:24.000+00:00,2904,,,,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:0,,,,,,0
-tapd:TapdTask:1:11991001015583,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4353,,https://www.tapd.cn/991/prong/tasks/view/11991001015583,,11991001015583,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-10T03:47:30.000+00:00,2020-11-10T03:45:34.000+00:00,2022-06-01T11:53:30.000+00:00,1,,,,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdStory:1:11991001001 [...]
+id,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark,url,icon_url,issue_key,title,description,epic_key,type,original_type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,parent_issue_id,priority,severity,urgency,component,original_project,is_subtask,due_date
+tapd:TapdTask:1:11991001015107,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4339,,https://www.tapd.cn/991/prong/tasks/view/11991001015107,,11991001015107,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-03T09:53:39.000+00:00,2020-11-03T09:52:00.000+00:00,2022-06-01T11:53:30.000+00:00,1,,,,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:11991001001301,,,,,,0,2020-11-02T16:00: [...]
+tapd:TapdTask:1:11991001015121,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4340,,https://www.tapd.cn/991/prong/tasks/view/11991001015121,,11991001015121,test-11test-11test-11test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-03T10:40:17.000+00:00,2020-11-03T10:39:57.000+00:00,2020-11-03T10:40:17.000+00:00,0,,,,tapd:TapdAccount:1:test-11test-11;,test-11test-11;,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:0,,,,,,0,2020-11 [...]
+tapd:TapdTask:1:11991001015142,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4341,,https://www.tapd.cn/991/prong/tasks/view/11991001015142,,11991001015142,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-03T11:00:18.000+00:00,2020-11-03T10:58:43.000+00:00,2022-06-01T11:53:30.000+00:00,1,,,,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdStory:1:11991001001 [...]
+tapd:TapdTask:1:11991001015184,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4342,,https://www.tapd.cn/991/prong/tasks/view/11991001015184,,11991001015184,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-04T09:14:22.000+00:00,2020-11-04T09:12:11.000+00:00,2022-06-01T11:53:30.000+00:00,2,,,,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:11991001001301,,,,,,0,2020-11-03T16:00: [...]
+tapd:TapdTask:1:11991001015203,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4343,,https://www.tapd.cn/991/prong/tasks/view/11991001015203,,11991001015203,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-04T10:38:54.000+00:00,2020-11-04T10:38:10.000+00:00,2022-06-01T11:53:30.000+00:00,0,,,,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdStory:1:11991001001 [...]
+tapd:TapdTask:1:11991001015207,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4344,,https://www.tapd.cn/991/prong/tasks/view/11991001015207,,11991001015207,pctest-11test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-10T11:01:47.000+00:00,2020-11-04T10:43:02.000+00:00,2020-11-10T11:01:47.000+00:00,8658,,,,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:0,,,,,,0,2020-11-09T16:00:0 [...]
+tapd:TapdTask:1:11991001015253,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4345,,https://www.tapd.cn/991/prong/tasks/view/11991001015253,,11991001015253,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-05T08:50:55.000+00:00,2020-11-05T08:49:42.000+00:00,2022-06-01T11:53:30.000+00:00,1,,,,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:11991001001301,,,,,,0,2020-11-04T16:00: [...]
+tapd:TapdTask:1:11991001015307,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4346,,https://www.tapd.cn/991/prong/tasks/view/11991001015307,,11991001015307,Mtest-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-06T11:03:43.000+00:00,2020-11-05T11:12:13.000+00:00,2020-11-06T11:03:43.000+00:00,1431,,,,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:0,,,,,,0,2020-11-05T16:00:00.000+00:00
+tapd:TapdTask:1:11991001015309,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4347,,https://www.tapd.cn/991/prong/tasks/view/11991001015309,,11991001015309,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-05T11:16:00.000+00:00,2020-11-05T11:14:41.000+00:00,2022-06-01T11:53:30.000+00:00,1,,,,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdStory:1:11991001001 [...]
+tapd:TapdTask:1:11991001015340,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4348,,https://www.tapd.cn/991/prong/tasks/view/11991001015340,,11991001015340,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-06T09:12:19.000+00:00,2020-11-06T09:10:44.000+00:00,2022-06-01T11:53:30.000+00:00,1,,,,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:11991001001301,,,,,,0,2020-11-05T16:00: [...]
+tapd:TapdTask:1:11991001015361,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4349,,https://www.tapd.cn/991/prong/tasks/view/11991001015361,,11991001015361,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-06T10:50:31.000+00:00,2020-11-06T10:49:54.000+00:00,2022-06-01T11:53:30.000+00:00,0,,,,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdStory:1:11991001001 [...]
+tapd:TapdTask:1:11991001015431,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4350,,https://www.tapd.cn/991/prong/tasks/view/11991001015431,,11991001015431,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-09T04:46:54.000+00:00,2020-11-09T04:45:27.000+00:00,2022-06-01T11:53:30.000+00:00,1,,,,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdStory:1:11991001001 [...]
+tapd:TapdTask:1:11991001015441,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4351,,https://www.tapd.cn/991/prong/tasks/view/11991001015441,,11991001015441,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-09T09:16:32.000+00:00,2020-11-09T09:14:15.000+00:00,2022-06-01T11:53:30.000+00:00,2,,,,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:11991001001301,,,,,,0,2020-11-08T16:00: [...]
+tapd:TapdTask:1:11991001015452,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4352,,https://www.tapd.cn/991/prong/tasks/view/11991001015452,,11991001015452,Mtest-11test-11test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-11T10:47:24.000+00:00,2020-11-09T10:22:28.000+00:00,2020-11-11T10:47:24.000+00:00,2904,,,,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:0,,,,,,0,2020-11-10T1 [...]
+tapd:TapdTask:1:11991001015583,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4353,,https://www.tapd.cn/991/prong/tasks/view/11991001015583,,11991001015583,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-10T03:47:30.000+00:00,2020-11-10T03:45:34.000+00:00,2022-06-01T11:53:30.000+00:00,1,,,,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,tapd:TapdStory:1:11991001001 [...]
diff --git a/backend/plugins/tapd/e2e/snapshot_tables/issues_task_for_due_date.csv b/backend/plugins/tapd/e2e/snapshot_tables/issues_task_for_due_date.csv
new file mode 100644
index 000000000..398f2fb9b
--- /dev/null
+++ b/backend/plugins/tapd/e2e/snapshot_tables/issues_task_for_due_date.csv
@@ -0,0 +1,2 @@
+id,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark,url,icon_url,issue_key,title,description,epic_key,type,original_type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,parent_issue_id,priority,severity,urgency,component,original_project,is_subtask,due_date
+tapd:TapdTask:1:11991001015107,"{""ConnectionId"":1,""WorkspaceId"":991}",_raw_tapd_api_tasks,4339,,https://www.tapd.cn/991/prong/tasks/view/11991001015107,,11991001015107,test-11test-11test-11test-11test-11test-11test-11,,,任务,TASK,DONE,done,,2020-11-03T09:53:39.000+00:00,2020-11-03T09:52:00.000+00:00,2022-06-01T11:53:30.000+00:00,1,,,,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdAccount:1:test-11test-11,test-11test-11,tapd:TapdStory:1:11991001001301,,,,,,0,2025-03-03T16:00: [...]
diff --git a/backend/plugins/tapd/e2e/stories_test.go b/backend/plugins/tapd/e2e/stories_test.go
index 5165b6594..e7650cad3 100644
--- a/backend/plugins/tapd/e2e/stories_test.go
+++ b/backend/plugins/tapd/e2e/stories_test.go
@@ -139,3 +139,40 @@ func TestTapdStoryDataFlow(t *testing.T) {
),
)
}
+
+func TestTapdStoryCustomizeDueDate(t *testing.T) {
+ var tapd impl.Tapd
+ dataflowTester := e2ehelper.NewDataFlowTester(t, "tapd", tapd)
+ taskData := &tasks.TapdTaskData{
+ Options: &tasks.TapdOptions{
+ ConnectionId: 1,
+ WorkspaceId: 991,
+ ScopeConfig: &models.TapdScopeConfig{
+ StoryDueDateField: "custom_field_three",
+ TypeMappings: map[string]string{
+ "BUG": "缺陷",
+ "TASK": "任务",
+ "需求": "故事需求",
+ "技术债": "技术需求债务",
+ "长篇故事": "Epic需求",
+ },
+ },
+ },
+ }
+ // import raw data table
+ dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_tapd_api_stories_for_due_date.csv",
+ "_raw_tapd_api_stories")
+ dataflowTester.FlushTabler(&models.TapdStory{})
+ dataflowTester.Subtask(tasks.ExtractStoryMeta, taskData)
+ dataflowTester.VerifyTableWithOptions(&models.TapdStory{}, e2ehelper.TableOptions{
+ CSVRelPath: "./snapshot_tables/_tool_tapd_stories_for_due_date.csv",
+ IgnoreTypes: []interface{}{common.NoPKModel{}},
+ })
+
+ dataflowTester.FlushTabler(&ticket.Issue{})
+ dataflowTester.Subtask(tasks.ConvertStoryMeta, taskData)
+ dataflowTester.VerifyTableWithOptions(&ticket.Issue{}, e2ehelper.TableOptions{
+ CSVRelPath: "./snapshot_tables/issues_story_for_due_date.csv",
+ IgnoreTypes: []interface{}{common.Model{}},
+ })
+}
diff --git a/backend/plugins/tapd/e2e/tasks_test.go b/backend/plugins/tapd/e2e/tasks_test.go
index ea385643e..95a7c68a7 100644
--- a/backend/plugins/tapd/e2e/tasks_test.go
+++ b/backend/plugins/tapd/e2e/tasks_test.go
@@ -131,3 +131,39 @@ func TestTapdTaskDataFlow(t *testing.T) {
)
}
+
+func TestTapdTaskCustomizeDueDate(t *testing.T) {
+ var tapd impl.Tapd
+ dataflowTester := e2ehelper.NewDataFlowTester(t, "tapd", tapd)
+ taskData := &tasks.TapdTaskData{
+ Options: &tasks.TapdOptions{
+ ConnectionId: 1,
+ WorkspaceId: 991,
+ ScopeConfig: &models.TapdScopeConfig{
+ TaskDueDateField: "custom_field_one",
+ TypeMappings: map[string]string{
+ "BUG": "缺陷",
+ "TASK": "任务",
+ },
+ },
+ },
+ }
+ // import raw data table
+ dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_tapd_api_tasks_for_due_date.csv",
+ "_raw_tapd_api_tasks")
+
+ // verify extraction
+ dataflowTester.FlushTabler(&models.TapdTask{})
+ dataflowTester.Subtask(tasks.ExtractTaskMeta, taskData)
+ dataflowTester.VerifyTableWithOptions(&models.TapdTask{}, e2ehelper.TableOptions{
+ CSVRelPath: "./snapshot_tables/_tool_tapd_tasks_for_due_date.csv",
+ IgnoreTypes: []interface{}{common.NoPKModel{}},
+ })
+
+ dataflowTester.FlushTabler(&ticket.Issue{})
+ dataflowTester.Subtask(tasks.ConvertTaskMeta, taskData)
+ dataflowTester.VerifyTableWithOptions(&ticket.Issue{}, e2ehelper.TableOptions{
+ CSVRelPath: "./snapshot_tables/issues_task_for_due_date.csv",
+ IgnoreTypes: []interface{}{common.Model{}},
+ })
+}
diff --git a/backend/plugins/tapd/models/bug.go b/backend/plugins/tapd/models/bug.go
index 0a4c8f934..c2fb46748 100644
--- a/backend/plugins/tapd/models/bug.go
+++ b/backend/plugins/tapd/models/bug.go
@@ -18,12 +18,16 @@ limitations under the License.
package models
import (
+ "encoding/json"
+ "time"
+
"github.com/apache/incubator-devlake/core/models/common"
)
type TapdBug struct {
- ConnectionId uint64 `gorm:"primaryKey"`
- Id uint64 `gorm:"primaryKey;type:BIGINT NOT NULL;autoIncrement:false" json:"id,string"`
+ AllFields map[string]interface{} `gorm:"-"`
+ ConnectionId uint64 `gorm:"primaryKey"`
+ Id uint64 `gorm:"primaryKey;type:BIGINT NOT NULL;autoIncrement:false" json:"id,string"`
EpicKey string
Title string `json:"title" gorm:"type:varchar(255)"`
Description string `json:"description"`
@@ -91,19 +95,20 @@ type TapdBug struct {
Type string `gorm:"type:varchar(255)"`
Url string `gorm:"type:varchar(255)"`
- SupportId uint64 `json:"support_id,string"`
- SupportForumId uint64 `json:"support_forum_id,string"`
- TicketId uint64 `json:"ticket_id,string"`
- Follower string `json:"follower" gorm:"type:varchar(255)"`
- SyncType string `json:"sync_type" gorm:"type:text"`
- Label string `json:"label" gorm:"type:varchar(255)"`
- Effort float32 `json:"effort,string"`
- EffortCompleted float32 `json:"effort_completed,string"`
- Exceed float32 `json:"exceed,string"`
- Remain float32 `json:"remain,string"`
- Progress string `json:"progress" gorm:"type:varchar(255)"`
- Estimate float32 `json:"estimate,string"`
- Bugtype string `json:"bugtype" gorm:"type:varchar(255)"`
+ SupportId uint64 `json:"support_id,string"`
+ SupportForumId uint64 `json:"support_forum_id,string"`
+ TicketId uint64 `json:"ticket_id,string"`
+ Follower string `json:"follower" gorm:"type:varchar(255)"`
+ SyncType string `json:"sync_type" gorm:"type:text"`
+ Label string `json:"label" gorm:"type:varchar(255)"`
+ Effort float32 `json:"effort,string"`
+ EffortCompleted float32 `json:"effort_completed,string"`
+ Exceed float32 `json:"exceed,string"`
+ Remain float32 `json:"remain,string"`
+ Progress string `json:"progress" gorm:"type:varchar(255)"`
+ Estimate float32 `json:"estimate,string"`
+ Bugtype string `json:"bugtype" gorm:"type:varchar(255)"`
+ DueDate *time.Time `json:"due_date"`
Milestone string `json:"milestone" gorm:"type:varchar(255)"`
CustomFieldOne string `json:"custom_field_one" gorm:"type:text"`
@@ -161,3 +166,15 @@ type TapdBug struct {
func (TapdBug) TableName() string {
return "_tool_tapd_bugs"
}
+
+func (i *TapdBug) SetAllFields(raw json.RawMessage) error {
+ var bugBody struct {
+ Bug map[string]interface{}
+ }
+ err := json.Unmarshal(raw, &bugBody)
+ if err != nil {
+ return err
+ }
+ i.AllFields = bugBody.Bug
+ return nil
+}
diff --git a/backend/plugins/tapd/models/migrationscripts/20250305_update_scope_config.go b/backend/plugins/tapd/models/migrationscripts/20250305_update_scope_config.go
new file mode 100644
index 000000000..6a4c9aac6
--- /dev/null
+++ b/backend/plugins/tapd/models/migrationscripts/20250305_update_scope_config.go
@@ -0,0 +1,80 @@
+/*
+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 migrationscripts
+
+import (
+ "time"
+
+ "github.com/apache/incubator-devlake/core/context"
+ "github.com/apache/incubator-devlake/core/errors"
+ "github.com/apache/incubator-devlake/helpers/migrationhelper"
+)
+
+type TapdScopeConfig20250305 struct {
+ BugDueDateField string `mapstructure:"bugDueDateField,omitempty" json:"bugDueDateField" gorm:"column:bug_due_date_field"`
+ TaskDueDateField string `mapstructure:"taskDueDateField,omitempty" json:"taskDueDateField" gorm:"column:task_due_date_field"`
+ StoryDueDateField string `mapstructure:"storyDueDateField,omitempty" json:"storyDueDateField" gorm:"column:story_due_date_field"`
+}
+
+func (t TapdScopeConfig20250305) TableName() string {
+ return "_tool_tapd_scope_configs"
+}
+
+type TapdBug20250310 struct {
+ DueDate *time.Time
+}
+
+func (t TapdBug20250310) TableName() string {
+ return "_tool_tapd_bugs"
+}
+
+type TapdTask20250310 struct {
+ DueDate *time.Time
+}
+
+func (t TapdTask20250310) TableName() string {
+ return "_tool_tapd_tasks"
+}
+
+type TapdStory20250310 struct {
+ DueDate *time.Time
+}
+
+func (t TapdStory20250310) TableName() string {
+ return "_tool_tapd_stories"
+}
+
+type updateScopeConfig20250305 struct{}
+
+func (u updateScopeConfig20250305) Up(basicRes context.BasicRes) errors.Error {
+ return migrationhelper.AutoMigrateTables(
+ basicRes,
+ &TapdScopeConfig20250305{},
+ &TapdBug20250310{},
+ &TapdStory20250310{},
+ &TapdTask20250310{},
+ )
+}
+
+func (u updateScopeConfig20250305) Version() uint64 {
+ return 20250305093400
+}
+
+func (u updateScopeConfig20250305) Name() string {
+ return "tapd update scope config, add due date fields"
+}
diff --git a/backend/plugins/tapd/models/migrationscripts/register.go b/backend/plugins/tapd/models/migrationscripts/register.go
index 276ab8997..206cbf297 100644
--- a/backend/plugins/tapd/models/migrationscripts/register.go
+++ b/backend/plugins/tapd/models/migrationscripts/register.go
@@ -34,5 +34,6 @@ func All() []plugin.MigrationScript {
new(addRawParamTableForScope),
new(addConnIdToLabels),
new(addCompanyIdToConnection),
+ new(updateScopeConfig20250305),
}
}
diff --git a/backend/plugins/tapd/models/scope_config.go b/backend/plugins/tapd/models/scope_config.go
index 0ef82fc20..dbe922438 100644
--- a/backend/plugins/tapd/models/scope_config.go
+++ b/backend/plugins/tapd/models/scope_config.go
@@ -25,6 +25,9 @@ type TapdScopeConfig struct {
common.ScopeConfig `mapstructure:",squash" json:",inline" gorm:"embedded"`
TypeMappings map[string]string `mapstructure:"typeMappings,omitempty" json:"typeMappings" gorm:"serializer:json"`
StatusMappings map[string]string `mapstructure:"statusMappings,omitempty" json:"statusMappings" gorm:"serializer:json"`
+ BugDueDateField string `mapstructure:"bugDueDateField,omitempty" json:"bugDueDateField" gorm:"column:bug_due_date_field"`
+ TaskDueDateField string `mapstructure:"taskDueDateField,omitempty" json:"taskDueDateField" gorm:"column:task_due_date_field"`
+ StoryDueDateField string `mapstructure:"storyDueDateField,omitempty" json:"storyDueDateField" gorm:"column:story_due_date_field"`
}
func (t TapdScopeConfig) TableName() string {
diff --git a/backend/plugins/tapd/models/story.go b/backend/plugins/tapd/models/story.go
index 76f24252b..9915d65aa 100644
--- a/backend/plugins/tapd/models/story.go
+++ b/backend/plugins/tapd/models/story.go
@@ -18,52 +18,57 @@ limitations under the License.
package models
import (
+ "encoding/json"
+ "time"
+
"github.com/apache/incubator-devlake/core/models/common"
)
type TapdStory struct {
- ConnectionId uint64 `gorm:"primaryKey"`
- Id uint64 `gorm:"primaryKey;type:BIGINT NOT NULL;autoIncrement:false" json:"id,string"`
- WorkitemTypeId uint64 `json:"workitem_type_id,string"`
- Name string `gorm:"type:varchar(255)" json:"name"`
- Description string `json:"description"`
- WorkspaceId uint64 `json:"workspace_id,string"`
- Creator string `gorm:"type:varchar(255)"`
- Created *common.CSTTime `json:"created"`
- Modified *common.CSTTime `json:"modified" gorm:"index"`
- Status string `json:"status" gorm:"type:varchar(255)"`
- Owner string `json:"owner" gorm:"type:varchar(255)"`
- Cc string `json:"cc" gorm:"type:varchar(255)"`
- Begin *common.CSTTime `json:"begin"`
- Due *common.CSTTime `json:"due"`
- Size int16 `json:"size,string"`
- Priority string `gorm:"type:varchar(255)" json:"priority"`
- Developer string `gorm:"type:varchar(255)" json:"developer"`
- IterationId int64 `json:"iteration_id,string"`
- TestFocus string `json:"test_focus" gorm:"type:varchar(255)"`
- Type string `json:"type" gorm:"type:varchar(255)"`
- Source string `json:"source" gorm:"type:varchar(255)"`
- Module string `json:"module" gorm:"type:varchar(255)"`
- Version string `json:"version" gorm:"type:varchar(255)"`
- Completed *common.CSTTime `json:"completed"`
- CategoryId int64 `json:"category_id,string"`
- Path string `gorm:"type:varchar(255)" json:"path"`
- ParentId uint64 `json:"parent_id,string"`
- ChildrenId string `gorm:"type:text" json:"children_id"`
- AncestorId uint64 `json:"ancestor_id,string"`
- BusinessValue string `gorm:"type:varchar(255)" json:"business_value"`
- Effort float32 `json:"effort,string"`
- EffortCompleted float32 `json:"effort_completed,string"`
- Exceed float32 `json:"exceed,string"`
- Remain float32 `json:"remain,string"`
- ReleaseId uint64 `json:"release_id,string"`
- Confidential string `gorm:"type:varchar(255)" json:"confidential"`
- TemplatedId uint64 `json:"templated_id,string"`
- CreatedFrom string `gorm:"type:varchar(255)" json:"created_from"`
- Feature string `gorm:"type:varchar(255)" json:"feature"`
- StdStatus string `gorm:"type:varchar(20)"`
- StdType string `gorm:"type:varchar(20)"`
- Url string `gorm:"type:varchar(255)"`
+ AllFields map[string]interface{} `gorm:"-"`
+ ConnectionId uint64 `gorm:"primaryKey"`
+ Id uint64 `gorm:"primaryKey;type:BIGINT NOT NULL;autoIncrement:false" json:"id,string"`
+ WorkitemTypeId uint64 `json:"workitem_type_id,string"`
+ Name string `gorm:"type:varchar(255)" json:"name"`
+ Description string `json:"description"`
+ WorkspaceId uint64 `json:"workspace_id,string"`
+ Creator string `gorm:"type:varchar(255)"`
+ Created *common.CSTTime `json:"created"`
+ Modified *common.CSTTime `json:"modified" gorm:"index"`
+ Status string `json:"status" gorm:"type:varchar(255)"`
+ Owner string `json:"owner" gorm:"type:varchar(255)"`
+ Cc string `json:"cc" gorm:"type:varchar(255)"`
+ Begin *common.CSTTime `json:"begin"`
+ Due *common.CSTTime `json:"due"`
+ Size int16 `json:"size,string"`
+ Priority string `gorm:"type:varchar(255)" json:"priority"`
+ Developer string `gorm:"type:varchar(255)" json:"developer"`
+ IterationId int64 `json:"iteration_id,string"`
+ TestFocus string `json:"test_focus" gorm:"type:varchar(255)"`
+ Type string `json:"type" gorm:"type:varchar(255)"`
+ Source string `json:"source" gorm:"type:varchar(255)"`
+ Module string `json:"module" gorm:"type:varchar(255)"`
+ Version string `json:"version" gorm:"type:varchar(255)"`
+ Completed *common.CSTTime `json:"completed"`
+ CategoryId int64 `json:"category_id,string"`
+ Path string `gorm:"type:varchar(255)" json:"path"`
+ ParentId uint64 `json:"parent_id,string"`
+ ChildrenId string `gorm:"type:text" json:"children_id"`
+ AncestorId uint64 `json:"ancestor_id,string"`
+ BusinessValue string `gorm:"type:varchar(255)" json:"business_value"`
+ Effort float32 `json:"effort,string"`
+ EffortCompleted float32 `json:"effort_completed,string"`
+ Exceed float32 `json:"exceed,string"`
+ Remain float32 `json:"remain,string"`
+ ReleaseId uint64 `json:"release_id,string"`
+ Confidential string `gorm:"type:varchar(255)" json:"confidential"`
+ TemplatedId uint64 `json:"templated_id,string"`
+ CreatedFrom string `gorm:"type:varchar(255)" json:"created_from"`
+ Feature string `gorm:"type:varchar(255)" json:"feature"`
+ StdStatus string `gorm:"type:varchar(20)"`
+ StdType string `gorm:"type:varchar(20)"`
+ Url string `gorm:"type:varchar(255)"`
+ DueDate *time.Time `json:"due_date"`
AttachmentCount int16 `json:"attachment_count,string"`
HasAttachment string `json:"has_attachment" gorm:"type:varchar(255)"`
@@ -133,3 +138,15 @@ type TapdStory struct {
func (TapdStory) TableName() string {
return "_tool_tapd_stories"
}
+
+func (i *TapdStory) SetAllFields(raw json.RawMessage) error {
+ var storyBody struct {
+ Story map[string]interface{}
+ }
+ err := json.Unmarshal(raw, &storyBody)
+ if err != nil {
+ return err
+ }
+ i.AllFields = storyBody.Story
+ return nil
+}
diff --git a/backend/plugins/tapd/models/task.go b/backend/plugins/tapd/models/task.go
index b10f94bae..fa4041c2f 100644
--- a/backend/plugins/tapd/models/task.go
+++ b/backend/plugins/tapd/models/task.go
@@ -18,37 +18,42 @@ limitations under the License.
package models
import (
+ "encoding/json"
+ "time"
+
"github.com/apache/incubator-devlake/core/models/common"
)
type TapdTask struct {
- ConnectionId uint64 `gorm:"primaryKey"`
- Id uint64 `gorm:"primaryKey;type:BIGINT NOT NULL;autoIncrement:false" json:"id,string"`
- Name string `gorm:"type:varchar(255)" json:"name"`
- Description string `json:"description"`
- WorkspaceId uint64 `json:"workspace_id,string"`
- Creator string `gorm:"type:varchar(255)" json:"creator"`
- Created *common.CSTTime `json:"created"`
- Modified *common.CSTTime `json:"modified" gorm:"index"`
- Status string `json:"status" gorm:"type:varchar(255)"`
- Owner string `json:"owner" gorm:"type:varchar(255)"`
- Cc string `json:"cc" gorm:"type:varchar(255)"`
- Begin *common.CSTTime `json:"begin"`
- Due *common.CSTTime `json:"due"`
- Priority string `gorm:"type:varchar(255)" json:"priority"`
- IterationId int64 `json:"iteration_id,string"`
- Completed *common.CSTTime `json:"completed"`
- Effort float32 `json:"effort,string"`
- EffortCompleted float32 `json:"effort_completed,string"`
- Exceed float32 `json:"exceed,string"`
- Remain float32 `json:"remain,string"`
- StdStatus string `gorm:"type:varchar(20)"`
- StdType string `gorm:"type:varchar(20)"`
- Type string `gorm:"type:varchar(255)"`
- StoryId uint64 `json:"story_id,string"`
- Progress int16 `json:"progress,string"`
- HasAttachment string `gorm:"type:varchar(255)"`
- Url string `gorm:"type:varchar(255)"`
+ AllFields map[string]interface{} `gorm:"-"`
+ ConnectionId uint64 `gorm:"primaryKey"`
+ Id uint64 `gorm:"primaryKey;type:BIGINT NOT NULL;autoIncrement:false" json:"id,string"`
+ Name string `gorm:"type:varchar(255)" json:"name"`
+ Description string `json:"description"`
+ WorkspaceId uint64 `json:"workspace_id,string"`
+ Creator string `gorm:"type:varchar(255)" json:"creator"`
+ Created *common.CSTTime `json:"created"`
+ Modified *common.CSTTime `json:"modified" gorm:"index"`
+ Status string `json:"status" gorm:"type:varchar(255)"`
+ Owner string `json:"owner" gorm:"type:varchar(255)"`
+ Cc string `json:"cc" gorm:"type:varchar(255)"`
+ Begin *common.CSTTime `json:"begin"`
+ Due *common.CSTTime `json:"due"`
+ Priority string `gorm:"type:varchar(255)" json:"priority"`
+ IterationId int64 `json:"iteration_id,string"`
+ Completed *common.CSTTime `json:"completed"`
+ Effort float32 `json:"effort,string"`
+ EffortCompleted float32 `json:"effort_completed,string"`
+ Exceed float32 `json:"exceed,string"`
+ Remain float32 `json:"remain,string"`
+ StdStatus string `gorm:"type:varchar(20)"`
+ StdType string `gorm:"type:varchar(20)"`
+ Type string `gorm:"type:varchar(255)"`
+ StoryId uint64 `json:"story_id,string"`
+ Progress int16 `json:"progress,string"`
+ HasAttachment string `gorm:"type:varchar(255)"`
+ Url string `gorm:"type:varchar(255)"`
+ DueDate *time.Time `json:"due_date"`
AttachmentCount int16 `json:"attachment_count,string"`
Follower string `json:"follower" gorm:"type:varchar(255)"`
@@ -114,3 +119,15 @@ type TapdTask struct {
func (TapdTask) TableName() string {
return "_tool_tapd_tasks"
}
+
+func (i *TapdTask) SetAllFields(raw json.RawMessage) error {
+ var taskBody struct {
+ Task map[string]interface{}
+ }
+ err := json.Unmarshal(raw, &taskBody)
+ if err != nil {
+ return err
+ }
+ i.AllFields = taskBody.Task
+ return nil
+}
diff --git a/backend/plugins/tapd/tasks/bug_converter.go b/backend/plugins/tapd/tasks/bug_converter.go
index 1ae6eaefe..f3f920dce 100644
--- a/backend/plugins/tapd/tasks/bug_converter.go
+++ b/backend/plugins/tapd/tasks/bug_converter.go
@@ -77,6 +77,7 @@ func ConvertBug(taskCtx plugin.SubTaskContext) errors.Error {
Severity: toolL.Severity,
Component: toolL.Feature, // todo not sure about this
OriginalStatus: toolL.Status,
+ DueDate: toolL.DueDate,
}
var results []interface{}
if domainL.AssigneeName != "" {
diff --git a/backend/plugins/tapd/tasks/bug_extractor.go b/backend/plugins/tapd/tasks/bug_extractor.go
index 4de8c2dd6..fa0860b9f 100644
--- a/backend/plugins/tapd/tasks/bug_extractor.go
+++ b/backend/plugins/tapd/tasks/bug_extractor.go
@@ -20,12 +20,15 @@ package tasks
import (
"encoding/json"
"fmt"
+ "strings"
+ "time"
+
"github.com/apache/incubator-devlake/core/errors"
"github.com/apache/incubator-devlake/core/models/domainlayer/ticket"
"github.com/apache/incubator-devlake/core/plugin"
"github.com/apache/incubator-devlake/helpers/pluginhelper/api"
+ "github.com/apache/incubator-devlake/helpers/utils"
"github.com/apache/incubator-devlake/plugins/tapd/models"
- "strings"
)
var _ plugin.SubTaskEntryPoint = ExtractBugs
@@ -48,6 +51,11 @@ func ExtractBugs(taskCtx plugin.SubTaskContext) errors.Error {
}
customStatusMap := getStatusMapping(data)
stdTypeMappings := getStdTypeMappings(data)
+ // get due date field
+ dueDateField := "due"
+ if data.Options.ScopeConfig != nil && data.Options.ScopeConfig.BugDueDateField != "" {
+ dueDateField = data.Options.ScopeConfig.BugDueDateField
+ }
extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{
RawDataSubTaskArgs: *rawDataSubTaskArgs,
BatchSize: 100,
@@ -60,7 +68,10 @@ func ExtractBugs(taskCtx plugin.SubTaskContext) errors.Error {
return nil, err
}
toolL := bugBody.Bug
-
+ err = errors.Convert(toolL.SetAllFields(row.Data))
+ if err != nil {
+ return nil, err
+ }
toolL.Status = statusLanguageMap[toolL.Status]
toolL.ConnectionId = data.Options.ConnectionId
toolL.Type = "BUG"
@@ -77,6 +88,8 @@ func ExtractBugs(taskCtx plugin.SubTaskContext) errors.Error {
if strings.Contains(toolL.CurrentOwner, ";") {
toolL.CurrentOwner = strings.Split(toolL.CurrentOwner, ";")[0]
}
+ loc, _ := time.LoadLocation("Asia/Shanghai")
+ toolL.DueDate, _ = utils.GetTimeFeildFromMap(toolL.AllFields, dueDateField, loc)
workSpaceBug := &models.TapdWorkSpaceBug{
ConnectionId: data.Options.ConnectionId,
WorkspaceId: toolL.WorkspaceId,
diff --git a/backend/plugins/tapd/tasks/story_converter.go b/backend/plugins/tapd/tasks/story_converter.go
index c02e41c5e..d33d88101 100644
--- a/backend/plugins/tapd/tasks/story_converter.go
+++ b/backend/plugins/tapd/tasks/story_converter.go
@@ -80,6 +80,7 @@ func ConvertStory(taskCtx plugin.SubTaskContext) errors.Error {
AssigneeName: toolL.Owner,
Severity: "",
Component: toolL.Feature,
+ DueDate: toolL.DueDate,
}
var results []interface{}
if domainL.AssigneeName != "" {
diff --git a/backend/plugins/tapd/tasks/story_extractor.go b/backend/plugins/tapd/tasks/story_extractor.go
index ee7314cf9..1ca8242ea 100644
--- a/backend/plugins/tapd/tasks/story_extractor.go
+++ b/backend/plugins/tapd/tasks/story_extractor.go
@@ -20,12 +20,15 @@ package tasks
import (
"encoding/json"
"fmt"
+ "strings"
+ "time"
+
"github.com/apache/incubator-devlake/core/errors"
"github.com/apache/incubator-devlake/core/models/domainlayer/ticket"
"github.com/apache/incubator-devlake/core/plugin"
"github.com/apache/incubator-devlake/helpers/pluginhelper/api"
+ "github.com/apache/incubator-devlake/helpers/utils"
"github.com/apache/incubator-devlake/plugins/tapd/models"
- "strings"
)
var _ plugin.SubTaskEntryPoint = ExtractStories
@@ -52,6 +55,11 @@ func ExtractStories(taskCtx plugin.SubTaskContext) errors.Error {
if err != nil {
return err
}
+ // get due date field
+ dueDateField := "due"
+ if data.Options.ScopeConfig != nil && data.Options.ScopeConfig.StoryDueDateField != "" {
+ dueDateField = data.Options.ScopeConfig.StoryDueDateField
+ }
extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{
RawDataSubTaskArgs: *rawDataSubTaskArgs,
BatchSize: 100,
@@ -64,6 +72,10 @@ func ExtractStories(taskCtx plugin.SubTaskContext) errors.Error {
return nil, err
}
toolL := storyBody.Story
+ err = errors.Convert(toolL.SetAllFields(row.Data))
+ if err != nil {
+ return nil, err
+ }
toolL.Status = statusLanguageMap[toolL.Status]
if len(customStatusMap) != 0 {
toolL.StdStatus = customStatusMap[toolL.Status]
@@ -111,6 +123,8 @@ func ExtractStories(taskCtx plugin.SubTaskContext) errors.Error {
results = append(results, toolLIssueLabel)
}
}
+ loc, _ := time.LoadLocation("Asia/Shanghai")
+ toolL.DueDate, _ = utils.GetTimeFeildFromMap(toolL.AllFields, dueDateField, loc)
return results, nil
},
})
diff --git a/backend/plugins/tapd/tasks/task_converter.go b/backend/plugins/tapd/tasks/task_converter.go
index c7e3f5157..1b5006840 100644
--- a/backend/plugins/tapd/tasks/task_converter.go
+++ b/backend/plugins/tapd/tasks/task_converter.go
@@ -76,6 +76,7 @@ func ConvertTask(taskCtx plugin.SubTaskContext) errors.Error {
CreatorId: getAccountIdGen().Generate(data.Options.ConnectionId, toolL.Creator),
CreatorName: toolL.Creator,
AssigneeName: toolL.Owner,
+ DueDate: toolL.DueDate,
}
var results []interface{}
if domainL.AssigneeName != "" {
diff --git a/backend/plugins/tapd/tasks/task_extractor.go b/backend/plugins/tapd/tasks/task_extractor.go
index 95aa3b836..225148c81 100644
--- a/backend/plugins/tapd/tasks/task_extractor.go
+++ b/backend/plugins/tapd/tasks/task_extractor.go
@@ -20,12 +20,15 @@ package tasks
import (
"encoding/json"
"fmt"
+ "strings"
+ "time"
+
"github.com/apache/incubator-devlake/core/errors"
"github.com/apache/incubator-devlake/core/models/domainlayer/ticket"
"github.com/apache/incubator-devlake/core/plugin"
"github.com/apache/incubator-devlake/helpers/pluginhelper/api"
+ "github.com/apache/incubator-devlake/helpers/utils"
"github.com/apache/incubator-devlake/plugins/tapd/models"
- "strings"
)
var _ plugin.SubTaskEntryPoint = ExtractTasks
@@ -50,6 +53,11 @@ func ExtractTasks(taskCtx plugin.SubTaskContext) errors.Error {
}
}
stdTypeMappings := getStdTypeMappings(data)
+ // get due date field
+ dueDateField := "due"
+ if data.Options.ScopeConfig != nil && data.Options.ScopeConfig.TaskDueDateField != "" {
+ dueDateField = data.Options.ScopeConfig.TaskDueDateField
+ }
extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{
RawDataSubTaskArgs: *rawDataSubTaskArgs,
BatchSize: 100,
@@ -63,7 +71,10 @@ func ExtractTasks(taskCtx plugin.SubTaskContext) errors.Error {
return nil, err
}
toolL := taskBody.Task
-
+ err = errors.Convert(toolL.SetAllFields(row.Data))
+ if err != nil {
+ return nil, err
+ }
toolL.ConnectionId = data.Options.ConnectionId
toolL.Type = "TASK"
toolL.StdType = stdTypeMappings[toolL.Type]
@@ -105,6 +116,8 @@ func ExtractTasks(taskCtx plugin.SubTaskContext) errors.Error {
results = append(results, toolLIssueLabel)
}
}
+ loc, _ := time.LoadLocation("Asia/Shanghai")
+ toolL.DueDate, _ = utils.GetTimeFeildFromMap(toolL.AllFields, dueDateField, loc)
return results, nil
},
})
diff --git a/backend/plugins/zentao/e2e/bug_test.go b/backend/plugins/zentao/e2e/bug_test.go
index 16dbc6c11..4acc3b18c 100644
--- a/backend/plugins/zentao/e2e/bug_test.go
+++ b/backend/plugins/zentao/e2e/bug_test.go
@@ -83,3 +83,48 @@ func TestZentaoBugDataFlow(t *testing.T) {
IgnoreTypes: []interface{}{common.NoPKModel{}},
})
}
+
+func TestZentaoBugCustomizeDueDate(t *testing.T) {
+ var zentao impl.Zentao
+ dataflowTester := e2ehelper.NewDataFlowTester(t, "zentao", zentao)
+
+ taskData := &tasks.ZentaoTaskData{
+ Options: &tasks.ZentaoOptions{
+ ConnectionId: 1,
+ ProjectId: 1,
+ ScopeConfig: &models.ZentaoScopeConfig{
+ TypeMappings: map[string]string{
+ "codeerror": "CODE_ERROR",
+ },
+ BugStatusMappings: map[string]string{
+ "active": ticket.DONE,
+ },
+ BugDueDateField: "closedDate",
+ },
+ },
+ Bugs: map[int64]struct{}{},
+ AccountCache: tasks.NewAccountCache(dataflowTester.Dal, 1),
+ ApiClient: getFakeAPIClient(),
+ }
+
+ // import raw data table
+ dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_zentao_api_bugs_for_due_date.csv",
+ "_raw_zentao_api_bugs")
+
+ // verify extraction
+ dataflowTester.FlushTabler(&models.ZentaoBug{})
+ dataflowTester.Subtask(tasks.ExtractBugMeta, taskData)
+ dataflowTester.VerifyTableWithOptions(&models.ZentaoBug{}, e2ehelper.TableOptions{
+ CSVRelPath: "./snapshot_tables/_tool_zentao_bugs_for_due_date.csv",
+ IgnoreTypes: []interface{}{common.NoPKModel{}},
+ })
+
+ dataflowTester.FlushTabler(&ticket.Issue{})
+ dataflowTester.Subtask(tasks.ConvertBugMeta, taskData)
+
+ dataflowTester.VerifyTableWithOptions(&ticket.Issue{}, e2ehelper.TableOptions{
+ CSVRelPath: "./snapshot_tables/issues_bug_for_due_date.csv",
+ IgnoreTypes: []interface{}{common.NoPKModel{}},
+ IgnoreFields: []string{"original_project"},
+ })
+}
diff --git a/backend/plugins/zentao/e2e/raw_tables/_raw_zentao_api_bugs_for_due_date.csv b/backend/plugins/zentao/e2e/raw_tables/_raw_zentao_api_bugs_for_due_date.csv
new file mode 100644
index 000000000..225de2e56
--- /dev/null
+++ b/backend/plugins/zentao/e2e/raw_tables/_raw_zentao_api_bugs_for_due_date.csv
@@ -0,0 +1,2 @@
+id,params,data,url,input,created_at
+1,"{""ConnectionId"":1,""ProjectId"":1}","{""id"":4,""project"":7,""product"":3,""injection"":0,""identify"":0,""branch"":0,""module"":11,""execution"":1,""plan"":0,""story"":4,""storyVersion"":1,""task"":9,""toTask"":0,""toStory"":0,""title"":""\u552e\u540e\u670d\u52a1\u9875\u9762\u95ee\u9898"",""keywords"":"""",""severity"":3,""pri"":1,""type"":""codeerror"",""os"":"""",""browser"":"""",""hardware"":"""",""found"":"""",""steps"":""\u003Cp\u003E[\u6b65\u9aa4]\u8fdb\u5165\u552e\u540e\u67 [...]
diff --git a/backend/plugins/zentao/e2e/raw_tables/_raw_zentao_api_stories_for_due_date.csv b/backend/plugins/zentao/e2e/raw_tables/_raw_zentao_api_stories_for_due_date.csv
new file mode 100644
index 000000000..504e51067
--- /dev/null
+++ b/backend/plugins/zentao/e2e/raw_tables/_raw_zentao_api_stories_for_due_date.csv
@@ -0,0 +1,2 @@
+id,params,data,url,input,created_at
+1,"{""ConnectionId"":1,""ProjectId"":1}","{""id"":7,""vision"":""rnd"",""parent"":0,""product"":3,""branch"":0,""module"":7,""plan"":""1"",""source"":""po"",""sourceNote"":"""",""fromBug"":0,""feedback"":0,""title"":""\u5173\u4e8e\u6211\u4eec\u7684\u8bbe\u8ba1\u548c\u5f00\u53d1"",""keywords"":"""",""type"":""story"",""category"":""feature"",""pri"":1,""estimate"":1,""status"":""reviewing"",""subStatus"":"""",""color"":"""",""stage"":""planned"",""stagedBy"":"""",""mailto"":[],""lib"":0," [...]
diff --git a/backend/plugins/zentao/e2e/raw_tables/_raw_zentao_api_tasks_for_due_date.csv b/backend/plugins/zentao/e2e/raw_tables/_raw_zentao_api_tasks_for_due_date.csv
new file mode 100644
index 000000000..e28d68a11
--- /dev/null
+++ b/backend/plugins/zentao/e2e/raw_tables/_raw_zentao_api_tasks_for_due_date.csv
@@ -0,0 +1,4 @@
+id,params,data,url,input,created_at
+1,"{""ConnectionId"":1,""ProjectId"":1}","{""id"":1,""project"":1,""parent"":0,""execution"":1,""module"":0,""design"":0,""story"":0,""storyVersion"":1,""designVersion"":0,""fromBug"":0,""feedback"":0,""fromIssue"":0,""name"":""\u4efb\u52a1\u540d\u79f0"",""type"":""devel"",""mode"":"""",""pri"":3,""estimate"":0,""consumed"":0,""left"":0,""deadline"":""2022-10-01"",""status"":""wait"",""subStatus"":"""",""color"":"""",""mailto"":[{""id"":2,""account"":""productManager"",""avatar"":"""","" [...]
+2,"{""ConnectionId"":1,""ProjectId"":1}","{""id"":2,""project"":1,""parent"":0,""execution"":1,""module"":0,""design"":0,""story"":0,""storyVersion"":1,""designVersion"":0,""fromBug"":0,""feedback"":0,""fromIssue"":0,""name"":""\u4efb\u52a1\u540d\u79f0"",""type"":""devel"",""mode"":"""",""pri"":3,""estimate"":12.1,""consumed"":2.1,""left"":10,""deadline"":""2022-10-01"",""status"":""wait"",""subStatus"":"""",""color"":"""",""mailto"":[{""id"":2,""account"":""productManager"",""avatar"":" [...]
+4,"{""ConnectionId"":1,""ProjectId"":1}","{""id"":3,""project"":1,""parent"":-1,""execution"":1,""module"":0,""design"":0,""story"":0,""storyVersion"":1,""designVersion"":0,""fromBug"":0,""feedback"":0,""fromIssue"":0,""name"":""\u4efb\u52a1\u540d\u79f0"",""type"":""devel"",""mode"":"""",""pri"":3,""estimate"":11.2,""consumed"":0,""left"":0,""deadline"":""2022-10-01"",""status"":""wait"",""subStatus"":"""",""color"":"""",""mailto"":[{""id"":2,""account"":""productManager"",""avatar"":""" [...]
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 57c974124..0fc9a4e9c 100644
--- a/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_bugs.csv
+++ b/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_bugs.csv
@@ -1,19 +1,19 @@
-connection_id,id,project,product,injection,identify,branch,module,execution,plan,story,story_version,task,to_task,to_story,title,keywords,severity,pri,type,os,browser,hardware,found,steps,status,sub_status,color,confirmed,activated_count,activated_date,feedback_by,notify_email,opened_by_id,opened_by_name,opened_date,opened_build,assigned_to_id,assigned_to_name,assigned_date,deadline,resolved_by_id,resolution,resolved_build,resolved_date,closed_by_id,closed_date,duplicate_bug,link_bug,fee [...]
+connection_id,id,project,product,injection,identify,branch,module,execution,plan,story,story_version,task,to_task,to_story,title,keywords,severity,pri,type,os,browser,hardware,found,steps,status,sub_status,color,confirmed,activated_count,activated_date,feedback_by,notify_email,opened_by_id,opened_by_name,opened_date,opened_build,assigned_to_id,assigned_to_name,assigned_date,deadline,resolved_by_id,resolution,resolved_build,resolved_date,closed_by_id,closed_date,duplicate_bug,link_bug,fee [...]
1,1,1,3,0,0,0,8,1,0,1,1,1,0,0,首页页面问题,,3,1,codeerror,,,,,"<p>[步骤]进入首页</p>
<p>[结果]出现乱码 </p>
-<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
+<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-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
+<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
1,3,1,3,0,0,0,10,1,0,3,2,6,0,0,成果展示页面问题,,3,1,codeerror,,,,,"<p>[步骤]进入成果展示 </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
+<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,
1,4,1,3,0,0,0,11,1,0,4,1,9,0,0,售后服务页面问题,,3,1,codeerror,,,,,"<p>[步骤]进入售后服务</p>
<p>[结果]乱码</p>
-<p>[期望]正常显示</p>",resolved,,,1,0,,,,9,测试丙,2012-06-05T03:00:19.000+00:00,主干,9,测试丙,2022-10-05T04:10:08.000+00:00,,1,fixed,主干,2022-10-05T04:09:59.000+00:00,0,,0,,0,0,0,0,,,,,,,0,1,2022-10-05T04:10:08.000+00:00,0,1,3,0,已解决,normal,http://iwater.red:8000/api.php/v1/products/1/bugs?limit=100&page=1,resolved,BUG
+<p>[期望]正常显示</p>",resolved,,,1,0,,,,9,测试丙,2012-06-05T03:00:19.000+00:00,主干,9,测试丙,2022-10-05T04:10:08.000+00:00,,1,fixed,主干,2022-10-05T04:09:59.000+00:00,0,,0,,0,0,0,0,,,,,,,0,1,2022-10-05T04:10:08.000+00:00,0,1,3,0,已解决,normal,http://iwater.red:8000/api.php/v1/products/1/bugs?limit=100&page=1,resolved,BUG,
1,5,1,3,0,0,0,8,1,0,1,1,1,0,0,首页页面问题,,3,1,codeerror,,,,,"<p>[步骤]进入首页</p>
<p>[结果]出现乱码 </p>
-<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
+<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-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
+<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
diff --git a/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_bugs_for_due_date.csv b/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_bugs_for_due_date.csv
new file mode 100644
index 000000000..ce9ae00f4
--- /dev/null
+++ b/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_bugs_for_due_date.csv
@@ -0,0 +1,4 @@
+connection_id,id,project,product,injection,identify,branch,module,execution,plan,story,story_version,task,to_task,to_story,title,keywords,severity,pri,type,os,browser,hardware,found,steps,status,sub_status,color,confirmed,activated_count,activated_date,feedback_by,notify_email,opened_by_id,opened_by_name,opened_date,opened_build,assigned_to_id,assigned_to_name,assigned_date,deadline,resolved_by_id,resolution,resolved_build,resolved_date,closed_by_id,closed_date,duplicate_bug,link_bug,fee [...]
+1,4,1,3,0,0,0,11,1,0,4,1,9,0,0,售后服务页面问题,,3,1,codeerror,,,,,"<p>[步骤]进入售后服务</p>
+<p>[结果]乱码</p>
+<p>[期望]正常显示</p>",resolved,,,1,0,,,,9,测试丙,2012-06-05T03:00:19.000+00:00,主干,9,测试丙,2022-10-05T04:10:08.000+00:00,,1,fixed,主干,2022-10-05T04:09:59.000+00:00,0,2022-10-05T04:09:59.000+00:00,0,,0,0,0,0,,,,,,,0,1,2022-10-05T04:10:08.000+00:00,0,1,3,0,已解决,normal,http://iwater.red:8000/api.php/v1/products/1/bugs?limit=100&page=1,resolved,BUG,2022-10-05T04:09:59.000+00:00
diff --git a/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_stories_for_due_date.csv b/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_stories_for_due_date.csv
new file mode 100644
index 000000000..0d2aebc1f
--- /dev/null
+++ b/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_stories_for_due_date.csv
@@ -0,0 +1,2 @@
+connection_id,id,product,branch,version,order_in,vision,parent,module,plan,source,source_note,from_bug,feedback,title,keywords,type,category,pri,estimate,status,sub_status,color,stage,lib,from_story,from_version,opened_by_id,opened_by_name,opened_date,assigned_to_id,assigned_to_name,assigned_date,approved_date,last_edited_id,last_edited_date,changed_date,reviewed_by_id,reviewed_date,closed_id,closed_date,closed_reason,activated_date,to_bug,child_stories,link_stories,link_requirements,dup [...]
+1,7,3,0,1,0,rnd,0,7,1,po,,0,0,关于我们的设计和开发,,story,feature,1,1,reviewing,,,planned,0,0,1,2,产品经理,2012-06-05T02:24:19.000+00:00,2,产品经理,2012-06-05T02:24:19.000+00:00,,0,,,0,,0,,,,0,,,,0,0,,,0,0,1,1.0版本 ,http://iwater.red:8000/api.php/v1/products/1/stories?limit=100&page=1,reviewing,REQUIREMENT,
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 839123389..de8583f98 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-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,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
-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
+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
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
new file mode 100644
index 000000000..632ffcc4f
--- /dev/null
+++ b/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_tasks_for_due_date.csv
@@ -0,0 +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
diff --git a/backend/plugins/zentao/e2e/snapshot_tables/issues_bug.csv b/backend/plugins/zentao/e2e/snapshot_tables/issues_bug.csv
index 680fcb3ad..d15bec1c8 100644
--- a/backend/plugins/zentao/e2e/snapshot_tables/issues_bug.csv
+++ b/backend/plugins/zentao/e2e/snapshot_tables/issues_bug.csv
@@ -1,7 +1,7 @@
-id,url,icon_url,issue_key,title,description,epic_key,type,original_type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,parent_issue_id,priority,severity,urgency,component,is_subtask
-zentao:ZentaoBug:1:1,http://iwater.red:8000/bug-view-1.html,,1,首页页面问题,,,BUG,bug,DONE,active,,,2012-06-05T02:56:11.000+00:00,2021-04-28T03:09:08.000+00:00,,,,,zentao:ZentaoAccount:1:7,测试甲,zentao:ZentaoAccount:1:4,开发甲,zentao:ZentaoStory:1:1,1,,,,0
-zentao:ZentaoBug:1:2,http://iwater.red:8000/bug-view-2.html,,2,新闻中心页面问题,,,BUG,bug,DONE,active,,,2012-06-05T02:57:11.000+00:00,2022-10-05T04:19:22.000+00:00,,,,,zentao:ZentaoAccount:1:7,测试甲,,,zentao:ZentaoStory:1:2,2,,,,0
-zentao:ZentaoBug:1:3,http://iwater.red:8000/bug-view-3.html,,3,成果展示页面问题,,,BUG,bug,DONE,active,,,2012-06-05T02:58:22.000+00:00,2021-04-28T03:09:08.000+00:00,,,,,zentao:ZentaoAccount:1:8,测试乙,zentao:ZentaoAccount:1:4,开发甲,zentao:ZentaoStory:1:3,1,,,,0
-zentao:ZentaoBug:1:4,http://iwater.red:8000/bug-view-4.html,,4,售后服务页面问题,,,BUG,bug,resolved,resolved,,,2012-06-05T03:00:19.000+00:00,2022-10-05T04:10:08.000+00:00,,,,,zentao:ZentaoAccount:1:9,测试丙,zentao:ZentaoAccount:1:9,测试丙,zentao:ZentaoStory:1:4,1,,,,0
-zentao:ZentaoBug:1:5,http://iwater.red:8000/bug-view-5.html,,5,首页页面问题,,,BUG,bug,DONE,active,,,2012-06-05T02:56:11.000+00:00,2021-04-28T03:09:08.000+00:00,,,,,zentao:ZentaoAccount:1:7,测试甲,zentao:ZentaoAccount:1:4,开发甲,zentao:ZentaoStory:1:1,1,,,,0
-zentao:ZentaoBug:1:6,http://iwater.red:8000/bug-view-6.html,,6,新闻中心页面问题,,,BUG,bug,DONE,active,,,2012-06-05T02:57:11.000+00:00,2022-10-05T04:19:22.000+00:00,,,,,zentao:ZentaoAccount:1:7,测试甲,,,zentao:ZentaoStory:1:2,2,,,,0
+id,url,icon_url,issue_key,title,description,epic_key,type,original_type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,parent_issue_id,priority,severity,urgency,component,is_subtask,due_date
+zentao:ZentaoBug:1:1,http://iwater.red:8000/bug-view-1.html,,1,首页页面问题,,,BUG,bug,DONE,active,,,2012-06-05T02:56:11.000+00:00,2021-04-28T03:09:08.000+00:00,,,,,zentao:ZentaoAccount:1:7,测试甲,zentao:ZentaoAccount:1:4,开发甲,zentao:ZentaoStory:1:1,1,,,,0,
+zentao:ZentaoBug:1:2,http://iwater.red:8000/bug-view-2.html,,2,新闻中心页面问题,,,BUG,bug,DONE,active,,,2012-06-05T02:57:11.000+00:00,2022-10-05T04:19:22.000+00:00,,,,,zentao:ZentaoAccount:1:7,测试甲,,,zentao:ZentaoStory:1:2,2,,,,0,2022-10-05T16:00:00.000+00:00
+zentao:ZentaoBug:1:3,http://iwater.red:8000/bug-view-3.html,,3,成果展示页面问题,,,BUG,bug,DONE,active,,,2012-06-05T02:58:22.000+00:00,2021-04-28T03:09:08.000+00:00,,,,,zentao:ZentaoAccount:1:8,测试乙,zentao:ZentaoAccount:1:4,开发甲,zentao:ZentaoStory:1:3,1,,,,0,
+zentao:ZentaoBug:1:4,http://iwater.red:8000/bug-view-4.html,,4,售后服务页面问题,,,BUG,bug,resolved,resolved,,,2012-06-05T03:00:19.000+00:00,2022-10-05T04:10:08.000+00:00,,,,,zentao:ZentaoAccount:1:9,测试丙,zentao:ZentaoAccount:1:9,测试丙,zentao:ZentaoStory:1:4,1,,,,0,
+zentao:ZentaoBug:1:5,http://iwater.red:8000/bug-view-5.html,,5,首页页面问题,,,BUG,bug,DONE,active,,,2012-06-05T02:56:11.000+00:00,2021-04-28T03:09:08.000+00:00,,,,,zentao:ZentaoAccount:1:7,测试甲,zentao:ZentaoAccount:1:4,开发甲,zentao:ZentaoStory:1:1,1,,,,0,
+zentao:ZentaoBug:1:6,http://iwater.red:8000/bug-view-6.html,,6,新闻中心页面问题,,,BUG,bug,DONE,active,,,2012-06-05T02:57:11.000+00:00,2022-10-05T04:19:22.000+00:00,,,,,zentao:ZentaoAccount:1:7,测试甲,,,zentao:ZentaoStory:1:2,2,,,,0,2022-10-05T16:00:00.000+00:00
diff --git a/backend/plugins/zentao/e2e/snapshot_tables/issues_bug_for_due_date.csv b/backend/plugins/zentao/e2e/snapshot_tables/issues_bug_for_due_date.csv
new file mode 100644
index 000000000..3192e753b
--- /dev/null
+++ b/backend/plugins/zentao/e2e/snapshot_tables/issues_bug_for_due_date.csv
@@ -0,0 +1,2 @@
+id,url,icon_url,issue_key,title,description,epic_key,type,original_type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,parent_issue_id,priority,severity,urgency,component,is_subtask,due_date
+zentao:ZentaoBug:1:4,http://iwater.red:8000/bug-view-4.html,,4,售后服务页面问题,,,BUG,bug,resolved,resolved,,2022-10-05T04:09:59.000+00:00,2012-06-05T03:00:19.000+00:00,2022-10-05T04:10:08.000+00:00,5434629,,,,zentao:ZentaoAccount:1:9,测试丙,zentao:ZentaoAccount:1:9,测试丙,zentao:ZentaoStory:1:4,1,,,,0,2022-10-05T04:09:59.000+00:00
diff --git a/backend/plugins/zentao/e2e/snapshot_tables/issues_story_for_due_date.csv b/backend/plugins/zentao/e2e/snapshot_tables/issues_story_for_due_date.csv
new file mode 100644
index 000000000..045e885ee
--- /dev/null
+++ b/backend/plugins/zentao/e2e/snapshot_tables/issues_story_for_due_date.csv
@@ -0,0 +1,2 @@
+id,url,icon_url,issue_key,title,description,epic_key,type,original_type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,parent_issue_id,priority,severity,urgency,component,is_subtask,due_date
+zentao:ZentaoStory:1:7,http://iwater.red:8000/story-view-7.html,,7,关于我们的设计和开发,,,REQUIREMENT,story,reviewing,reviewing,1,,2012-06-05T02:24:19.000+00:00,,,60,,,zentao:ZentaoAccount:1:2,产品经理,zentao:ZentaoAccount:1:2,产品经理,,1,,,,0,
diff --git a/backend/plugins/zentao/e2e/snapshot_tables/issues_task.csv b/backend/plugins/zentao/e2e/snapshot_tables/issues_task.csv
index 0aedd8204..4fdd45104 100644
--- a/backend/plugins/zentao/e2e/snapshot_tables/issues_task.csv
+++ b/backend/plugins/zentao/e2e/snapshot_tables/issues_task.csv
@@ -1,4 +1,4 @@
-id,url,icon_url,issue_key,title,description,epic_key,type,original_type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,parent_issue_id,priority,severity,urgency,component,is_subtask
-zentao:ZentaoTask:1:1,http://iwater.red:8000/task-view-1.html,,1,任务名称,任务描述<span> </span><br /><div><br /></div>,,TECH,task,IN_PROGRESS,wait,,,2022-09-19T01:50:37.000+00:00,,,0,0,0,zentao:ZentaoAccount:1:1,devlake,zentao:ZentaoAccount:1:5,开发乙,,3,,,,0
-zentao:ZentaoTask:1:2,http://iwater.red:8000/task-view-2.html,,2,任务名称,任务描述<span> </span><br /><div><br /></div>,,TECH,task,IN_PROGRESS,wait,,,2022-09-19T01:50:37.000+00:00,,,726,126,600,zentao:ZentaoAccount:1:1,devlake,zentao:ZentaoAccount:1:5,开发乙,,3,,,,0
-zentao:ZentaoTask:1:3,http://iwater.red:8000/task-view-3.html,,3,任务名称,任务描述<span> </span><br /><div><br /></div>,,TECH,task,IN_PROGRESS,wait,,,2022-09-19T01:50:37.000+00:00,,,672,0,0,zentao:ZentaoAccount:1:1,devlake,zentao:ZentaoAccount:1:5,开发乙,zentao:ZentaoStory:1:-1,3,,,,0
+id,url,icon_url,issue_key,title,description,epic_key,type,original_type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,parent_issue_id,priority,severity,urgency,component,is_subtask,due_date
+zentao:ZentaoTask:1:1,http://iwater.red:8000/task-view-1.html,,1,任务名称,任务描述<span> </span><br /><div><br /></div>,,TECH,task,IN_PROGRESS,wait,,,2022-09-19T01:50:37.000+00:00,,,0,0,0,zentao:ZentaoAccount:1:1,devlake,zentao:ZentaoAccount:1:5,开发乙,,3,,,,0,2022-09-30T16:00:00.000+00:00
+zentao:ZentaoTask:1:2,http://iwater.red:8000/task-view-2.html,,2,任务名称,任务描述<span> </span><br /><div><br /></div>,,TECH,task,IN_PROGRESS,wait,,,2022-09-19T01:50:37.000+00:00,,,726,126,600,zentao:ZentaoAccount:1:1,devlake,zentao:ZentaoAccount:1:5,开发乙,,3,,,,0,2022-09-30T16:00:00.000+00:00
+zentao:ZentaoTask:1:3,http://iwater.red:8000/task-view-3.html,,3,任务名称,任务描述<span> </span><br /><div><br /></div>,,TECH,task,IN_PROGRESS,wait,,,2022-09-19T01:50:37.000+00:00,,,672,0,0,zentao:ZentaoAccount:1:1,devlake,zentao:ZentaoAccount:1:5,开发乙,zentao:ZentaoStory:1:-1,3,,,,0,2022-09-30T16:00:00.000+00:00
diff --git a/backend/plugins/zentao/e2e/snapshot_tables/issues_task.csv b/backend/plugins/zentao/e2e/snapshot_tables/issues_task_for_due_date.csv
similarity index 88%
copy from backend/plugins/zentao/e2e/snapshot_tables/issues_task.csv
copy to backend/plugins/zentao/e2e/snapshot_tables/issues_task_for_due_date.csv
index 0aedd8204..96c2a0325 100644
--- a/backend/plugins/zentao/e2e/snapshot_tables/issues_task.csv
+++ b/backend/plugins/zentao/e2e/snapshot_tables/issues_task_for_due_date.csv
@@ -1,4 +1,4 @@
-id,url,icon_url,issue_key,title,description,epic_key,type,original_type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,parent_issue_id,priority,severity,urgency,component,is_subtask
-zentao:ZentaoTask:1:1,http://iwater.red:8000/task-view-1.html,,1,任务名称,任务描述<span> </span><br /><div><br /></div>,,TECH,task,IN_PROGRESS,wait,,,2022-09-19T01:50:37.000+00:00,,,0,0,0,zentao:ZentaoAccount:1:1,devlake,zentao:ZentaoAccount:1:5,开发乙,,3,,,,0
-zentao:ZentaoTask:1:2,http://iwater.red:8000/task-view-2.html,,2,任务名称,任务描述<span> </span><br /><div><br /></div>,,TECH,task,IN_PROGRESS,wait,,,2022-09-19T01:50:37.000+00:00,,,726,126,600,zentao:ZentaoAccount:1:1,devlake,zentao:ZentaoAccount:1:5,开发乙,,3,,,,0
-zentao:ZentaoTask:1:3,http://iwater.red:8000/task-view-3.html,,3,任务名称,任务描述<span> </span><br /><div><br /></div>,,TECH,task,IN_PROGRESS,wait,,,2022-09-19T01:50:37.000+00:00,,,672,0,0,zentao:ZentaoAccount:1:1,devlake,zentao:ZentaoAccount:1:5,开发乙,zentao:ZentaoStory:1:-1,3,,,,0
+id,url,icon_url,issue_key,title,description,epic_key,type,original_type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,parent_issue_id,priority,severity,urgency,component,is_subtask,due_date
+zentao:ZentaoTask:1:1,http://iwater.red:8000/task-view-1.html,,1,任务名称,任务描述<span> </span><br /><div><br /></div>,,TECH,task,IN_PROGRESS,wait,,,2022-09-19T01:50:37.000+00:00,,,0,0,0,zentao:ZentaoAccount:1:1,devlake,zentao:ZentaoAccount:1:5,开发乙,,3,,,,0,
+zentao:ZentaoTask:1:2,http://iwater.red:8000/task-view-2.html,,2,任务名称,任务描述<span> </span><br /><div><br /></div>,,TECH,task,IN_PROGRESS,wait,,,2022-09-19T01:50:37.000+00:00,,,726,126,600,zentao:ZentaoAccount:1:1,devlake,zentao:ZentaoAccount:1:5,开发乙,,3,,,,0,
+zentao:ZentaoTask:1:3,http://iwater.red:8000/task-view-3.html,,3,任务名称,任务描述<span> </span><br /><div><br /></div>,,TECH,task,IN_PROGRESS,wait,,,2022-09-19T01:50:37.000+00:00,,,672,0,0,zentao:ZentaoAccount:1:1,devlake,zentao:ZentaoAccount:1:5,开发乙,zentao:ZentaoStory:1:-1,3,,,,0,2025-03-05T05:35:00.000+00:00
diff --git a/backend/plugins/zentao/e2e/story_test.go b/backend/plugins/zentao/e2e/story_test.go
index 754d19155..ce6b98719 100644
--- a/backend/plugins/zentao/e2e/story_test.go
+++ b/backend/plugins/zentao/e2e/story_test.go
@@ -83,3 +83,47 @@ func TestZentaoStoryDataFlow(t *testing.T) {
IgnoreTypes: []interface{}{common.NoPKModel{}},
})
}
+
+func TestZentaoStoryCustomizeDueDate(t *testing.T) {
+ var zentao impl.Zentao
+ dataflowTester := e2ehelper.NewDataFlowTester(t, "zentao", zentao)
+
+ taskData := &tasks.ZentaoTaskData{
+ Options: &tasks.ZentaoOptions{
+ ConnectionId: 1,
+ ProjectId: 1,
+ ScopeConfig: &models.ZentaoScopeConfig{
+ TypeMappings: map[string]string{
+ "story.feature": "REQUIRE",
+ },
+ StoryStatusMappings: map[string]string{
+ "active": ticket.DONE,
+ },
+ StoryDueDateField: "title",
+ },
+ },
+ Stories: map[int64]struct{}{},
+ AccountCache: tasks.NewAccountCache(dataflowTester.Dal, 1),
+ ApiClient: getFakeAPIClient(),
+ }
+
+ // import raw data table
+ dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_zentao_api_stories_for_due_date.csv",
+ "_raw_zentao_api_stories")
+
+ dataflowTester.FlushTabler(&models.ZentaoStory{})
+ dataflowTester.Subtask(tasks.ExtractStoryMeta, taskData)
+ dataflowTester.VerifyTableWithOptions(&models.ZentaoStory{}, e2ehelper.TableOptions{
+ CSVRelPath: "./snapshot_tables/_tool_zentao_stories_for_due_date.csv",
+ IgnoreTypes: []interface{}{common.NoPKModel{}},
+ })
+
+ dataflowTester.FlushTabler(&ticket.Issue{})
+ dataflowTester.Subtask(tasks.ConvertStoryMeta, taskData)
+
+ dataflowTester.VerifyTableWithOptions(&ticket.Issue{}, e2ehelper.TableOptions{
+ CSVRelPath: "./snapshot_tables/issues_story_for_due_date.csv",
+ IgnoreTypes: []interface{}{common.NoPKModel{}},
+ IgnoreFields: []string{"original_project"},
+ })
+}
diff --git a/backend/plugins/zentao/e2e/task_test.go b/backend/plugins/zentao/e2e/task_test.go
index a83ec4484..2e0ff8f75 100644
--- a/backend/plugins/zentao/e2e/task_test.go
+++ b/backend/plugins/zentao/e2e/task_test.go
@@ -84,3 +84,50 @@ func TestZentaoTaskDataFlow(t *testing.T) {
IgnoreTypes: []interface{}{common.NoPKModel{}},
})
}
+
+func TestZentaoTaskCustomizeDueDate(t *testing.T) {
+ var zentao impl.Zentao
+ dataflowTester := e2ehelper.NewDataFlowTester(t, "zentao", zentao)
+
+ taskData := &tasks.ZentaoTaskData{
+ Options: &tasks.ZentaoOptions{
+ ConnectionId: 1,
+ ProjectId: 1,
+ ScopeConfig: &models.ZentaoScopeConfig{
+ TypeMappings: map[string]string{
+ "devel": "TASK_DEV",
+ "bug": "BUG",
+ "story": "REQUIREMENT",
+ "task": "TECH",
+ },
+ TaskStatusMappings: map[string]string{
+ "wait": ticket.IN_PROGRESS,
+ },
+ TaskDueDateField: "activatedDate",
+ },
+ },
+ Tasks: map[int64]struct{}{},
+ AccountCache: tasks.NewAccountCache(dataflowTester.Dal, 1),
+ ApiClient: getFakeAPIClient(),
+ }
+
+ // import raw data table
+ dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_zentao_api_tasks_for_due_date.csv",
+ "_raw_zentao_api_tasks")
+
+ // verify extraction
+ dataflowTester.FlushTabler(&models.ZentaoTask{})
+ dataflowTester.Subtask(tasks.ExtractTaskMeta, taskData)
+ dataflowTester.VerifyTableWithOptions(&models.ZentaoTask{}, e2ehelper.TableOptions{
+ CSVRelPath: "./snapshot_tables/_tool_zentao_tasks_for_due_date.csv",
+ IgnoreTypes: []interface{}{common.NoPKModel{}},
+ })
+
+ dataflowTester.FlushTabler(&ticket.Issue{})
+ dataflowTester.Subtask(tasks.ConvertTaskMeta, taskData)
+ dataflowTester.VerifyTableWithOptions(&ticket.Issue{}, e2ehelper.TableOptions{
+ CSVRelPath: "./snapshot_tables/issues_task_for_due_date.csv",
+ IgnoreTypes: []interface{}{common.NoPKModel{}},
+ IgnoreFields: []string{"original_project"},
+ })
+}
diff --git a/backend/plugins/zentao/models/bug.go b/backend/plugins/zentao/models/bug.go
index f51e71e7b..c44cb8f2e 100644
--- a/backend/plugins/zentao/models/bug.go
+++ b/backend/plugins/zentao/models/bug.go
@@ -20,6 +20,7 @@ package models
import (
"bytes"
"encoding/json"
+ "time"
"github.com/apache/incubator-devlake/core/models/common"
)
@@ -55,71 +56,81 @@ func (a *ApiAccount) UnmarshalJSON(data []byte) error {
}
type ZentaoBugRes struct {
- ID int64 `json:"id"`
- Project int64 `json:"project"`
- Product int64 `json:"product"`
- Injection int `json:"injection"`
- Identify int `json:"identify"`
- Branch int `json:"branch"`
- Module int `json:"module"`
- Execution int64 `json:"execution"`
- Plan int `json:"plan"`
- Story int64 `json:"story"`
- StoryVersion int `json:"storyVersion"`
- Task int `json:"task"`
- ToTask int `json:"toTask"`
- ToStory int64 `json:"toStory"`
- Title string `json:"title"`
- Keywords string `json:"keywords"`
- Severity int `json:"severity"`
- Pri int `json:"pri"`
- Type string `json:"type"`
- Os string `json:"os"`
- Browser string `json:"browser"`
- Hardware string `json:"hardware"`
- Found string `json:"found"`
- Steps string `json:"steps"`
- Status string `json:"status"`
- SubStatus string `json:"subStatus"`
- Color string `json:"color"`
- Confirmed int `json:"confirmed"`
- ActivatedCount int `json:"activatedCount"`
- ActivatedDate *common.Iso8601Time `json:"activatedDate"`
- FeedbackBy string `json:"feedbackBy"`
- NotifyEmail string `json:"notifyEmail"`
- OpenedBy *ApiAccount `json:"openedBy"`
- OpenedDate *common.Iso8601Time `json:"openedDate"`
- OpenedBuild string `json:"openedBuild"`
- AssignedTo *ApiAccount `json:"assignedTo"`
- AssignedDate *common.Iso8601Time `json:"assignedDate"`
- Deadline string `json:"deadline"`
- ResolvedBy *ApiAccount `json:"resolvedBy"`
- Resolution string `json:"resolution"`
- ResolvedBuild string `json:"resolvedBuild"`
- ResolvedDate *common.Iso8601Time `json:"resolvedDate"`
- ClosedBy *ApiAccount `json:"closedBy"`
- ClosedDate *common.Iso8601Time `json:"closedDate"`
- DuplicateBug int `json:"duplicateBug"`
- LinkBug string `json:"linkBug"`
- Feedback int `json:"feedback"`
- Result int `json:"result"`
- Repo int `json:"repo"`
- Mr int `json:"mr"`
- Entry string `json:"entry"`
- NumOfLine string `json:"lines"`
- V1 string `json:"v1"`
- V2 string `json:"v2"`
- RepoType string `json:"repoType"`
- IssueKey string `json:"issueKey"`
- Testtask int `json:"testtask"`
- LastEditedBy *ApiAccount `json:"lastEditedBy"`
- LastEditedDate *common.Iso8601Time `json:"lastEditedDate"`
- Deleted bool `json:"deleted"`
- PriOrder *common.StringFloat64 `json:"priOrder"`
- SeverityOrder int `json:"severityOrder"`
- Needconfirm bool `json:"needconfirm"`
- StatusName string `json:"statusName"`
- ProductStatus string `json:"productStatus"`
+ AllFeilds map[string]interface{} `json:"-"`
+ ID int64 `json:"id"`
+ Project int64 `json:"project"`
+ Product int64 `json:"product"`
+ Injection int `json:"injection"`
+ Identify int `json:"identify"`
+ Branch int `json:"branch"`
+ Module int `json:"module"`
+ Execution int64 `json:"execution"`
+ Plan int `json:"plan"`
+ Story int64 `json:"story"`
+ StoryVersion int `json:"storyVersion"`
+ Task int `json:"task"`
+ ToTask int `json:"toTask"`
+ ToStory int64 `json:"toStory"`
+ Title string `json:"title"`
+ Keywords string `json:"keywords"`
+ Severity int `json:"severity"`
+ Pri int `json:"pri"`
+ Type string `json:"type"`
+ Os string `json:"os"`
+ Browser string `json:"browser"`
+ Hardware string `json:"hardware"`
+ Found string `json:"found"`
+ Steps string `json:"steps"`
+ Status string `json:"status"`
+ SubStatus string `json:"subStatus"`
+ Color string `json:"color"`
+ Confirmed int `json:"confirmed"`
+ ActivatedCount int `json:"activatedCount"`
+ ActivatedDate *common.Iso8601Time `json:"activatedDate"`
+ FeedbackBy string `json:"feedbackBy"`
+ NotifyEmail string `json:"notifyEmail"`
+ OpenedBy *ApiAccount `json:"openedBy"`
+ OpenedDate *common.Iso8601Time `json:"openedDate"`
+ OpenedBuild string `json:"openedBuild"`
+ AssignedTo *ApiAccount `json:"assignedTo"`
+ AssignedDate *common.Iso8601Time `json:"assignedDate"`
+ Deadline *common.CSTTime `json:"deadline"`
+ ResolvedBy *ApiAccount `json:"resolvedBy"`
+ Resolution string `json:"resolution"`
+ ResolvedBuild string `json:"resolvedBuild"`
+ ResolvedDate *common.Iso8601Time `json:"resolvedDate"`
+ ClosedBy *ApiAccount `json:"closedBy"`
+ ClosedDate *common.Iso8601Time `json:"closedDate"`
+ DuplicateBug int `json:"duplicateBug"`
+ LinkBug string `json:"linkBug"`
+ Feedback int `json:"feedback"`
+ Result int `json:"result"`
+ Repo int `json:"repo"`
+ Mr int `json:"mr"`
+ Entry string `json:"entry"`
+ NumOfLine string `json:"lines"`
+ V1 string `json:"v1"`
+ V2 string `json:"v2"`
+ RepoType string `json:"repoType"`
+ IssueKey string `json:"issueKey"`
+ Testtask int `json:"testtask"`
+ LastEditedBy *ApiAccount `json:"lastEditedBy"`
+ LastEditedDate *common.Iso8601Time `json:"lastEditedDate"`
+ Deleted bool `json:"deleted"`
+ PriOrder *common.StringFloat64 `json:"priOrder"`
+ SeverityOrder int `json:"severityOrder"`
+ Needconfirm bool `json:"needconfirm"`
+ StatusName string `json:"statusName"`
+ ProductStatus string `json:"productStatus"`
+}
+
+func (i *ZentaoBugRes) SetAllFeilds(raw json.RawMessage) error {
+ var allFeilds map[string]interface{}
+ if err := json.Unmarshal(raw, &allFeilds); err != nil {
+ return err
+ }
+ i.AllFeilds = allFeilds
+ return nil
}
type ZentaoBug struct {
@@ -164,7 +175,7 @@ type ZentaoBug struct {
AssignedToId int64
AssignedToName string
AssignedDate *common.Iso8601Time `json:"assignedDate"`
- Deadline string `json:"deadline"`
+ Deadline *common.CSTTime `json:"deadline"`
ResolvedById int64
Resolution string `json:"resolution"`
ResolvedBuild string `json:"resolvedBuild"`
@@ -195,6 +206,7 @@ type ZentaoBug struct {
Url string `json:"url"`
StdStatus string `json:"stdStatus" gorm:"type:varchar(20)"`
StdType string `json:"stdType" gorm:"type:varchar(20)"`
+ DueDate *time.Time `json:"dueDate"`
}
func (ZentaoBug) TableName() string {
diff --git a/backend/plugins/zentao/models/migrationscripts/20250305_update_scope_config.go b/backend/plugins/zentao/models/migrationscripts/20250305_update_scope_config.go
new file mode 100644
index 000000000..2a460e287
--- /dev/null
+++ b/backend/plugins/zentao/models/migrationscripts/20250305_update_scope_config.go
@@ -0,0 +1,80 @@
+/*
+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 migrationscripts
+
+import (
+ "time"
+
+ "github.com/apache/incubator-devlake/core/context"
+ "github.com/apache/incubator-devlake/core/errors"
+ "github.com/apache/incubator-devlake/helpers/migrationhelper"
+)
+
+type ZentaoScopeConfig20250305 struct {
+ BugDueDateField string `mapstructure:"bugDueDateField,omitempty" json:"bugDueDateField"`
+ TaskDueDateField string `mapstructure:"taskDueDateField,omitempty" json:"taskDueDateField"`
+ StoryDueDateField string `mapstructure:"storyDueDateField,omitempty" json:"storyDueDateField"`
+}
+
+func (t ZentaoScopeConfig20250305) TableName() string {
+ return "_tool_zentao_scope_configs"
+}
+
+type ZentaoBug20250310 struct {
+ DueDate *time.Time
+}
+
+func (t ZentaoBug20250310) TableName() string {
+ return "_tool_zentao_bugs"
+}
+
+type ZentaoTask20250310 struct {
+ DueDate *time.Time
+}
+
+func (t ZentaoTask20250310) TableName() string {
+ return "_tool_zentao_tasks"
+}
+
+type ZentaoStory20250310 struct {
+ DueDate *time.Time
+}
+
+func (t ZentaoStory20250310) TableName() string {
+ return "_tool_zentao_stories"
+}
+
+type updateScopeConfig struct{}
+
+func (*updateScopeConfig) Up(basicRes context.BasicRes) errors.Error {
+ return migrationhelper.AutoMigrateTables(
+ basicRes,
+ &ZentaoScopeConfig20250305{},
+ &ZentaoBug20250310{},
+ &ZentaoTask20250310{},
+ &ZentaoStory20250310{},
+ )
+}
+
+func (*updateScopeConfig) Version() uint64 {
+ return 20250305092300
+}
+
+func (*updateScopeConfig) Name() string {
+ return "zentao update scope config, add due date fields"
+}
diff --git a/backend/plugins/zentao/models/migrationscripts/register.go b/backend/plugins/zentao/models/migrationscripts/register.go
index 582d5432c..8e7dee7ba 100644
--- a/backend/plugins/zentao/models/migrationscripts/register.go
+++ b/backend/plugins/zentao/models/migrationscripts/register.go
@@ -33,5 +33,6 @@ func All() []plugin.MigrationScript {
new(addRawParamTableForScope),
new(dropTotalReal),
new(addWorklogs),
+ new(updateScopeConfig),
}
}
diff --git a/backend/plugins/zentao/models/scope_config.go b/backend/plugins/zentao/models/scope_config.go
index 1c0222c28..e0e2d0377 100644
--- a/backend/plugins/zentao/models/scope_config.go
+++ b/backend/plugins/zentao/models/scope_config.go
@@ -27,6 +27,9 @@ type ZentaoScopeConfig struct {
BugStatusMappings map[string]string `mapstructure:"bugStatusMappings,omitempty" json:"bugStatusMappings" gorm:"serializer:json"`
StoryStatusMappings map[string]string `mapstructure:"storyStatusMappings,omitempty" json:"storyStatusMappings" gorm:"serializer:json"`
TaskStatusMappings map[string]string `mapstructure:"taskStatusMappings,omitempty" json:"taskStatusMappings" gorm:"serializer:json"`
+ BugDueDateField string `mapstructure:"bugDueDateField,omitempty" json:"bugDueDateField" gorm:"column:bug_due_date_field"`
+ TaskDueDateField string `mapstructure:"taskDueDateField,omitempty" json:"taskDueDateField" gorm:"column:task_due_date_field"`
+ StoryDueDateField string `mapstructure:"storyDueDateField,omitempty" json:"storyDueDateField" gorm:"column:story_due_date_field"`
}
func (t ZentaoScopeConfig) TableName() string {
diff --git a/backend/plugins/zentao/models/story.go b/backend/plugins/zentao/models/story.go
index 42956b7fa..4281cd345 100644
--- a/backend/plugins/zentao/models/story.go
+++ b/backend/plugins/zentao/models/story.go
@@ -18,64 +18,77 @@ limitations under the License.
package models
import (
+ "encoding/json"
+ "time"
+
"github.com/apache/incubator-devlake/core/models/common"
)
type ZentaoStoryRes struct {
- ID int64 `json:"id"`
- Vision string `json:"vision"`
- Parent int64 `json:"parent"`
- Product int64 `json:"product"`
- Branch int `json:"branch"`
- Module int `json:"module"`
- Plan string `json:"plan"`
- Source string `json:"source"`
- SourceNote string `json:"sourceNote"`
- FromBug int `json:"fromBug"`
- Feedback int `json:"feedback"`
- Title string `json:"title"`
- Keywords string `json:"keywords"`
- Type string `json:"type"`
- Category string `json:"category"`
- Pri int `json:"pri"`
- Estimate float64 `json:"estimate"`
- Status string `json:"status"`
- SubStatus string `json:"subStatus"`
- Color string `json:"color"`
- Stage string `json:"stage"`
- Mailto []interface{} `json:"mailto"`
- Lib int `json:"lib"`
- FromStory int64 `json:"fromStory"`
- FromVersion int `json:"fromVersion"`
- OpenedBy *ApiAccount `json:"openedBy"`
- OpenedDate *common.Iso8601Time `json:"openedDate"`
- AssignedTo *ApiAccount `json:"assignedTo"`
- AssignedDate *common.Iso8601Time `json:"assignedDate"`
- ApprovedDate *common.Iso8601Time `json:"approvedDate"`
- LastEditedBy *ApiAccount `json:"lastEditedBy"`
- LastEditedDate *common.Iso8601Time `json:"lastEditedDate"`
- ChangedBy string `json:"changedBy"`
- ChangedDate *common.Iso8601Time `json:"changedDate"`
- ReviewedBy *ApiAccount `json:"reviewedBy"`
- ReviewedDate *common.Iso8601Time `json:"reviewedDate"`
- ClosedBy *ApiAccount `json:"closedBy"`
- ClosedDate *common.Iso8601Time `json:"closedDate"`
- ClosedReason string `json:"closedReason"`
- ActivatedDate *common.Iso8601Time `json:"activatedDate"`
- ToBug int `json:"toBug"`
- ChildStories string `json:"childStories"`
- LinkStories string `json:"linkStories"`
- LinkRequirements string `json:"linkRequirements"`
- DuplicateStory int64 `json:"duplicateStory"`
- Version int `json:"version"`
- StoryChanged string `json:"storyChanged"`
- FeedbackBy string `json:"feedbackBy"`
- NotifyEmail string `json:"notifyEmail"`
- URChanged string `json:"URChanged"`
- Deleted bool `json:"deleted"`
- PriOrder *common.StringFloat64 `json:"priOrder"`
- PlanTitle string `json:"planTitle"`
- ProductStatus string `json:"productStatus"`
+ AllFeilds map[string]interface{} `json:"-"`
+ ID int64 `json:"id"`
+ Vision string `json:"vision"`
+ Parent int64 `json:"parent"`
+ Product int64 `json:"product"`
+ Branch int `json:"branch"`
+ Module int `json:"module"`
+ Plan string `json:"plan"`
+ Source string `json:"source"`
+ SourceNote string `json:"sourceNote"`
+ FromBug int `json:"fromBug"`
+ Feedback int `json:"feedback"`
+ Title string `json:"title"`
+ Keywords string `json:"keywords"`
+ Type string `json:"type"`
+ Category string `json:"category"`
+ Pri int `json:"pri"`
+ Estimate float64 `json:"estimate"`
+ Status string `json:"status"`
+ SubStatus string `json:"subStatus"`
+ Color string `json:"color"`
+ Stage string `json:"stage"`
+ Mailto []interface{} `json:"mailto"`
+ Lib int `json:"lib"`
+ FromStory int64 `json:"fromStory"`
+ FromVersion int `json:"fromVersion"`
+ OpenedBy *ApiAccount `json:"openedBy"`
+ OpenedDate *common.Iso8601Time `json:"openedDate"`
+ AssignedTo *ApiAccount `json:"assignedTo"`
+ AssignedDate *common.Iso8601Time `json:"assignedDate"`
+ ApprovedDate *common.Iso8601Time `json:"approvedDate"`
+ LastEditedBy *ApiAccount `json:"lastEditedBy"`
+ LastEditedDate *common.Iso8601Time `json:"lastEditedDate"`
+ ChangedBy string `json:"changedBy"`
+ ChangedDate *common.Iso8601Time `json:"changedDate"`
+ ReviewedBy *ApiAccount `json:"reviewedBy"`
+ ReviewedDate *common.Iso8601Time `json:"reviewedDate"`
+ ClosedBy *ApiAccount `json:"closedBy"`
+ ClosedDate *common.Iso8601Time `json:"closedDate"`
+ ClosedReason string `json:"closedReason"`
+ ActivatedDate *common.Iso8601Time `json:"activatedDate"`
+ ToBug int `json:"toBug"`
+ ChildStories string `json:"childStories"`
+ LinkStories string `json:"linkStories"`
+ LinkRequirements string `json:"linkRequirements"`
+ DuplicateStory int64 `json:"duplicateStory"`
+ Version int `json:"version"`
+ StoryChanged string `json:"storyChanged"`
+ FeedbackBy string `json:"feedbackBy"`
+ NotifyEmail string `json:"notifyEmail"`
+ URChanged string `json:"URChanged"`
+ Deleted bool `json:"deleted"`
+ PriOrder *common.StringFloat64 `json:"priOrder"`
+ PlanTitle string `json:"planTitle"`
+ ProductStatus string `json:"productStatus"`
+}
+
+func (i *ZentaoStoryRes) SetAllFeilds(raw json.RawMessage) error {
+ var allFeilds map[string]interface{}
+ if err := json.Unmarshal(raw, &allFeilds); err != nil {
+ return err
+ }
+ i.AllFeilds = allFeilds
+ return nil
}
type ZentaoStory struct {
@@ -139,6 +152,7 @@ type ZentaoStory struct {
Url string `json:"url"`
StdStatus string `json:"stdStatus" gorm:"type:varchar(20)"`
StdType string `json:"stdType" gorm:"type:varchar(20)"`
+ DueDate *time.Time `json:"dueDate"`
}
func (ZentaoStory) TableName() string {
diff --git a/backend/plugins/zentao/models/task.go b/backend/plugins/zentao/models/task.go
index e5d9d14fe..34b5d8b9f 100644
--- a/backend/plugins/zentao/models/task.go
+++ b/backend/plugins/zentao/models/task.go
@@ -19,64 +19,67 @@ package models
import (
"encoding/json"
+ "time"
+
"github.com/apache/incubator-devlake/core/models/common"
)
type ZentaoTaskRes struct {
- Id int64 `json:"id"`
- 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"`
- Deadline string `json:"deadline"`
- Status string `json:"status"`
- SubStatus string `json:"subStatus"`
- Color string `json:"color"`
- Description string `json:"desc"`
- Version int `json:"version"`
- OpenedBy *ApiAccount `json:"openedBy"`
- OpenedDate *common.Iso8601Time `json:"openedDate"`
- AssignedTo *ApiAccount `json:"assignedTo"`
- AssignedDate *common.Iso8601Time `json:"assignedDate"`
- EstStarted string `json:"estStarted"`
- RealStarted *common.Iso8601Time `json:"realStarted"`
- FinishedBy *ApiAccount `json:"finishedBy"`
- FinishedDate *common.Iso8601Time `json:"finishedDate"`
- FinishedList string `json:"finishedList"`
- CanceledBy *ApiAccount `json:"canceledBy"`
- CanceledDate *common.Iso8601Time `json:"canceledDate"`
- ClosedBy *ApiAccount `json:"closedBy"`
- ClosedDate *common.Iso8601Time `json:"closedDate"`
- PlanDuration int `json:"planDuration"`
- RealDuration int `json:"realDuration"`
- ClosedReason string `json:"closedReason"`
- LastEditedBy *ApiAccount `json:"lastEditedBy"`
- LastEditedDate *common.Iso8601Time `json:"lastEditedDate"`
- ActivatedDate *common.Iso8601Time `json:"activatedDate"`
- OrderIn int `json:"order"`
- Repo int `json:"repo"`
- Mr int `json:"mr"`
- Entry string `json:"entry"`
- NumOfLine string `json:"lines"`
- V1 string `json:"v1"`
- V2 string `json:"v2"`
- Vision string `json:"vision"`
- StoryID *common.StringInt64 `json:"storyID"`
- StoryTitle string `json:"storyTitle"`
+ AllFeilds map[string]interface{} `json:"-"`
+ Id int64 `json:"id"`
+ 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"`
+ 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"`
+ OpenedBy *ApiAccount `json:"openedBy"`
+ OpenedDate *common.Iso8601Time `json:"openedDate"`
+ AssignedTo *ApiAccount `json:"assignedTo"`
+ AssignedDate *common.Iso8601Time `json:"assignedDate"`
+ EstStarted string `json:"estStarted"`
+ RealStarted *common.Iso8601Time `json:"realStarted"`
+ FinishedBy *ApiAccount `json:"finishedBy"`
+ FinishedDate *common.Iso8601Time `json:"finishedDate"`
+ FinishedList string `json:"finishedList"`
+ CanceledBy *ApiAccount `json:"canceledBy"`
+ CanceledDate *common.Iso8601Time `json:"canceledDate"`
+ ClosedBy *ApiAccount `json:"closedBy"`
+ ClosedDate *common.Iso8601Time `json:"closedDate"`
+ PlanDuration int `json:"planDuration"`
+ RealDuration int `json:"realDuration"`
+ ClosedReason string `json:"closedReason"`
+ LastEditedBy *ApiAccount `json:"lastEditedBy"`
+ LastEditedDate *common.Iso8601Time `json:"lastEditedDate"`
+ ActivatedDate *common.Iso8601Time `json:"activatedDate"`
+ OrderIn int `json:"order"`
+ Repo int `json:"repo"`
+ Mr int `json:"mr"`
+ Entry string `json:"entry"`
+ NumOfLine string `json:"lines"`
+ V1 string `json:"v1"`
+ V2 string `json:"v2"`
+ Vision string `json:"vision"`
+ StoryID *common.StringInt64 `json:"storyID"`
+ StoryTitle string `json:"storyTitle"`
Branch interface {
} `json:"branch"`
LatestStoryVersion interface {
@@ -95,34 +98,43 @@ func (zentaoTaskRes ZentaoTaskRes) ToJsonRawMessage() (json.RawMessage, error) {
return json.Marshal(zentaoTaskRes)
}
+func (zentaoTaskRes *ZentaoTaskRes) SetAllFeilds(raw json.RawMessage) error {
+ var allFeilds map[string]interface{}
+ if err := json.Unmarshal(raw, &allFeilds); err != nil {
+ return err
+ }
+ zentaoTaskRes.AllFeilds = 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 string `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 *common.CSTTime `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"`
@@ -165,6 +177,7 @@ type ZentaoTask struct {
Url string `json:"url"`
StdStatus string `json:"stdStatus" gorm:"type:varchar(20)"`
StdType string `json:"stdType" gorm:"type:varchar(20)"`
+ DueDate *time.Time `json:"dueDate"`
}
func (ZentaoTask) TableName() string {
diff --git a/backend/plugins/zentao/tasks/bug_convertor.go b/backend/plugins/zentao/tasks/bug_convertor.go
index 6a0f679b8..9f23d1129 100644
--- a/backend/plugins/zentao/tasks/bug_convertor.go
+++ b/backend/plugins/zentao/tasks/bug_convertor.go
@@ -105,6 +105,9 @@ func ConvertBug(taskCtx plugin.SubTaskContext) errors.Error {
if toolEntity.AssignedToId != 0 {
domainEntity.AssigneeId = accountIdGen.Generate(data.Options.ConnectionId, toolEntity.AssignedToId)
}
+ if toolEntity.DueDate != nil {
+ domainEntity.DueDate = toolEntity.DueDate
+ }
closedDate := toolEntity.ClosedDate
openedDate := toolEntity.OpenedDate
if closedDate != nil && closedDate.ToTime().After(openedDate.ToTime()) {
diff --git a/backend/plugins/zentao/tasks/bug_extractor.go b/backend/plugins/zentao/tasks/bug_extractor.go
index b5e898105..b71cf5172 100644
--- a/backend/plugins/zentao/tasks/bug_extractor.go
+++ b/backend/plugins/zentao/tasks/bug_extractor.go
@@ -19,11 +19,13 @@ package tasks
import (
"encoding/json"
+ "time"
"github.com/apache/incubator-devlake/core/errors"
"github.com/apache/incubator-devlake/core/models/domainlayer/ticket"
"github.com/apache/incubator-devlake/core/plugin"
"github.com/apache/incubator-devlake/helpers/pluginhelper/api"
+ "github.com/apache/incubator-devlake/helpers/utils"
"github.com/apache/incubator-devlake/plugins/zentao/models"
)
@@ -40,6 +42,10 @@ var ExtractBugMeta = plugin.SubTaskMeta{
func ExtractBug(taskCtx plugin.SubTaskContext) errors.Error {
data := taskCtx.GetData().(*ZentaoTaskData)
statusMappings := getBugStatusMapping(data)
+ dueDateField := "deadline"
+ if data.Options.ScopeConfig != nil && data.Options.ScopeConfig.BugDueDateField != "" {
+ dueDateField = data.Options.ScopeConfig.BugDueDateField
+ }
extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{
RawDataSubTaskArgs: api.RawDataSubTaskArgs{
Ctx: taskCtx,
@@ -52,6 +58,10 @@ func ExtractBug(taskCtx plugin.SubTaskContext) errors.Error {
if err != nil {
return nil, errors.Default.WrapRaw(err)
}
+ err = res.SetAllFeilds(row.Data)
+ if err != nil {
+ return nil, errors.Default.WrapRaw(err)
+ }
data.Bugs[res.ID] = struct{}{}
bug := &models.ZentaoBug{
ConnectionId: data.Options.ConnectionId,
@@ -124,6 +134,8 @@ func ExtractBug(taskCtx plugin.SubTaskContext) errors.Error {
ProductStatus: res.ProductStatus,
Url: row.Url,
}
+ loc, _ := time.LoadLocation("Asia/Shanghai")
+ bug.DueDate, _ = utils.GetTimeFeildFromMap(res.AllFeilds, dueDateField, loc)
switch bug.Status {
case "active", "closed", "resolved":
default:
diff --git a/backend/plugins/zentao/tasks/story_convertor.go b/backend/plugins/zentao/tasks/story_convertor.go
index c8b072766..6a0bc8104 100644
--- a/backend/plugins/zentao/tasks/story_convertor.go
+++ b/backend/plugins/zentao/tasks/story_convertor.go
@@ -104,6 +104,9 @@ func ConvertStory(taskCtx plugin.SubTaskContext) errors.Error {
if toolEntity.AssignedToId != 0 {
domainEntity.AssigneeId = accountIdGen.Generate(data.Options.ConnectionId, toolEntity.AssignedToId)
}
+ if toolEntity.DueDate != nil {
+ domainEntity.DueDate = toolEntity.DueDate
+ }
if domainEntity.OriginalStatus == "closed-closed" {
domainEntity.OriginalStatus = "closed"
}
diff --git a/backend/plugins/zentao/tasks/story_extractor.go b/backend/plugins/zentao/tasks/story_extractor.go
index 1d00dcf9e..72ee2a863 100644
--- a/backend/plugins/zentao/tasks/story_extractor.go
+++ b/backend/plugins/zentao/tasks/story_extractor.go
@@ -19,11 +19,13 @@ package tasks
import (
"encoding/json"
+ "time"
"github.com/apache/incubator-devlake/core/errors"
"github.com/apache/incubator-devlake/core/models/domainlayer/ticket"
"github.com/apache/incubator-devlake/core/plugin"
"github.com/apache/incubator-devlake/helpers/pluginhelper/api"
+ helpers "github.com/apache/incubator-devlake/helpers/utils"
"github.com/apache/incubator-devlake/plugins/zentao/models"
)
@@ -40,6 +42,11 @@ var ExtractStoryMeta = plugin.SubTaskMeta{
func ExtractStory(taskCtx plugin.SubTaskContext) errors.Error {
data := taskCtx.GetData().(*ZentaoTaskData)
statusMappings := getStoryStatusMapping(data)
+ dueDateField := ""
+ if data.Options.ScopeConfig != nil && data.Options.ScopeConfig.StoryDueDateField != "" {
+ dueDateField = data.Options.ScopeConfig.StoryDueDateField
+ }
+
extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{
RawDataSubTaskArgs: api.RawDataSubTaskArgs{
Ctx: taskCtx,
@@ -57,7 +64,6 @@ func ExtractStory(taskCtx plugin.SubTaskContext) errors.Error {
if err != nil {
return nil, errors.Default.WrapRaw(err)
}
-
data.Stories[res.ID] = struct{}{}
var results []interface{}
projectStory := &models.ZentaoProjectStory{
@@ -124,6 +130,14 @@ func ExtractStory(taskCtx plugin.SubTaskContext) errors.Error {
PlanTitle: res.PlanTitle,
Url: row.Url,
}
+ if dueDateField != "" {
+ err = res.SetAllFeilds(row.Data)
+ if err != nil {
+ return nil, errors.Default.WrapRaw(err)
+ }
+ loc, _ := time.LoadLocation("Asia/Shanghai")
+ story.DueDate, _ = helpers.GetTimeFeildFromMap(res.AllFeilds, dueDateField, loc)
+ }
if story.StdType == "" {
story.StdType = ticket.REQUIREMENT
}
diff --git a/backend/plugins/zentao/tasks/task_convertor.go b/backend/plugins/zentao/tasks/task_convertor.go
index 43d8b94c2..889403097 100644
--- a/backend/plugins/zentao/tasks/task_convertor.go
+++ b/backend/plugins/zentao/tasks/task_convertor.go
@@ -108,6 +108,9 @@ func ConvertTask(taskCtx plugin.SubTaskContext) errors.Error {
if toolEntity.AssignedToId != 0 {
domainEntity.AssigneeId = accountIdGen.Generate(data.Options.ConnectionId, toolEntity.AssignedToId)
}
+ if toolEntity.DueDate != nil {
+ domainEntity.DueDate = toolEntity.DueDate
+ }
closedDate := toolEntity.ClosedDate
openedDate := toolEntity.OpenedDate
if closedDate != nil && closedDate.ToTime().After(openedDate.ToTime()) {
diff --git a/backend/plugins/zentao/tasks/task_extractor.go b/backend/plugins/zentao/tasks/task_extractor.go
index 422e5eead..c18ed644b 100644
--- a/backend/plugins/zentao/tasks/task_extractor.go
+++ b/backend/plugins/zentao/tasks/task_extractor.go
@@ -19,10 +19,13 @@ package tasks
import (
"encoding/json"
+ "time"
+
"github.com/apache/incubator-devlake/core/errors"
"github.com/apache/incubator-devlake/core/models/domainlayer/ticket"
"github.com/apache/incubator-devlake/core/plugin"
"github.com/apache/incubator-devlake/helpers/pluginhelper/api"
+ "github.com/apache/incubator-devlake/helpers/utils"
"github.com/apache/incubator-devlake/plugins/zentao/models"
)
@@ -39,7 +42,10 @@ var ExtractTaskMeta = plugin.SubTaskMeta{
func ExtractTask(taskCtx plugin.SubTaskContext) errors.Error {
data := taskCtx.GetData().(*ZentaoTaskData)
et := newTaskExtractor(data)
-
+ dueDateField := "deadline"
+ if data.Options.ScopeConfig != nil && data.Options.ScopeConfig.TaskDueDateField != "" {
+ dueDateField = data.Options.ScopeConfig.TaskDueDateField
+ }
extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{
RawDataSubTaskArgs: api.RawDataSubTaskArgs{
Ctx: taskCtx,
@@ -52,13 +58,16 @@ func ExtractTask(taskCtx plugin.SubTaskContext) errors.Error {
if err != nil {
return nil, errors.Default.WrapRaw(err)
}
-
+ err = res.SetAllFeilds(row.Data)
+ if err != nil {
+ return nil, errors.Default.WrapRaw(err)
+ }
data.Tasks[res.Id] = struct{}{}
for _, t := range res.Children {
data.Tasks[t.Id] = struct{}{}
}
var tasks []*models.ZentaoTask
- et.toZentaoTasks(data.AccountCache, res, row.Url, &tasks)
+ et.toZentaoTasks(data.AccountCache, res, row.Url, &tasks, dueDateField)
var results []interface{}
for _, task := range tasks {
results = append(results, task)
@@ -85,7 +94,7 @@ func newTaskExtractor(data *ZentaoTaskData) *taskExtractor {
statusMappings: getTaskStatusMapping(data),
}
}
-func (c *taskExtractor) toZentaoTasks(accountCache *AccountCache, res *models.ZentaoTaskRes, url string, tasks *[]*models.ZentaoTask) {
+func (c *taskExtractor) toZentaoTasks(accountCache *AccountCache, res *models.ZentaoTaskRes, url string, tasks *[]*models.ZentaoTask, dueDateField string) {
task := &models.ZentaoTask{
ConnectionId: c.connectionId,
ID: res.Id,
@@ -151,6 +160,9 @@ func (c *taskExtractor) toZentaoTasks(accountCache *AccountCache, res *models.Ze
Progress: res.Progress,
Url: url,
}
+
+ loc, _ := time.LoadLocation("Asia/Shanghai")
+ task.DueDate, _ = utils.GetTimeFeildFromMap(res.AllFeilds, dueDateField, loc)
if task.StdType == "" {
task.StdType = ticket.TASK
}