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

warren pushed a commit to branch release-v0.14
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git

commit 507d56c803baf1935e9eeab9ef44be0a13841d60
Author: Yingchu Chen <[email protected]>
AuthorDate: Mon Oct 17 16:28:42 2022 +0800

    fix(tapd): add std value for status changelogs
    
    closes #3450 #3451
---
 plugins/tapd/e2e/bug_changelog_test.go             | 46 ++++++++++++++++++++++
 .../raw_tables/_raw_tapd_api_story_changelogs.csv  |  4 +-
 .../snapshot_tables/_tool_tapd_bug_labels_bug.csv  | 42 ++++++++++----------
 .../_tool_tapd_story_changelog_items.csv           |  2 +-
 .../tapd/e2e/snapshot_tables/board_issues_bug.csv  | 40 +++++++++----------
 .../e2e/snapshot_tables/board_issues_story.csv     | 40 +++++++++----------
 .../tapd/e2e/snapshot_tables/board_issues_task.csv | 30 +++++++-------
 .../e2e/snapshot_tables/issue_changelogs_story.csv | 16 ++++----
 plugins/tapd/e2e/story_changelog_test.go           | 44 +++++++++++++++++++++
 plugins/tapd/models/bug_status.go                  | 24 ++++++++++-
 plugins/tapd/models/story_status.go                | 12 ++++++
 plugins/tapd/tasks/bug_changelog_converter.go      | 16 +++++++-
 plugins/tapd/tasks/bug_converter.go                | 21 +++++-----
 plugins/tapd/tasks/bug_extractor.go                | 25 +-----------
 plugins/tapd/tasks/shared.go                       | 36 ++++++++++++++---
 plugins/tapd/tasks/story_changelog_converter.go    | 15 +++++++
 plugins/tapd/tasks/story_converter.go              |  2 +-
 plugins/tapd/tasks/story_extractor.go              | 29 +++-----------
 plugins/tapd/tasks/task_changelog_converter.go     | 19 +++++++++
 plugins/tapd/tasks/task_converter.go               |  2 +-
 20 files changed, 311 insertions(+), 154 deletions(-)

diff --git a/plugins/tapd/e2e/bug_changelog_test.go 
b/plugins/tapd/e2e/bug_changelog_test.go
index 69424172..81d66b01 100644
--- a/plugins/tapd/e2e/bug_changelog_test.go
+++ b/plugins/tapd/e2e/bug_changelog_test.go
@@ -38,8 +38,54 @@ func TestTapdBugChangelogDataFlow(t *testing.T) {
                        ConnectionId: 1,
                        CompanyId:    99,
                        WorkspaceId:  991,
+                       TransformationRules: tasks.TransformationRules{
+                               TypeMappings: map[string]tasks.TypeMapping{
+                                       "Techstory": {
+                                               StandardType: "REQUIREMENT",
+                                       },
+                                       "技术债": {
+                                               StandardType: "REQUIREMENT",
+                                       },
+                                       "需求": {
+                                               StandardType: "REQUIREMENT",
+                                       },
+                               },
+                               StatusMappings: map[string]tasks.OriginalStatus{
+                                       "doneStatus":       []string{"已关闭"},
+                                       "inprogressStatus": []string{"开发中", 
"developing", "test-11test-11test-12"},
+                                       "todoStatus":       []string{"重新打开", 
"planning", "test-11test-11test-11"},
+                               },
+                       },
                },
        }
+
+       // bug status
+       // import raw data table
+       
dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_tapd_api_bug_status.csv",
+               "_raw_tapd_api_bug_status")
+       
dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_tapd_api_bug_status_last_steps.csv",
+               "_raw_tapd_api_bug_status_last_steps")
+
+       // verify extraction
+       dataflowTester.FlushTabler(&models.TapdBugStatus{})
+       dataflowTester.Subtask(tasks.ExtractBugStatusMeta, taskData)
+       dataflowTester.Subtask(tasks.EnrichBugStatusLastStepMeta, taskData)
+       dataflowTester.VerifyTable(
+               models.TapdBugStatus{},
+               "./snapshot_tables/_tool_tapd_bug_statuses.csv",
+               []string{
+                       "connection_id",
+                       "workspace_id",
+                       "english_name",
+                       "chinese_name",
+                       "is_last_step",
+                       "_raw_data_params",
+                       "_raw_data_table",
+                       "_raw_data_id",
+                       "_raw_data_remark",
+               },
+       )
+
        // import raw data table
        
dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_tapd_api_bug_changelogs.csv",
                "_raw_tapd_api_bug_changelogs")
diff --git a/plugins/tapd/e2e/raw_tables/_raw_tapd_api_story_changelogs.csv 
b/plugins/tapd/e2e/raw_tables/_raw_tapd_api_story_changelogs.csv
index 332af0c1..3efc3ac9 100644
--- a/plugins/tapd/e2e/raw_tables/_raw_tapd_api_story_changelogs.csv
+++ b/plugins/tapd/e2e/raw_tables/_raw_tapd_api_story_changelogs.csv
@@ -1,6 +1,6 @@
 id,params,data,url,input,created_at
 
1,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}","{""WorkitemChange"":{""id"":""11991001000065"",""workspace_id"":""991"",""workitem_type_id"":""0"",""creator"":""test-11test-11"",""created"":""2019-12-12
 
15:46:25"",""change_summary"":""delete"",""comment"":null,""changes"":""[{\""field\"":\""delete_story\"",\""value_before\"":\""--\"",\""value_after\"":\""--\""}]"",""entity_type"":""Story"",""change_type"":"""",""change_type_text"":"""",""field_changes"":[{""field"":""delete
 [...]
 
2,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}","{""WorkitemChange"":{""id"":""11991001000093"",""workspace_id"":""991"",""workitem_type_id"":""11991001000020"",""creator"":""test-11test-11test-11"",""created"":""2019-12-12
 
18:01:42"",""change_summary"":""planning"",""comment"":null,""changes"":""[{\""field\"":\""owner\"",\""value_before\"":\""\"",\""value_after\"":\""u5d14u6600;\""}]"",""entity_type"":""Story"",""change_type"":"""",""change_type_text"":"""",""field_changes"
 [...]
-3,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}","{""WorkitemChange"":{""id"":""11991001000095"",""workspace_id"":""991"",""workitem_type_id"":""11991001000020"",""creator"":""test-11test-11test-11"",""created"":""2019-12-12
 
18:12:07"",""change_summary"":""planning"",""comment"":""test-11test-11test-11test-11<div><\/div>"",""changes"":""[{\""field\"":\""status\"",\""value_before\"":\""planning\"",\""value_after\"":\""developing\""},{\""field\"":\""owner\"",\""value_before\"":
 [...]
+3,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}","{""WorkitemChange"":{""id"":""11991001000095"",""workspace_id"":""991"",""workitem_type_id"":""11991001000020"",""creator"":""test-11test-11test-11"",""created"":""2019-12-12
 
18:12:07"",""change_summary"":""planning"",""comment"":""test-11test-11test-11test-11<div><\/div>"",""changes"":""[{\""field\"":\""status\"",\""value_before\"":\""planning\"",\""value_after\"":\""developing\""},{\""field\"":\""owner\"",\""value_before\"":
 [...]
 
4,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}","{""WorkitemChange"":{""id"":""11991001000096"",""workspace_id"":""991"",""workitem_type_id"":""11991001000020"",""creator"":""test-11test-11test-11"",""created"":""2019-12-12
 
18:13:04"",""change_summary"":""developing"",""comment"":null,""changes"":""[{\""field\"":\""due\"",\""value_before\"":\""2019-12-13\"",\""value_after\"":\""2020-01-08\""}]"",""entity_type"":""Story"",""change_type"":"""",""change_type_text"":"""",""field
 [...]
-5,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}","{""WorkitemChange"":{""id"":""11991001000103"",""workspace_id"":""991"",""workitem_type_id"":""0"",""creator"":""test-11test-11test-11"",""created"":""2019-12-12
 
18:21:58"",""change_summary"":""planning"",""comment"":null,""changes"":""[{\""field\"":\""name\"",\""value_before\"":\""\test-11\test-11\test-11\test-11\"",\""value_after\"":\""\test-11\test-11\test-11\test-11\""}]"",""entity_type"":""Story"",""change_type"":"""",""c
 [...]
+5,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}","{""WorkitemChange"":{""id"":""11991001000103"",""workspace_id"":""991"",""workitem_type_id"":""0"",""creator"":""test-11test-11test-11"",""created"":""2019-12-12
 
18:21:58"",""change_summary"":""planning"",""comment"":null,""changes"":""[{\""field\"":\""name\"",\""value_before\"":\""开发中\"",\""value_after\"":\""\test-11\test-11\test-11\test-11\""}]"",""entity_type"":""Story"",""change_type"":"""",""change_type_text"":"""",""fiel
 [...]
diff --git a/plugins/tapd/e2e/snapshot_tables/_tool_tapd_bug_labels_bug.csv 
b/plugins/tapd/e2e/snapshot_tables/_tool_tapd_bug_labels_bug.csv
index 066a9832..4d947861 100644
--- a/plugins/tapd/e2e/snapshot_tables/_tool_tapd_bug_labels_bug.csv
+++ b/plugins/tapd/e2e/snapshot_tables/_tool_tapd_bug_labels_bug.csv
@@ -1,21 +1,21 @@
-id,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark,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
-tapd:TapdIssue:1:11991001001025,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1271,,https://www.tapd.cn/991/prong/stories/view/11991001001025,11991001001025,,,,BUG,IN_PROGRESS,,0,,,,0,tapd:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11.,tapd:TapdAccount:1:,,normal,,,test-11test-11.
-tapd:TapdIssue:1:11991001001030,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1272,,https://www.tapd.cn/991/prong/stories/view/11991001001030,11991001001030,,,,BUG,IN_PROGRESS,开发中,0,,,,0,tapd:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11.,tapd:TapdAccount:1:,,normal,,,test-11test-11.
-tapd:TapdIssue:1:11991001001031,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1273,,https://www.tapd.cn/991/prong/stories/view/11991001001031,11991001001031,,,,BUG,IN_PROGRESS,开发中,0,,,,0,tapd:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11.,tapd:TapdAccount:1:,,normal,,,test-11test-11.
-tapd:TapdIssue:1:11991001001032,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1274,,https://www.tapd.cn/991/prong/stories/view/11991001001032,11991001001032,,,,BUG,IN_PROGRESS,,0,,,,0,tapd:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11.,tapd:TapdAccount:1:,,normal,,,test-11test-11.
-tapd:TapdIssue:1:11991001001417,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1275,,https://www.tapd.cn/991/prong/stories/view/11991001001417,11991001001417,,,,BUG,DONE,已拒绝,0,,,,0,tapd:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,normal,,,test-11test-11test-11
-tapd:TapdIssue:1:11991001001418,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1276,,https://www.tapd.cn/991/prong/stories/view/11991001001418,11991001001418,,,,BUG,DONE,已拒绝,0,,,,0,tapd:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,normal,,,test-11test-11test-11
-tapd:TapdIssue:1:11991001001420,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1277,,https://www.tapd.cn/991/prong/stories/view/11991001001420,11991001001420,,,,BUG,IN_PROGRESS,,0,,,,0,tapd:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:,,normal,,,test-11test-11test-11
-tapd:TapdIssue:1:11991001001422,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1278,,https://www.tapd.cn/991/prong/stories/view/11991001001422,11991001001422,,,,BUG,DONE,已拒绝,0,,,,0,tapd:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,normal,,,test-11test-11test-11
-tapd:TapdIssue:1:11991001001423,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1279,,https://www.tapd.cn/991/prong/stories/view/11991001001423,11991001001423,,,,BUG,DONE,已拒绝,0,,,,0,tapd:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,normal,,,test-11test-11test-11
-tapd:TapdIssue:1:11991001001425,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1280,,https://www.tapd.cn/991/prong/stories/view/11991001001425,11991001001425,,,,BUG,IN_PROGRESS,,0,,,,0,tapd:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:,,normal,,,test-11test-11test-11
-tapd:TapdIssue:1:11991001001426,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1281,,https://www.tapd.cn/991/prong/stories/view/11991001001426,11991001001426,,,,BUG,DONE,已拒绝,0,,,,0,tapd:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,normal,,,test-11test-11test-11
-tapd:TapdIssue:1:11991001001447,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1282,,https://www.tapd.cn/991/prong/stories/view/11991001001447,11991001001447,,,,BUG,IN_PROGRESS,,0,,,,0,tapd:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:,,normal,,,test-11test-11test-11
-tapd:TapdIssue:1:11991001001448,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1283,,https://www.tapd.cn/991/prong/stories/view/11991001001448,11991001001448,,,,BUG,DONE,已拒绝,0,,,,0,tapd:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,normal,,,test-11test-11test-11
-tapd:TapdIssue:1:11991001001450,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1284,,https://www.tapd.cn/991/prong/stories/view/11991001001450,11991001001450,,,,BUG,IN_PROGRESS,,0,,,,0,tapd:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:,,normal,,,test-11test-11test-11
-tapd:TapdIssue:1:11991001001451,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1285,,https://www.tapd.cn/991/prong/stories/view/11991001001451,11991001001451,,,,BUG,IN_PROGRESS,,0,,,,0,tapd:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:,,normal,,,test-11test-11test-11
-tapd:TapdIssue:1:11991001001710,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1286,,https://www.tapd.cn/991/prong/stories/view/11991001001710,11991001001710,,,,BUG,DONE,已拒绝,0,,,,0,tapd:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,normal,,,test-11test-11test-11
-tapd:TapdIssue:1:11991001001711,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1287,,https://www.tapd.cn/991/prong/stories/view/11991001001711,11991001001711,,,,BUG,DONE,已拒绝,0,,,,0,tapd:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,normal,,,test-11test-11test-11
-tapd:TapdIssue:1:11991001001737,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1288,,https://www.tapd.cn/991/prong/stories/view/11991001001737,11991001001737,,,,BUG,IN_PROGRESS,,0,,,,0,tapd:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:,,normal,,,test-11test-11test-11
-tapd:TapdIssue:1:11991001001739,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1289,,https://www.tapd.cn/991/prong/stories/view/11991001001739,11991001001739,,,,BUG,IN_PROGRESS,,0,,,,0,tapd:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:tt90ddtt9a81tt5bb5,tapd:TapdAccount:1:,,normal,,,tt90ddtt9a81tt5bb5
-tapd:TapdIssue:1:11991001001740,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1290,,https://www.tapd.cn/991/prong/stories/view/11991001001740,11991001001740,,,,BUG,DONE,已拒绝,0,,,,0,tapd:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:郝骁宵,tapd:TapdAccount:1:郝骁宵,郝骁宵,normal,,,郝骁宵
+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:TapdIssue:1:11991001001025,https://www.tapd.cn/991/prong/stories/view/11991001001025,11991001001025,,,,BUG,IN_PROGRESS,,0,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:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11.,tapd:TapdAccount:1:,,normal,,,test-11test-11.,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1271,
+tapd:TapdIssue:1:11991001001030,https://www.tapd.cn/991/prong/stories/view/11991001001030,11991001001030,,,,BUG,IN_PROGRESS,开发中,0,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:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11.,tapd:TapdAccount:1:,,normal,,,test-11test-11.,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1272,
+tapd:TapdIssue:1:11991001001031,https://www.tapd.cn/991/prong/stories/view/11991001001031,11991001001031,,,,BUG,IN_PROGRESS,开发中,0,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:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11.,tapd:TapdAccount:1:,,normal,,,test-11test-11.,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1273,
+tapd:TapdIssue:1:11991001001032,https://www.tapd.cn/991/prong/stories/view/11991001001032,11991001001032,,,,BUG,IN_PROGRESS,,0,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:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11.,tapd:TapdAccount:1:,,normal,,,test-11test-11.,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1274,
+tapd:TapdIssue:1:11991001001417,https://www.tapd.cn/991/prong/stories/view/11991001001417,11991001001417,,,,BUG,DONE,已拒绝,0,,2020-02-25T08:01:11.000+00:00,2020-03-04T08:12:14.000+00:00,0,tapd:TapdIssue:1:0,medium,0,0,0,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,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1275,
+tapd:TapdIssue:1:11991001001418,https://www.tapd.cn/991/prong/stories/view/11991001001418,11991001001418,,,,BUG,DONE,已拒绝,0,,2020-02-25T08:04:12.000+00:00,2020-03-04T08:27:29.000+00:00,0,tapd:TapdIssue:1:0,medium,0,0,0,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,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1276,
+tapd:TapdIssue:1:11991001001420,https://www.tapd.cn/991/prong/stories/view/11991001001420,11991001001420,,,,BUG,IN_PROGRESS,,0,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:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:,,normal,,,test-11test-11test-11,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1277,
+tapd:TapdIssue:1:11991001001422,https://www.tapd.cn/991/prong/stories/view/11991001001422,11991001001422,,,,BUG,DONE,已拒绝,0,,2020-02-25T08:10:51.000+00:00,2020-03-04T08:12:17.000+00:00,0,tapd:TapdIssue:1:0,medium,0,0,0,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,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1278,
+tapd:TapdIssue:1:11991001001423,https://www.tapd.cn/991/prong/stories/view/11991001001423,11991001001423,,,,BUG,DONE,已拒绝,0,,2020-02-25T08:12:56.000+00:00,2020-03-04T08:25:19.000+00:00,0,tapd:TapdIssue:1:0,medium,0,0,0,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,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1279,
+tapd:TapdIssue:1:11991001001425,https://www.tapd.cn/991/prong/stories/view/11991001001425,11991001001425,,,,BUG,IN_PROGRESS,,0,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:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:,,normal,,,test-11test-11test-11,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1280,
+tapd:TapdIssue:1:11991001001426,https://www.tapd.cn/991/prong/stories/view/11991001001426,11991001001426,,,,BUG,DONE,已拒绝,0,,2020-02-25T08:23:39.000+00:00,2020-03-04T08:12:19.000+00:00,0,tapd:TapdIssue:1:0,medium,0,0,0,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,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1281,
+tapd:TapdIssue:1:11991001001447,https://www.tapd.cn/991/prong/stories/view/11991001001447,11991001001447,,,,BUG,IN_PROGRESS,,0,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:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:,,normal,,,test-11test-11test-11,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1282,
+tapd:TapdIssue:1:11991001001448,https://www.tapd.cn/991/prong/stories/view/11991001001448,11991001001448,,,,BUG,DONE,已拒绝,0,,2020-02-27T03:14:02.000+00:00,2020-04-27T02:53:11.000+00:00,0,tapd:TapdIssue:1:0,medium,0,0,0,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,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1283,
+tapd:TapdIssue:1:11991001001450,https://www.tapd.cn/991/prong/stories/view/11991001001450,11991001001450,,,,BUG,IN_PROGRESS,,0,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:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:,,normal,,,test-11test-11test-11,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1284,
+tapd:TapdIssue:1:11991001001451,https://www.tapd.cn/991/prong/stories/view/11991001001451,11991001001451,,,,BUG,IN_PROGRESS,,0,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:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:,,normal,,,test-11test-11test-11,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1285,
+tapd:TapdIssue:1:11991001001710,https://www.tapd.cn/991/prong/stories/view/11991001001710,11991001001710,,,,BUG,DONE,已拒绝,0,,2020-03-13T06:14:26.000+00:00,2020-04-01T09:38:36.000+00:00,0,tapd:TapdIssue:1:0,medium,0,0,0,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,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1286,
+tapd:TapdIssue:1:11991001001711,https://www.tapd.cn/991/prong/stories/view/11991001001711,11991001001711,,,,BUG,DONE,已拒绝,0,,2020-03-13T06:20:04.000+00:00,2020-04-01T09:37:52.000+00:00,0,tapd:TapdIssue:1:0,medium,0,0,0,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,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1287,
+tapd:TapdIssue:1:11991001001737,https://www.tapd.cn/991/prong/stories/view/11991001001737,11991001001737,,,,BUG,IN_PROGRESS,,0,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:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:test-11test-11test-11,tapd:TapdAccount:1:,,normal,,,test-11test-11test-11,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1288,
+tapd:TapdIssue:1:11991001001739,https://www.tapd.cn/991/prong/stories/view/11991001001739,11991001001739,,,,BUG,IN_PROGRESS,,0,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:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:tt90ddtt9a81tt5bb5,tapd:TapdAccount:1:,,normal,,,tt90ddtt9a81tt5bb5,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1289,
+tapd:TapdIssue:1:11991001001740,https://www.tapd.cn/991/prong/stories/view/11991001001740,11991001001740,,,,BUG,DONE,已拒绝,0,,2020-03-18T07:37:43.000+00:00,2020-03-25T02:38:34.000+00:00,0,tapd:TapdIssue:1:0,medium,0,0,0,tapd:TapdAccount:1:郝骁宵,tapd:TapdAccount:1:郝骁宵,郝骁宵,normal,,,郝骁宵,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1290,
diff --git 
a/plugins/tapd/e2e/snapshot_tables/_tool_tapd_story_changelog_items.csv 
b/plugins/tapd/e2e/snapshot_tables/_tool_tapd_story_changelog_items.csv
index 933d48ad..23725838 100644
--- a/plugins/tapd/e2e/snapshot_tables/_tool_tapd_story_changelog_items.csv
+++ b/plugins/tapd/e2e/snapshot_tables/_tool_tapd_story_changelog_items.csv
@@ -3,6 +3,6 @@ 
connection_id,changelog_id,field,value_before_parsed,value_after_parsed,iteratio
 
1,11991001000093,owner,--,u5d14u6600;,0,0,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_story_changelogs,2,
 
1,11991001000095,comment,--,test-11test-11test-11test-11,0,0,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_story_changelogs,3,
 
1,11991001000095,owner,u5d14u6600;,u5d14u6600;u9648u5fd7u9274;,0,0,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_story_changelogs,3,
-1,11991001000095,status,test-11test-11test-11,test-11test-11test-11,0,0,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_story_changelogs,3,
+1,11991001000095,status,test-11test-11test-11,test-11test-11test-12,0,0,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_story_changelogs,3,
 
1,11991001000096,due,2019-12-13,2020-01-08,0,0,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_story_changelogs,4,
 
1,11991001000103,name,test-11test-11test-11test-11,test-11test-11test-11test-11,0,0,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_story_changelogs,5,
diff --git a/plugins/tapd/e2e/snapshot_tables/board_issues_bug.csv 
b/plugins/tapd/e2e/snapshot_tables/board_issues_bug.csv
index 9ed5c20f..2f39f9b1 100644
--- a/plugins/tapd/e2e/snapshot_tables/board_issues_bug.csv
+++ b/plugins/tapd/e2e/snapshot_tables/board_issues_bug.csv
@@ -1,21 +1,21 @@
 
board_id,issue_id,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001001025,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1271,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001001030,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1272,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001001031,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1273,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001001032,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1274,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001001417,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1275,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001001418,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1276,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001001420,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1277,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001001422,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1278,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001001423,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1279,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001001425,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1280,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001001426,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1281,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001001447,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1282,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001001448,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1283,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001001450,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1284,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001001451,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1285,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001001710,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1286,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001001711,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1287,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001001737,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1288,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001001739,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1289,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001001740,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1290,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001001025,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1271,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001001030,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1272,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001001031,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1273,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001001032,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1274,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001001417,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1275,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001001418,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1276,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001001420,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1277,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001001422,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1278,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001001423,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1279,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001001425,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1280,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001001426,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1281,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001001447,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1282,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001001448,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1283,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001001450,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1284,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001001451,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1285,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001001710,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1286,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001001711,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1287,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001001737,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1288,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001001739,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1289,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001001740,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_bugs,1290,
diff --git a/plugins/tapd/e2e/snapshot_tables/board_issues_story.csv 
b/plugins/tapd/e2e/snapshot_tables/board_issues_story.csv
index c47e3861..11743bec 100644
--- a/plugins/tapd/e2e/snapshot_tables/board_issues_story.csv
+++ b/plugins/tapd/e2e/snapshot_tables/board_issues_story.csv
@@ -1,21 +1,21 @@
 
board_id,issue_id,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001037563,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,1,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001037696,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,2,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001037697,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,3,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001038322,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,4,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001038323,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,5,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001038697,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,6,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001038911,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,7,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001038912,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,8,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001039664,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,9,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001039673,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,10,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001040086,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,11,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001040088,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,12,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001041163,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,13,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001041164,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,14,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001041165,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,15,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001041166,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,16,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001041788,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,17,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001041789,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,18,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001041899,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,19,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001041900,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,20,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001037563,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,1,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001037696,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,2,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001037697,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,3,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001038322,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,4,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001038323,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,5,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001038697,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,6,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001038911,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,7,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001038912,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,8,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001039664,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,9,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001039673,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,10,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001040086,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,11,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001040088,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,12,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001041163,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,13,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001041164,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,14,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001041165,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,15,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001041166,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,16,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001041788,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,17,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001041789,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,18,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001041899,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,19,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001041900,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_stories,20,
diff --git a/plugins/tapd/e2e/snapshot_tables/board_issues_task.csv 
b/plugins/tapd/e2e/snapshot_tables/board_issues_task.csv
index 75cadfb1..df972fc8 100644
--- a/plugins/tapd/e2e/snapshot_tables/board_issues_task.csv
+++ b/plugins/tapd/e2e/snapshot_tables/board_issues_task.csv
@@ -1,16 +1,16 @@
 
board_id,issue_id,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001015107,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4339,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001015121,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4340,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001015142,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4341,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001015184,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4342,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001015203,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4343,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001015207,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4344,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001015253,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4345,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001015307,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4346,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001015309,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4347,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001015340,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4348,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001015361,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4349,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001015431,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4350,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001015441,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4351,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001015452,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4352,
-tapd:TapdWorkspace:991,tapd:TapdIssue:1:11991001015583,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4353,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001015107,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4339,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001015121,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4340,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001015142,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4341,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001015184,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4342,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001015203,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4343,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001015207,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4344,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001015253,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4345,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001015307,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4346,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001015309,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4347,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001015340,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4348,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001015361,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4349,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001015431,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4350,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001015441,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4351,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001015452,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4352,
+tapd:TapdWorkspace:1:991,tapd:TapdIssue:1:11991001015583,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_tasks,4353,
diff --git a/plugins/tapd/e2e/snapshot_tables/issue_changelogs_story.csv 
b/plugins/tapd/e2e/snapshot_tables/issue_changelogs_story.csv
index 7af650a7..574a490b 100644
--- a/plugins/tapd/e2e/snapshot_tables/issue_changelogs_story.csv
+++ b/plugins/tapd/e2e/snapshot_tables/issue_changelogs_story.csv
@@ -1,8 +1,8 @@
-id,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark,issue_id,author_id,author_name,field_id,field_name,from_value,to_value,created_date,original_from_value,original_to_value
-tapd:TapdStoryChangelog:1:11991001000065:delete_story,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_story_changelogs,1,,tapd:TapdIssue:1:11991001000028,tapd:TapdAccount:1:test-11test-11,test-11test-11,delete_story,delete_story,,,2019-12-12T07:46:25.000+00:00,--,--
-tapd:TapdStoryChangelog:1:11991001000093:owner,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_story_changelogs,2,,tapd:TapdIssue:1:11991001000033,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,owner,owner,,,2019-12-12T10:01:42.000+00:00,--,u5d14u6600;
-tapd:TapdStoryChangelog:1:11991001000095:comment,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_story_changelogs,3,,tapd:TapdIssue:1:11991001000033,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,comment,comment,,,2019-12-12T10:12:07.000+00:00,--,test-11test-11test-11test-11
-tapd:TapdStoryChangelog:1:11991001000095:owner,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_story_changelogs,3,,tapd:TapdIssue:1:11991001000033,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,owner,owner,,,2019-12-12T10:12:07.000+00:00,u5d14u6600;,u5d14u6600;u9648u5fd7u9274;
-tapd:TapdStoryChangelog:1:11991001000095:status,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_story_changelogs,3,,tapd:TapdIssue:1:11991001000033,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,status,status,,,2019-12-12T10:12:07.000+00:00,test-11test-11test-11,test-11test-11test-11
-tapd:TapdStoryChangelog:1:11991001000096:due,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_story_changelogs,4,,tapd:TapdIssue:1:11991001000033,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,due,due,,,2019-12-12T10:13:04.000+00:00,2019-12-13,2020-01-08
-tapd:TapdStoryChangelog:1:11991001000103:name,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_story_changelogs,5,,tapd:TapdIssue:1:11991001000046,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,name,name,,,2019-12-12T10:21:58.000+00:00,test-11test-11test-11test-11,test-11test-11test-11test-11
+id,issue_id,author_id,author_name,field_id,field_name,from_value,to_value,created_date,original_from_value,original_to_value,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
+tapd:TapdStoryChangelog:1:11991001000065:delete_story,tapd:TapdIssue:1:11991001000028,tapd:TapdAccount:1:test-11test-11,test-11test-11,delete_story,delete_story,,,2019-12-12T07:46:25.000+00:00,--,--,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_story_changelogs,1,
+tapd:TapdStoryChangelog:1:11991001000093:owner,tapd:TapdIssue:1:11991001000033,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,owner,owner,,,2019-12-12T10:01:42.000+00:00,--,u5d14u6600;,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_story_changelogs,2,
+tapd:TapdStoryChangelog:1:11991001000095:comment,tapd:TapdIssue:1:11991001000033,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,comment,comment,,,2019-12-12T10:12:07.000+00:00,--,test-11test-11test-11test-11,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_story_changelogs,3,
+tapd:TapdStoryChangelog:1:11991001000095:owner,tapd:TapdIssue:1:11991001000033,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,owner,owner,,,2019-12-12T10:12:07.000+00:00,u5d14u6600;,u5d14u6600;u9648u5fd7u9274;,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_story_changelogs,3,
+tapd:TapdStoryChangelog:1:11991001000095:status,tapd:TapdIssue:1:11991001000033,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,status,status,todoStatus,inprogressStatus,2019-12-12T10:12:07.000+00:00,test-11test-11test-11,test-11test-11test-12,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_story_changelogs,3,
+tapd:TapdStoryChangelog:1:11991001000096:due,tapd:TapdIssue:1:11991001000033,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,due,due,,,2019-12-12T10:13:04.000+00:00,2019-12-13,2020-01-08,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_story_changelogs,4,
+tapd:TapdStoryChangelog:1:11991001000103:name,tapd:TapdIssue:1:11991001000046,tapd:TapdAccount:1:test-11test-11test-11,test-11test-11test-11,name,name,,,2019-12-12T10:21:58.000+00:00,test-11test-11test-11test-11,test-11test-11test-11test-11,"{""ConnectionId"":1,""CompanyId"":0,""WorkspaceId"":991}",_raw_tapd_api_story_changelogs,5,
diff --git a/plugins/tapd/e2e/story_changelog_test.go 
b/plugins/tapd/e2e/story_changelog_test.go
index c89277ce..37ecef4f 100644
--- a/plugins/tapd/e2e/story_changelog_test.go
+++ b/plugins/tapd/e2e/story_changelog_test.go
@@ -38,8 +38,52 @@ func TestTapdStoryChangelogDataFlow(t *testing.T) {
                        ConnectionId: 1,
                        CompanyId:    99,
                        WorkspaceId:  991,
+                       TransformationRules: tasks.TransformationRules{
+                               TypeMappings: map[string]tasks.TypeMapping{
+                                       "Techstory": {
+                                               StandardType: "REQUIREMENT",
+                                       },
+                                       "技术债": {
+                                               StandardType: "REQUIREMENT",
+                                       },
+                                       "需求": {
+                                               StandardType: "REQUIREMENT",
+                                       },
+                               },
+                               StatusMappings: map[string]tasks.OriginalStatus{
+                                       "doneStatus":       []string{"已关闭"},
+                                       "inprogressStatus": []string{"开发中", 
"developing", "test-11test-11test-12"},
+                                       "todoStatus":       []string{"重新打开", 
"planning", "test-11test-11test-11"},
+                               },
+                       },
                },
        }
+
+       
dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_tapd_api_story_status.csv",
+               "_raw_tapd_api_story_status")
+       
dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_tapd_api_story_status_last_steps.csv",
+               "_raw_tapd_api_story_status_last_steps")
+       // verify extraction
+       dataflowTester.FlushTabler(&models.TapdWorkitemType{})
+       dataflowTester.FlushTabler(&models.TapdStoryStatus{})
+       dataflowTester.Subtask(tasks.ExtractStoryStatusMeta, taskData)
+       dataflowTester.Subtask(tasks.EnrichStoryStatusLastStepMeta, taskData)
+       dataflowTester.VerifyTable(
+               models.TapdStoryStatus{},
+               "./snapshot_tables/_tool_tapd_story_statuses.csv",
+               []string{
+                       "connection_id",
+                       "workspace_id",
+                       "english_name",
+                       "chinese_name",
+                       "is_last_step",
+                       "_raw_data_params",
+                       "_raw_data_table",
+                       "_raw_data_id",
+                       "_raw_data_remark",
+               },
+       )
+
        // import raw data table
        
dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_tapd_api_story_changelogs.csv",
                "_raw_tapd_api_story_changelogs")
diff --git a/plugins/tapd/models/bug_status.go 
b/plugins/tapd/models/bug_status.go
index 7a83acc9..9b28b3d8 100644
--- a/plugins/tapd/models/bug_status.go
+++ b/plugins/tapd/models/bug_status.go
@@ -17,7 +17,9 @@ limitations under the License.
 
 package models
 
-import "github.com/apache/incubator-devlake/models/common"
+import (
+       "github.com/apache/incubator-devlake/models/common"
+)
 
 type TapdBugStatus struct {
        ConnectionId uint64 `gorm:"primaryKey"`
@@ -31,3 +33,23 @@ type TapdBugStatus struct {
 func (TapdBugStatus) TableName() string {
        return "_tool_tapd_bug_statuses"
 }
+
+type TapdStatus interface {
+       GetChinese() string
+       GetEnglish() string
+       GetIsLastStep() bool
+}
+
+func (s TapdBugStatus) GetChinese() string {
+       return s.ChineseName
+}
+
+func (s TapdBugStatus) GetEnglish() string {
+       return s.EnglishName
+}
+
+func (s TapdBugStatus) GetIsLastStep() bool {
+       return s.IsLastStep
+}
+
+var _ TapdStatus = (*TapdBugStatus)(nil)
diff --git a/plugins/tapd/models/story_status.go 
b/plugins/tapd/models/story_status.go
index 77e4c1fb..a574d8de 100644
--- a/plugins/tapd/models/story_status.go
+++ b/plugins/tapd/models/story_status.go
@@ -31,3 +31,15 @@ type TapdStoryStatus struct {
 func (TapdStoryStatus) TableName() string {
        return "_tool_tapd_story_statuses"
 }
+
+func (s TapdStoryStatus) GetChinese() string {
+       return s.ChineseName
+}
+
+func (s TapdStoryStatus) GetEnglish() string {
+       return s.EnglishName
+}
+
+func (s TapdStoryStatus) GetIsLastStep() bool {
+       return s.IsLastStep
+}
diff --git a/plugins/tapd/tasks/bug_changelog_converter.go 
b/plugins/tapd/tasks/bug_changelog_converter.go
index 9c6e5858..7f032177 100644
--- a/plugins/tapd/tasks/bug_changelog_converter.go
+++ b/plugins/tapd/tasks/bug_changelog_converter.go
@@ -56,6 +56,12 @@ func ConvertBugChangelog(taskCtx core.SubTaskContext) 
errors.Error {
        rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, 
RAW_BUG_CHANGELOG_TABLE, false)
        logger := taskCtx.GetLogger()
        db := taskCtx.GetDal()
+       statusList := make([]models.TapdBugStatus, 0)
+       _, getStdStatus, err := getDefaltStdStatusMapping(data, db, statusList)
+       if err != nil {
+               return err
+       }
+       customStatusMap := getStatusMapping(data)
        logger.Info("convert changelog :%d", data.Options.WorkspaceId)
        issueIdGen := didgen.NewDomainIdGenerator(&models.TapdIssue{})
        accountIdGen := didgen.NewDomainIdGenerator(&models.TapdAccount{})
@@ -93,7 +99,15 @@ func ConvertBugChangelog(taskCtx core.SubTaskContext) 
errors.Error {
                                OriginalToValue:   cl.ValueAfterParsed,
                                CreatedDate:       *cl.Created,
                        }
-
+                       if domainCl.FieldName == "status" {
+                               if len(customStatusMap) != 0 {
+                                       domainCl.FromValue = 
customStatusMap[domainCl.OriginalFromValue]
+                                       domainCl.ToValue = 
customStatusMap[domainCl.OriginalToValue]
+                               } else {
+                                       domainCl.FromValue = 
getStdStatus(domainCl.OriginalFromValue)
+                                       domainCl.ToValue = 
getStdStatus(domainCl.OriginalToValue)
+                               }
+                       }
                        return []interface{}{
                                domainCl,
                        }, nil
diff --git a/plugins/tapd/tasks/bug_converter.go 
b/plugins/tapd/tasks/bug_converter.go
index 364ad03f..ad603f14 100644
--- a/plugins/tapd/tasks/bug_converter.go
+++ b/plugins/tapd/tasks/bug_converter.go
@@ -21,6 +21,7 @@ import (
        "github.com/apache/incubator-devlake/errors"
        "reflect"
        "strconv"
+       "time"
 
        "github.com/apache/incubator-devlake/models/domainlayer/didgen"
 
@@ -62,15 +63,15 @@ func ConvertBug(taskCtx core.SubTaskContext) errors.Error {
                                DomainEntity: domainlayer.DomainEntity{
                                        Id: 
issueIdGen.Generate(toolL.ConnectionId, toolL.Id),
                                },
-                               Url:      toolL.Url,
-                               IssueKey: strconv.FormatUint(toolL.Id, 10),
-                               Title:    toolL.Title,
-                               EpicKey:  toolL.EpicKey,
-                               Type:     "BUG",
-                               Status:   toolL.StdStatus,
-                               //ResolutionDate: (*time.Time)(toolL.Resolved),
-                               //CreatedDate:    (*time.Time)(toolL.Created),
-                               //UpdatedDate:    (*time.Time)(toolL.Modified),
+                               Url:            toolL.Url,
+                               IssueKey:       strconv.FormatUint(toolL.Id, 
10),
+                               Title:          toolL.Title,
+                               EpicKey:        toolL.EpicKey,
+                               Type:           "BUG",
+                               Status:         toolL.StdStatus,
+                               ResolutionDate: (*time.Time)(toolL.Resolved),
+                               CreatedDate:    (*time.Time)(toolL.Created),
+                               UpdatedDate:    (*time.Time)(toolL.Modified),
                                ParentIssueId:  
issueIdGen.Generate(toolL.ConnectionId, toolL.IssueId),
                                Priority:       toolL.Priority,
                                CreatorId:      
accountIdGen.Generate(data.Options.ConnectionId, toolL.Reporter),
@@ -86,7 +87,7 @@ func ConvertBug(taskCtx core.SubTaskContext) errors.Error {
                        }
                        results := make([]interface{}, 0, 2)
                        boardIssue := &ticket.BoardIssue{
-                               BoardId: 
workspaceIdGen.Generate(toolL.WorkspaceId),
+                               BoardId: 
workspaceIdGen.Generate(toolL.ConnectionId, toolL.WorkspaceId),
                                IssueId: domainL.Id,
                        }
                        sprintIssue := &ticket.SprintIssue{
diff --git a/plugins/tapd/tasks/bug_extractor.go 
b/plugins/tapd/tasks/bug_extractor.go
index 7b48300d..65b94c46 100644
--- a/plugins/tapd/tasks/bug_extractor.go
+++ b/plugins/tapd/tasks/bug_extractor.go
@@ -23,9 +23,7 @@ import (
        "github.com/apache/incubator-devlake/errors"
        "strings"
 
-       "github.com/apache/incubator-devlake/models/domainlayer/ticket"
        "github.com/apache/incubator-devlake/plugins/core"
-       "github.com/apache/incubator-devlake/plugins/core/dal"
        "github.com/apache/incubator-devlake/plugins/helper"
        "github.com/apache/incubator-devlake/plugins/tapd/models"
 )
@@ -43,30 +41,11 @@ var ExtractBugMeta = core.SubTaskMeta{
 func ExtractBugs(taskCtx core.SubTaskContext) errors.Error {
        rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, 
RAW_BUG_TABLE, false)
        db := taskCtx.GetDal()
-       statusList := make([]*models.TapdBugStatus, 0)
-       clauses := []dal.Clause{
-               dal.Where("connection_id = ? and workspace_id = ?", 
data.Options.ConnectionId, data.Options.WorkspaceId),
-       }
-       err := db.All(&statusList, clauses...)
+       statusList := make([]models.TapdBugStatus, 0)
+       statusLanguageMap, getStdStatus, err := getDefaltStdStatusMapping(data, 
db, statusList)
        if err != nil {
                return err
        }
-
-       statusLanguageMap := make(map[string]string, len(statusList))
-       statusLastStepMap := make(map[string]bool, len(statusList))
-       for _, v := range statusList {
-               statusLanguageMap[v.EnglishName] = v.ChineseName
-               statusLastStepMap[v.ChineseName] = v.IsLastStep
-       }
-       getStdStatus := func(statusKey string) string {
-               if statusLastStepMap[statusKey] {
-                       return ticket.DONE
-               } else if statusKey == "新建" {
-                       return ticket.TODO
-               } else {
-                       return ticket.IN_PROGRESS
-               }
-       }
        customStatusMap := getStatusMapping(data)
 
        extractor, err := helper.NewApiExtractor(helper.ApiExtractorArgs{
diff --git a/plugins/tapd/tasks/shared.go b/plugins/tapd/tasks/shared.go
index 199c9d7a..c30906a5 100644
--- a/plugins/tapd/tasks/shared.go
+++ b/plugins/tapd/tasks/shared.go
@@ -22,6 +22,7 @@ import (
        goerror "errors"
        "fmt"
        "github.com/apache/incubator-devlake/errors"
+       "github.com/apache/incubator-devlake/models/domainlayer/ticket"
        "gorm.io/gorm"
        "io"
        "net/http"
@@ -42,8 +43,6 @@ type Data struct {
        Count int `json:"count"`
 }
 
-var statusMapping map[string]string
-
 var UserIdGen *didgen.DomainIdGenerator
 var WorkspaceIdGen *didgen.DomainIdGenerator
 var IssueIdGen *didgen.DomainIdGenerator
@@ -169,10 +168,7 @@ func getTypeMappings(data *TapdTaskData, db dal.Dal, 
system string) (*typeMappin
 }
 
 func getStatusMapping(data *TapdTaskData) map[string]string {
-       if len(statusMapping) != 0 {
-               return statusMapping
-       }
-       statusMapping = make(map[string]string)
+       statusMapping := make(map[string]string)
        mapping := data.Options.TransformationRules.StatusMappings
        for std, orig := range mapping {
                for _, v := range orig {
@@ -182,3 +178,31 @@ func getStatusMapping(data *TapdTaskData) 
map[string]string {
 
        return statusMapping
 }
+
+func getDefaltStdStatusMapping[S models.TapdStatus](data *TapdTaskData, db 
dal.Dal, statusList []S) (map[string]string, func(statusKey string) string, 
errors.Error) {
+       clauses := []dal.Clause{
+               dal.Where("connection_id = ? and workspace_id = ?", 
data.Options.ConnectionId, data.Options.WorkspaceId),
+       }
+       err := db.All(&statusList, clauses...)
+       if err != nil {
+               return nil, nil, err
+       }
+
+       statusLanguageMap := make(map[string]string, len(statusList))
+       statusLastStepMap := make(map[string]bool, len(statusList))
+
+       for _, v := range statusList {
+               statusLanguageMap[v.GetEnglish()] = v.GetChinese()
+               statusLastStepMap[v.GetChinese()] = v.GetIsLastStep()
+       }
+       getStdStatus := func(statusKey string) string {
+               if statusLastStepMap[statusKey] {
+                       return ticket.DONE
+               } else if statusKey == "草稿" {
+                       return ticket.TODO
+               } else {
+                       return ticket.IN_PROGRESS
+               }
+       }
+       return statusLanguageMap, getStdStatus, nil
+}
diff --git a/plugins/tapd/tasks/story_changelog_converter.go 
b/plugins/tapd/tasks/story_changelog_converter.go
index 005007ec..46b38c38 100644
--- a/plugins/tapd/tasks/story_changelog_converter.go
+++ b/plugins/tapd/tasks/story_changelog_converter.go
@@ -59,6 +59,12 @@ func ConvertStoryChangelog(taskCtx core.SubTaskContext) 
errors.Error {
        rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, 
RAW_STORY_CHANGELOG_TABLE, false)
        logger := taskCtx.GetLogger()
        db := taskCtx.GetDal()
+       statusList := make([]models.TapdStoryStatus, 0)
+       _, getStdStatus, err := getDefaltStdStatusMapping(data, db, statusList)
+       if err != nil {
+               return err
+       }
+       customStatusMap := getStatusMapping(data)
        logger.Info("convert changelog :%d", data.Options.WorkspaceId)
        clIdGen := didgen.NewDomainIdGenerator(&models.TapdStoryChangelog{})
        issueIdGen := didgen.NewDomainIdGenerator(&models.TapdIssue{})
@@ -96,6 +102,15 @@ func ConvertStoryChangelog(taskCtx core.SubTaskContext) 
errors.Error {
                                OriginalToValue:   cl.ValueAfterParsed,
                                CreatedDate:       *cl.Created,
                        }
+                       if domainCl.FieldName == "status" {
+                               if len(customStatusMap) != 0 {
+                                       domainCl.FromValue = 
customStatusMap[domainCl.OriginalFromValue]
+                                       domainCl.ToValue = 
customStatusMap[domainCl.OriginalToValue]
+                               } else {
+                                       domainCl.FromValue = 
getStdStatus(domainCl.OriginalFromValue)
+                                       domainCl.ToValue = 
getStdStatus(domainCl.OriginalToValue)
+                               }
+                       }
 
                        return []interface{}{
                                domainCl,
diff --git a/plugins/tapd/tasks/story_converter.go 
b/plugins/tapd/tasks/story_converter.go
index d458f7f6..a688b2af 100644
--- a/plugins/tapd/tasks/story_converter.go
+++ b/plugins/tapd/tasks/story_converter.go
@@ -89,7 +89,7 @@ func ConvertStory(taskCtx core.SubTaskContext) errors.Error {
                        }
                        results := make([]interface{}, 0, 2)
                        boardIssue := &ticket.BoardIssue{
-                               BoardId: 
workspaceIdGen.Generate(toolL.WorkspaceId),
+                               BoardId: 
workspaceIdGen.Generate(toolL.ConnectionId, toolL.WorkspaceId),
                                IssueId: domainL.Id,
                        }
                        sprintIssue := &ticket.SprintIssue{
diff --git a/plugins/tapd/tasks/story_extractor.go 
b/plugins/tapd/tasks/story_extractor.go
index d3788740..e1183828 100644
--- a/plugins/tapd/tasks/story_extractor.go
+++ b/plugins/tapd/tasks/story_extractor.go
@@ -23,9 +23,7 @@ import (
        "github.com/apache/incubator-devlake/errors"
        "strings"
 
-       "github.com/apache/incubator-devlake/models/domainlayer/ticket"
        "github.com/apache/incubator-devlake/plugins/core"
-       "github.com/apache/incubator-devlake/plugins/core/dal"
        "github.com/apache/incubator-devlake/plugins/helper"
        "github.com/apache/incubator-devlake/plugins/tapd/models"
 )
@@ -43,33 +41,16 @@ var ExtractStoryMeta = core.SubTaskMeta{
 func ExtractStories(taskCtx core.SubTaskContext) errors.Error {
        rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, 
RAW_STORY_TABLE, false)
        db := taskCtx.GetDal()
-       statusList := make([]*models.TapdStoryStatus, 0)
-       clauses := []dal.Clause{
-               dal.Where("connection_id = ? and workspace_id = ?", 
data.Options.ConnectionId, data.Options.WorkspaceId),
-       }
-       err := db.All(&statusList, clauses...)
+       statusList := make([]models.TapdStoryStatus, 0)
+       statusLanguageMap, getStdStatus, err := getDefaltStdStatusMapping(data, 
db, statusList)
        if err != nil {
                return err
        }
-
-       statusLanguageMap := make(map[string]string, len(statusList))
-       statusLastStepMap := make(map[string]bool, len(statusList))
-       for _, v := range statusList {
-               statusLanguageMap[v.EnglishName] = v.ChineseName
-               statusLastStepMap[v.ChineseName] = v.IsLastStep
-       }
-       getStdStatus := func(statusKey string) string {
-               if statusLastStepMap[statusKey] {
-                       return ticket.DONE
-               } else if statusKey == "草稿" {
-                       return ticket.TODO
-               } else {
-                       return ticket.IN_PROGRESS
-               }
-       }
        customStatusMap := getStatusMapping(data)
        typeMap, err := getTypeMappings(data, db, "story")
-
+       if err != nil {
+               return err
+       }
        extractor, err := helper.NewApiExtractor(helper.ApiExtractorArgs{
                RawDataSubTaskArgs: *rawDataSubTaskArgs,
                BatchSize:          100,
diff --git a/plugins/tapd/tasks/task_changelog_converter.go 
b/plugins/tapd/tasks/task_changelog_converter.go
index f6a3d9cf..57e65fe2 100644
--- a/plugins/tapd/tasks/task_changelog_converter.go
+++ b/plugins/tapd/tasks/task_changelog_converter.go
@@ -60,6 +60,16 @@ func ConvertTaskChangelog(taskCtx core.SubTaskContext) 
errors.Error {
        rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, 
RAW_TASK_CHANGELOG_TABLE, false)
        logger := taskCtx.GetLogger()
        db := taskCtx.GetDal()
+       customStatusMap := getStatusMapping(data)
+       getTaskStdStatus := func(statusKey string) string {
+               if statusKey == "done" {
+                       return ticket.DONE
+               } else if statusKey == "progressing" {
+                       return ticket.IN_PROGRESS
+               } else {
+                       return ticket.TODO
+               }
+       }
        logger.Info("convert changelog :%d", data.Options.WorkspaceId)
        clIdGen := didgen.NewDomainIdGenerator(&models.TapdTaskChangelog{})
        issueIdGen := didgen.NewDomainIdGenerator(&models.TapdIssue{})
@@ -96,6 +106,15 @@ func ConvertTaskChangelog(taskCtx core.SubTaskContext) 
errors.Error {
                                OriginalToValue:   cl.ValueAfterParsed,
                                CreatedDate:       *cl.Created,
                        }
+                       if domainCl.FieldName == "status" {
+                               if len(customStatusMap) != 0 {
+                                       domainCl.FromValue = 
customStatusMap[domainCl.OriginalFromValue]
+                                       domainCl.ToValue = 
customStatusMap[domainCl.OriginalToValue]
+                               } else {
+                                       domainCl.FromValue = 
getTaskStdStatus(domainCl.OriginalFromValue)
+                                       domainCl.ToValue = 
getTaskStdStatus(domainCl.OriginalToValue)
+                               }
+                       }
 
                        return []interface{}{
                                domainCl,
diff --git a/plugins/tapd/tasks/task_converter.go 
b/plugins/tapd/tasks/task_converter.go
index daca606a..30dad0a2 100644
--- a/plugins/tapd/tasks/task_converter.go
+++ b/plugins/tapd/tasks/task_converter.go
@@ -86,7 +86,7 @@ func ConvertTask(taskCtx core.SubTaskContext) errors.Error {
                        }
                        results := make([]interface{}, 0, 2)
                        boardIssue := &ticket.BoardIssue{
-                               BoardId: 
workspaceIdGen.Generate(toolL.WorkspaceId),
+                               BoardId: 
workspaceIdGen.Generate(toolL.ConnectionId, toolL.WorkspaceId),
                                IssueId: domainL.Id,
                        }
                        sprintIssue := &ticket.SprintIssue{

Reply via email to