You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by zh...@apache.org on 2022/07/08 03:38:06 UTC

[incubator-devlake] branch main updated: feat: update jira user to account and update changlog to issue_changlog (#2435)

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

zhangliang2022 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 0f21d25c feat: update jira user to account and update changlog to issue_changlog (#2435)
0f21d25c is described below

commit 0f21d25cf6c7cb250cba04edffca9aef7daca042
Author: abeizn <10...@users.noreply.github.com>
AuthorDate: Fri Jul 8 11:38:01 2022 +0800

    feat: update jira user to account and update changlog to issue_changlog (#2435)
    
    * feat: create tables
    
    * fix: remove OrgId field
    
    * refactor: rename users to accounts
    
    * feat: team feature update users to account on tool layer step2:github
    
    * feat: team feature update users to account on tool layer step2:github
    
    * feat: team feature update users to account on tool layer step2:github
    
    * feat: update gilab user to account
    
    * feat: update gilab user to account
    
    * feat: update gilab user to account
    
    * feat: update gilab user to account
    
    * feat: update jira user to account
    
    * feat: update jira user to account
    
    * feat: update jira user to account
    
    * feat: update jira user to account
    
    * feat: update jira user to account
    
    * feat: update jira user to account and update changelog to issue changelog
    
    Co-authored-by: zhangliang <li...@merico.dev>
---
 plugins/gitlab/e2e/issues_test.go                  |   5 +-
 plugins/gitlab/models/{user.go => account.go}      |   0
 plugins/gitlab/models/issue.go                     |  36 ------
 .../archived/{user.go => account.go}               |   0
 .../models/migrationscripts/archived/issue.go      |  36 ------
 plugins/gitlab/tasks/issue_extractor.go            |   6 +-
 plugins/jira/e2e/changelog_test.go                 |  22 ++--
 plugins/jira/e2e/issue_test.go                     |   6 +-
 ...logs.csv => _raw_jira_api_issue_changelogs.csv} |   0
 ...ms.csv => _tool_jira_issue_changelog_items.csv} |   0
 ...ngelogs.csv => _tool_jira_issue_changelogs.csv} |  60 ++++-----
 plugins/jira/e2e/snapshot_tables/changelogs.csv    |  31 -----
 .../jira/e2e/snapshot_tables/issue_changelogs.csv  |  31 +++++
 plugins/jira/e2e/snapshot_tables/issues.csv        |  60 ++++-----
 plugins/jira/impl/impl.go                          |  12 +-
 plugins/jira/models/{user.go => account.go}        |   4 +-
 .../models/{changelog.go => issue_changelog.go}    |  12 +-
 .../archived/{user.go => account.go}               |  18 +--
 .../jira/models/migrationscripts/archived/board.go |  23 +---
 .../archived/{project.go => board_issue.go}        |  13 +-
 .../models/migrationscripts/archived/connection.go |  66 ++++++++++
 .../archived/connection_history.go                 |  56 ++++++++
 .../jira/models/migrationscripts/archived/issue.go |  23 +---
 .../archived/{changelog.go => issue_changelog.go}  |  35 ++---
 .../archived/{remotelink.go => issue_commit.go}    |  18 +--
 .../issue_label.go}                                |  28 +---
 .../models/migrationscripts/archived/project.go    |  10 +-
 .../models/migrationscripts/archived/remotelink.go |   7 +-
 .../models/migrationscripts/archived/source.go     |  57 ---------
 .../models/migrationscripts/archived/sprint.go     |  10 +-
 .../status.go}                                     |  21 +--
 .../models/migrationscripts/archived/worklog.go    |   3 +-
 .../jira/models/migrationscripts/init_schema.go    | 142 +++++++++++++++++++--
 plugins/jira/models/migrationscripts/register.go   |  13 --
 .../migrationscripts/updateSchemas20220505.go      | 124 ------------------
 .../migrationscripts/updateSchemas20220507.go      |  94 --------------
 .../migrationscripts/updateSchemas20220525.go      |  61 ---------
 .../migrationscripts/updateSchemas20220526.go      |  99 --------------
 .../migrationscripts/updateSchemas20220527.go      |  68 ----------
 .../migrationscripts/updateSchemas20220601.go      | 132 -------------------
 .../migrationscripts/updateSchemas20220615.go      |  64 ----------
 .../migrationscripts/updateSchemas20220620.go      |  75 -----------
 .../migrationscripts/updateSchemas20220624.go      |  57 ---------
 .../migrationscripts/updateSchemas20220630.go      |  60 ---------
 .../migrationscripts/update_schemas20220518.go     |  96 --------------
 .../{user_collector.go => account_collector.go}    |  18 +--
 .../{user_convertor.go => account_convertor.go}    |  31 ++---
 .../{user_extractor.go => account_extractor.go}    |  12 +-
 plugins/jira/tasks/apiv2models/changelog.go        |  21 +--
 plugins/jira/tasks/apiv2models/issue.go            |  17 +--
 plugins/jira/tasks/apiv2models/user.go             |   8 +-
 plugins/jira/tasks/apiv2models/user_test.go        |   2 +-
 plugins/jira/tasks/apiv2models/worklog.go          |   7 +-
 ...g_collector.go => issue_changelog_collector.go} |  16 +--
 ...g_convertor.go => issue_changelog_convertor.go} |  47 +++----
 ...g_extractor.go => issue_changelog_extractor.go} |  12 +-
 plugins/jira/tasks/issue_convertor.go              |   9 +-
 plugins/jira/tasks/worklog_convertor.go            |   7 +-
 58 files changed, 564 insertions(+), 1437 deletions(-)

diff --git a/plugins/gitlab/e2e/issues_test.go b/plugins/gitlab/e2e/issues_test.go
index 13be2605..b98fcfdb 100644
--- a/plugins/gitlab/e2e/issues_test.go
+++ b/plugins/gitlab/e2e/issues_test.go
@@ -19,9 +19,10 @@ package e2e
 
 import (
 	"fmt"
-	"github.com/apache/incubator-devlake/models/domainlayer/ticket"
 	"testing"
 
+	"github.com/apache/incubator-devlake/models/domainlayer/ticket"
+
 	"github.com/apache/incubator-devlake/helpers/e2ehelper"
 	"github.com/apache/incubator-devlake/plugins/gitlab/impl"
 	"github.com/apache/incubator-devlake/plugins/gitlab/models"
@@ -45,7 +46,7 @@ func TestGitlabIssueDataFlow(t *testing.T) {
 
 	// verify extraction
 	dataflowTester.FlushTabler(&models.GitlabIssue{})
-	dataflowTester.FlushTabler(&models.GitlabAuthor{})
+	dataflowTester.FlushTabler(&models.GitlabAccount{})
 	dataflowTester.FlushTabler(&models.GitlabIssueLabel{})
 	dataflowTester.Subtask(tasks.ExtractApiIssuesMeta, taskData)
 	dataflowTester.VerifyTable(
diff --git a/plugins/gitlab/models/user.go b/plugins/gitlab/models/account.go
similarity index 100%
rename from plugins/gitlab/models/user.go
rename to plugins/gitlab/models/account.go
diff --git a/plugins/gitlab/models/issue.go b/plugins/gitlab/models/issue.go
index 9bcb1b57..a0296800 100644
--- a/plugins/gitlab/models/issue.go
+++ b/plugins/gitlab/models/issue.go
@@ -53,39 +53,3 @@ type GitlabIssue struct {
 func (GitlabIssue) TableName() string {
 	return "_tool_gitlab_issues"
 }
-
-type GitlabAuthor struct {
-	ConnectionId    uint64 `gorm:"primaryKey"`
-	GitlabId        int    `gorm:"primaryKey" json:"id"`
-	Username        string `gorm:"type:varchar(255)"`
-	Email           string `gorm:"type:varchar(255)"`
-	Name            string `gorm:"type:varchar(255)"`
-	State           string `gorm:"type:varchar(255)"`
-	MembershipState string `json:"membership_state" gorm:"type:varchar(255)"`
-	AvatarUrl       string `json:"avatar_url" gorm:"type:varchar(255)"`
-	WebUrl          string `json:"web_url" gorm:"type:varchar(255)"`
-
-	common.NoPKModel
-}
-
-func (GitlabAuthor) TableName() string {
-	return "_tool_gitlab_accounts"
-}
-
-type GitlabAssignee struct {
-	ConnectionId    uint64 `gorm:"primaryKey"`
-	GitlabId        int    `gorm:"primaryKey" json:"id"`
-	Username        string `gorm:"type:varchar(255)"`
-	Email           string `gorm:"type:varchar(255)"`
-	Name            string `gorm:"type:varchar(255)"`
-	State           string `gorm:"type:varchar(255)"`
-	MembershipState string `json:"membership_state" gorm:"type:varchar(255)"`
-	AvatarUrl       string `json:"avatar_url" gorm:"type:varchar(255)"`
-	WebUrl          string `json:"web_url" gorm:"type:varchar(255)"`
-
-	common.NoPKModel
-}
-
-func (GitlabAssignee) TableName() string {
-	return "_tool_gitlab_accounts"
-}
diff --git a/plugins/gitlab/models/migrationscripts/archived/user.go b/plugins/gitlab/models/migrationscripts/archived/account.go
similarity index 100%
rename from plugins/gitlab/models/migrationscripts/archived/user.go
rename to plugins/gitlab/models/migrationscripts/archived/account.go
diff --git a/plugins/gitlab/models/migrationscripts/archived/issue.go b/plugins/gitlab/models/migrationscripts/archived/issue.go
index 81f08434..e65d1259 100644
--- a/plugins/gitlab/models/migrationscripts/archived/issue.go
+++ b/plugins/gitlab/models/migrationscripts/archived/issue.go
@@ -53,39 +53,3 @@ type GitlabIssue struct {
 func (GitlabIssue) TableName() string {
 	return "_tool_gitlab_issues"
 }
-
-type GitlabAuthor struct {
-	ConnectionId    uint64 `gorm:"primaryKey"`
-	GitlabId        int    `gorm:"primaryKey" json:"id"`
-	Username        string `gorm:"type:varchar(255)"`
-	Email           string `gorm:"type:varchar(255)"`
-	Name            string `gorm:"type:varchar(255)"`
-	State           string `gorm:"type:varchar(255)"`
-	MembershipState string `json:"membership_state" gorm:"type:varchar(255)"`
-	AvatarUrl       string `json:"avatar_url" gorm:"type:varchar(255)"`
-	WebUrl          string `json:"web_url" gorm:"type:varchar(255)"`
-
-	archived.NoPKModel
-}
-
-func (GitlabAuthor) TableName() string {
-	return "_tool_gitlab_accounts"
-}
-
-type GitlabAssignee struct {
-	ConnectionId    uint64 `gorm:"primaryKey"`
-	GitlabId        int    `gorm:"primaryKey" json:"id"`
-	Username        string `gorm:"type:varchar(255)"`
-	Email           string `gorm:"type:varchar(255)"`
-	Name            string `gorm:"type:varchar(255)"`
-	State           string `gorm:"type:varchar(255)"`
-	MembershipState string `json:"membership_state" gorm:"type:varchar(255)"`
-	AvatarUrl       string `json:"avatar_url" gorm:"type:varchar(255)"`
-	WebUrl          string `json:"web_url" gorm:"type:varchar(255)"`
-
-	archived.NoPKModel
-}
-
-func (GitlabAssignee) TableName() string {
-	return "_tool_gitlab_accounts"
-}
diff --git a/plugins/gitlab/tasks/issue_extractor.go b/plugins/gitlab/tasks/issue_extractor.go
index f4d35488..964ccc06 100644
--- a/plugins/gitlab/tasks/issue_extractor.go
+++ b/plugins/gitlab/tasks/issue_extractor.go
@@ -260,7 +260,7 @@ func ExtractApiIssues(taskCtx core.SubTaskContext) error {
 			results = append(results, gitlabIssue)
 
 			for _, v := range body.Assignees {
-				GitlabAssignee := &models.GitlabAssignee{
+				GitlabAssignee := &models.GitlabAccount{
 					ConnectionId: data.Options.ConnectionId,
 					Username:     v.Username,
 					Name:         v.Name,
@@ -316,8 +316,8 @@ func convertGitlabIssue(issue *IssuesResponse, projectId int) (*models.GitlabIss
 	return gitlabIssue, nil
 }
 
-func convertGitlabAuthor(issue *IssuesResponse, connectionId uint64) (*models.GitlabAuthor, error) {
-	gitlabAuthor := &models.GitlabAuthor{
+func convertGitlabAuthor(issue *IssuesResponse, connectionId uint64) (*models.GitlabAccount, error) {
+	gitlabAuthor := &models.GitlabAccount{
 		ConnectionId: connectionId,
 		GitlabId:     issue.Author.Id,
 		Username:     issue.Author.Username,
diff --git a/plugins/jira/e2e/changelog_test.go b/plugins/jira/e2e/changelog_test.go
index 8dcaec25..562cd203 100644
--- a/plugins/jira/e2e/changelog_test.go
+++ b/plugins/jira/e2e/changelog_test.go
@@ -39,16 +39,16 @@ func TestChangelogDataFlow(t *testing.T) {
 	}
 
 	// import raw data table
-	dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_jira_api_changelogs.csv", "_raw_jira_api_changelogs")
+	dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_jira_api_issue_changelogs.csv", "_raw_jira_api_issue_changelogs")
 
 	// verify changelog extraction
-	dataflowTester.FlushTabler(&models.JiraChangelog{})
-	dataflowTester.FlushTabler(&models.JiraChangelogItem{})
-	dataflowTester.FlushTabler(&models.JiraUser{})
-	dataflowTester.Subtask(tasks.ExtractChangelogsMeta, taskData)
+	dataflowTester.FlushTabler(&models.JiraIssueChangelogs{})
+	dataflowTester.FlushTabler(&models.JiraIssueChangelogItems{})
+	dataflowTester.FlushTabler(&models.JiraAccount{})
+	dataflowTester.Subtask(tasks.ExtractIssueChangelogsMeta, taskData)
 	dataflowTester.VerifyTable(
-		models.JiraChangelog{},
-		"./snapshot_tables/_tool_jira_changelogs.csv",
+		models.JiraIssueChangelogs{},
+		"./snapshot_tables/_tool_jira_issue_changelogs.csv",
 		[]string{
 			"connection_id",
 			"changelog_id",
@@ -66,8 +66,8 @@ func TestChangelogDataFlow(t *testing.T) {
 	)
 
 	dataflowTester.VerifyTable(
-		models.JiraChangelogItem{},
-		"./snapshot_tables/_tool_jira_changelog_items.csv",
+		models.JiraIssueChangelogItems{},
+		"./snapshot_tables/_tool_jira_issue_changelog_items.csv",
 		[]string{
 			"connection_id",
 			"changelog_id",
@@ -84,10 +84,10 @@ func TestChangelogDataFlow(t *testing.T) {
 	// verify changelog conversion
 	dataflowTester.ImportCsvIntoTabler("./snapshot_tables/_tool_jira_board_issues_for_changelog.csv", &models.JiraBoardIssue{})
 	dataflowTester.FlushTabler(&ticket.Changelog{})
-	dataflowTester.Subtask(tasks.ConvertChangelogsMeta, taskData)
+	dataflowTester.Subtask(tasks.ConvertIssueChangelogsMeta, taskData)
 	dataflowTester.VerifyTable(
 		ticket.Changelog{},
-		"./snapshot_tables/changelogs.csv",
+		"./snapshot_tables/issue_changelogs.csv",
 		[]string{
 			"id",
 			"issue_id",
diff --git a/plugins/jira/e2e/issue_test.go b/plugins/jira/e2e/issue_test.go
index 5dd29c6f..aa7b4272 100644
--- a/plugins/jira/e2e/issue_test.go
+++ b/plugins/jira/e2e/issue_test.go
@@ -45,10 +45,10 @@ func TestIssueDataFlow(t *testing.T) {
 	dataflowTester.FlushTabler(&models.JiraIssue{})
 	dataflowTester.FlushTabler(&models.JiraBoardIssue{})
 	dataflowTester.FlushTabler(&models.JiraSprintIssue{})
-	dataflowTester.FlushTabler(&models.JiraChangelog{})
-	dataflowTester.FlushTabler(&models.JiraChangelogItem{})
+	dataflowTester.FlushTabler(&models.JiraIssueChangelogs{})
+	dataflowTester.FlushTabler(&models.JiraIssueChangelogItems{})
 	dataflowTester.FlushTabler(&models.JiraWorklog{})
-	dataflowTester.FlushTabler(&models.JiraUser{})
+	dataflowTester.FlushTabler(&models.JiraAccount{})
 	dataflowTester.Subtask(tasks.ExtractIssuesMeta, taskData)
 	dataflowTester.VerifyTable(
 		models.JiraIssue{},
diff --git a/plugins/jira/e2e/raw_tables/_raw_jira_api_changelogs.csv b/plugins/jira/e2e/raw_tables/_raw_jira_api_issue_changelogs.csv
similarity index 100%
rename from plugins/jira/e2e/raw_tables/_raw_jira_api_changelogs.csv
rename to plugins/jira/e2e/raw_tables/_raw_jira_api_issue_changelogs.csv
diff --git a/plugins/jira/e2e/snapshot_tables/_tool_jira_changelog_items.csv b/plugins/jira/e2e/snapshot_tables/_tool_jira_issue_changelog_items.csv
similarity index 100%
rename from plugins/jira/e2e/snapshot_tables/_tool_jira_changelog_items.csv
rename to plugins/jira/e2e/snapshot_tables/_tool_jira_issue_changelog_items.csv
diff --git a/plugins/jira/e2e/snapshot_tables/_tool_jira_changelogs.csv b/plugins/jira/e2e/snapshot_tables/_tool_jira_issue_changelogs.csv
similarity index 68%
rename from plugins/jira/e2e/snapshot_tables/_tool_jira_changelogs.csv
rename to plugins/jira/e2e/snapshot_tables/_tool_jira_issue_changelogs.csv
index a27e4aef..087f70c1 100644
--- a/plugins/jira/e2e/snapshot_tables/_tool_jira_changelogs.csv
+++ b/plugins/jira/e2e/snapshot_tables/_tool_jira_issue_changelogs.csv
@@ -1,31 +1,31 @@
 connection_id,changelog_id,issue_id,author_account_id,author_display_name,author_active,created,issue_updated,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
-2,11646,10063,5ecfbd0ba04d9c0c220c18d8,yanghui,1,2020-06-17T07:39:14.729+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986053,
-2,11648,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-17T07:40:05.335+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986054,
-2,11677,10063,5ecfbd0ba04d9c0c220c18d8,yanghui,1,2020-06-17T07:46:44.006+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986055,
-2,11798,10063,5ecfbd0c2490cf0c09e2e598,Gerile Tu,1,2020-06-18T05:58:14.769+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986056,
-2,11913,10063,5ecfbd0c2490cf0c09e2e598,Gerile Tu,1,2020-06-19T01:07:20.709+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986057,
-2,11915,10063,5ecfbd0c2490cf0c09e2e598,Gerile Tu,1,2020-06-19T01:07:59.090+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986058,
-2,11935,10063,5ecfbd0c2490cf0c09e2e598,Gerile Tu,1,2020-06-19T01:31:52.567+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986059,
-2,11993,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-19T05:30:01.576+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986060,
-2,12011,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-19T06:25:41.732+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986061,
-2,12016,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-19T06:26:00.014+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986062,
-2,12058,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-19T08:37:40.933+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986063,
-2,12766,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-27T19:20:53.685+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986064,
-2,13012,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-28T19:33:53.703+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986065,
-2,13181,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-29T19:34:20.886+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986066,
-2,13187,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-29T19:34:21.216+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986067,
-2,13189,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-29T19:34:21.533+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986068,
-2,13190,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-29T19:34:21.602+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986069,
-2,13192,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-29T19:34:21.612+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986070,
-2,13193,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-29T19:34:21.632+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986071,
-2,13194,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-29T19:34:21.652+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986072,
-2,13257,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-30T07:08:13.527+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986073,
-2,15273,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-07-05T18:20:07.965+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986074,
-2,15274,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-07-05T18:20:09.481+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986075,
-2,15305,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-07-05T18:20:35.972+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986076,
-2,15310,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-07-05T18:20:36.221+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986077,
-2,15351,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-07-05T23:49:54.024+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986078,
-2,15357,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-07-05T23:49:54.265+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986079,
-2,15397,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-07-06T02:45:22.440+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986080,
-2,15400,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-07-06T02:45:22.555+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986081,
-2,15536,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-07-06T12:38:44.036+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_changelogs,986082,
+2,11646,10063,5ecfbd0ba04d9c0c220c18d8,yanghui,1,2020-06-17T07:39:14.729+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986053,
+2,11648,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-17T07:40:05.335+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986054,
+2,11677,10063,5ecfbd0ba04d9c0c220c18d8,yanghui,1,2020-06-17T07:46:44.006+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986055,
+2,11798,10063,5ecfbd0c2490cf0c09e2e598,Gerile Tu,1,2020-06-18T05:58:14.769+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986056,
+2,11913,10063,5ecfbd0c2490cf0c09e2e598,Gerile Tu,1,2020-06-19T01:07:20.709+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986057,
+2,11915,10063,5ecfbd0c2490cf0c09e2e598,Gerile Tu,1,2020-06-19T01:07:59.090+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986058,
+2,11935,10063,5ecfbd0c2490cf0c09e2e598,Gerile Tu,1,2020-06-19T01:31:52.567+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986059,
+2,11993,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-19T05:30:01.576+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986060,
+2,12011,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-19T06:25:41.732+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986061,
+2,12016,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-19T06:26:00.014+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986062,
+2,12058,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-19T08:37:40.933+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986063,
+2,12766,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-27T19:20:53.685+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986064,
+2,13012,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-28T19:33:53.703+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986065,
+2,13181,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-29T19:34:20.886+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986066,
+2,13187,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-29T19:34:21.216+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986067,
+2,13189,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-29T19:34:21.533+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986068,
+2,13190,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-29T19:34:21.602+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986069,
+2,13192,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-29T19:34:21.612+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986070,
+2,13193,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-29T19:34:21.632+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986071,
+2,13194,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-29T19:34:21.652+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986072,
+2,13257,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-06-30T07:08:13.527+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986073,
+2,15273,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-07-05T18:20:07.965+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986074,
+2,15274,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-07-05T18:20:09.481+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986075,
+2,15305,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-07-05T18:20:35.972+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986076,
+2,15310,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-07-05T18:20:36.221+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986077,
+2,15351,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-07-05T23:49:54.024+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986078,
+2,15357,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-07-05T23:49:54.265+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986079,
+2,15397,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-07-06T02:45:22.440+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986080,
+2,15400,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-07-06T02:45:22.555+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986081,
+2,15536,10063,5e9711ba34f7b90c0fbc37d3,Rankin Zheng,1,2020-07-06T12:38:44.036+00:00,2021-03-28T08:06:12.964+00:00,"{""ConnectionId"":2,""BoardId"":8}",_raw_jira_api_issue_changelogs,986082,
diff --git a/plugins/jira/e2e/snapshot_tables/changelogs.csv b/plugins/jira/e2e/snapshot_tables/changelogs.csv
deleted file mode 100644
index 9ede7325..00000000
--- a/plugins/jira/e2e/snapshot_tables/changelogs.csv
+++ /dev/null
@@ -1,31 +0,0 @@
-id,issue_id,author_id,author_name,field_id,field_name,original_from_value,original_to_value,from_value,to_value,created_date
-jira:JiraChangelogItem:2:11646:assignee,jira:JiraIssue:2:10063,jira:JiraUser:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,assignee,,jira:JiraUser:2:5ecfbd0ba04d9c0c220c18d8,,,2020-06-17T07:39:14.729+00:00
-jira:JiraChangelogItem:2:11648:assignee,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,assignee,jira:JiraUser:2:5ecfbd0ba04d9c0c220c18d8,jira:JiraUser:2:5ecfbd0c2490cf0c09e2e598,,,2020-06-17T07:40:05.335+00:00
-jira:JiraChangelogItem:2:11677:summary,jira:JiraIssue:2:10063,jira:JiraUser:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,summary,[Industry Metrics],[Industry Metrics],,,2020-06-17T07:46:44.006+00:00
-jira:JiraChangelogItem:2:11798:summary,jira:JiraIssue:2:10063,jira:JiraUser:2:5ecfbd0c2490cf0c09e2e598,Gerile Tu,,summary,[Industry Metrics],[Industry Metrics] ,,,2020-06-18T05:58:14.769+00:00
-jira:JiraChangelogItem:2:11913:Component,jira:JiraIssue:2:10063,jira:JiraUser:2:5ecfbd0c2490cf0c09e2e598,Gerile Tu,,Component,,Industry Metrics,,,2020-06-19T01:07:20.709+00:00
-jira:JiraChangelogItem:2:11915:Component,jira:JiraIssue:2:10063,jira:JiraUser:2:5ecfbd0c2490cf0c09e2e598,Gerile Tu,,Component,,Charts,,,2020-06-19T01:07:59.090+00:00
-jira:JiraChangelogItem:2:11935:Component,jira:JiraIssue:2:10063,jira:JiraUser:2:5ecfbd0c2490cf0c09e2e598,Gerile Tu,,Component,Charts,,,,2020-06-19T01:31:52.567+00:00
-jira:JiraChangelogItem:2:11993:Rank,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,Rank,,Ranked higher,,,2020-06-19T05:30:01.576+00:00
-jira:JiraChangelogItem:2:12011:Epic Link,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,Epic Link,,EE-22,,,2020-06-19T06:25:41.732+00:00
-jira:JiraChangelogItem:2:12016:summary,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,summary,[Industry Metrics] ,,,,2020-06-19T06:26:00.014+00:00
-jira:JiraChangelogItem:2:12058:Rank,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,Rank,,Ranked higher,,,2020-06-19T08:37:40.933+00:00
-jira:JiraChangelogItem:2:12766:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 add industry unittest (Web Link)""",,,2020-06-27T19:20:53.685+00:00
-jira:JiraChangelogItem:2:13012:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 add IndustryQuery (getEfficiencyMetric) (Web Link)""",,,2020-06-28T19:33:53.703+00:00
-jira:JiraChangelogItem:2:13181:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 add IndustryQuery.test.ts (Web Link)""",,,2020-06-29T19:34:20.886+00:00
-jira:JiraChangelogItem:2:13187:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectEfficiency (which has a developer bug) (Web Link)""",,,2020-06-29T19:34:21.216+00:00
-jira:JiraChangelogItem:2:13189:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 add IndustryQuery (getEfficiencyMetric) (Web Link)""",,,2020-06-29T19:34:21.533+00:00
-jira:JiraChangelogItem:2:13190:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 add Industry model (Web Link)""",,,2020-06-29T19:34:21.602+00:00
-jira:JiraChangelogItem:2:13192:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 rename (Web Link)""",,,2020-06-29T19:34:21.612+00:00
-jira:JiraChangelogItem:2:13193:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 add industry unittest (Web Link)""",,,2020-06-29T19:34:21.632+00:00
-jira:JiraChangelogItem:2:13194:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 add getQualityMetric (Web Link)""",,,2020-06-29T19:34:21.652+00:00
-jira:JiraChangelogItem:2:13257:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectQuality (Web Link)""",,,2020-06-30T07:08:13.527+00:00
-jira:JiraChangelogItem:2:15273:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,"This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectQuality (Web Link)""","This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectQuality (Web Link)""",,,2020-07-05T18:20:07.965+00:00
-jira:JiraChangelogItem:2:15274:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,"This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectEfficiency (which has a developer bug) (Web Link)""","This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectEfficiency (which has a developer bug) (Web Link)""",,,2020-07-05T18:20:09.481+00:00
-jira:JiraChangelogItem:2:15305:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 add group industy data (Web Link)""",,,2020-07-05T18:20:35.972+00:00
-jira:JiraChangelogItem:2:15310:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 fix group industry data's bug (Web Link)""",,,2020-07-05T18:20:36.221+00:00
-jira:JiraChangelogItem:2:15351:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,"This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectQuality (Web Link)""","This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectQuality (Web Link)""",,,2020-07-05T23:49:54.024+00:00
-jira:JiraChangelogItem:2:15357:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,"This issue links to ""Commit - #EE-160 fix group industry data's bug (Web Link)""","This issue links to ""Commit - #EE-160 fix group industry data's bug (Web Link)""",,,2020-07-05T23:49:54.265+00:00
-jira:JiraChangelogItem:2:15397:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,"This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectQuality (Web Link)""","This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectQuality (Web Link)""",,,2020-07-06T02:45:22.440+00:00
-jira:JiraChangelogItem:2:15400:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,"This issue links to ""Commit - #EE-160 fix group industry data's bug (Web Link)""","This issue links to ""Commit - #EE-160 fix group industry data's bug (Web Link)""",,,2020-07-06T02:45:22.555+00:00
-jira:JiraChangelogItem:2:15536:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,"This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectQuality (Web Link)""","This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectQuality (Web Link)""",,,2020-07-06T12:38:44.036+00:00
diff --git a/plugins/jira/e2e/snapshot_tables/issue_changelogs.csv b/plugins/jira/e2e/snapshot_tables/issue_changelogs.csv
new file mode 100644
index 00000000..c2b50162
--- /dev/null
+++ b/plugins/jira/e2e/snapshot_tables/issue_changelogs.csv
@@ -0,0 +1,31 @@
+id,issue_id,author_id,author_name,field_id,field_name,original_from_value,original_to_value,from_value,to_value,created_date
+jira:JiraIssueChangelogItems:2:11646:assignee,jira:JiraIssue:2:10063,jira:JiraAccount:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,assignee,,jira:JiraAccount:2:5ecfbd0ba04d9c0c220c18d8,,,2020-06-17T07:39:14.729+00:00
+jira:JiraIssueChangelogItems:2:11648:assignee,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,assignee,jira:JiraAccount:2:5ecfbd0ba04d9c0c220c18d8,jira:JiraAccount:2:5ecfbd0c2490cf0c09e2e598,,,2020-06-17T07:40:05.335+00:00
+jira:JiraIssueChangelogItems:2:11677:summary,jira:JiraIssue:2:10063,jira:JiraAccount:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,summary,[Industry Metrics],[Industry Metrics],,,2020-06-17T07:46:44.006+00:00
+jira:JiraIssueChangelogItems:2:11798:summary,jira:JiraIssue:2:10063,jira:JiraAccount:2:5ecfbd0c2490cf0c09e2e598,Gerile Tu,,summary,[Industry Metrics],[Industry Metrics] ,,,2020-06-18T05:58:14.769+00:00
+jira:JiraIssueChangelogItems:2:11913:Component,jira:JiraIssue:2:10063,jira:JiraAccount:2:5ecfbd0c2490cf0c09e2e598,Gerile Tu,,Component,,Industry Metrics,,,2020-06-19T01:07:20.709+00:00
+jira:JiraIssueChangelogItems:2:11915:Component,jira:JiraIssue:2:10063,jira:JiraAccount:2:5ecfbd0c2490cf0c09e2e598,Gerile Tu,,Component,,Charts,,,2020-06-19T01:07:59.090+00:00
+jira:JiraIssueChangelogItems:2:11935:Component,jira:JiraIssue:2:10063,jira:JiraAccount:2:5ecfbd0c2490cf0c09e2e598,Gerile Tu,,Component,Charts,,,,2020-06-19T01:31:52.567+00:00
+jira:JiraIssueChangelogItems:2:11993:Rank,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,Rank,,Ranked higher,,,2020-06-19T05:30:01.576+00:00
+jira:JiraIssueChangelogItems:2:12011:Epic Link,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,Epic Link,,EE-22,,,2020-06-19T06:25:41.732+00:00
+jira:JiraIssueChangelogItems:2:12016:summary,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,summary,[Industry Metrics] ,,,,2020-06-19T06:26:00.014+00:00
+jira:JiraIssueChangelogItems:2:12058:Rank,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,Rank,,Ranked higher,,,2020-06-19T08:37:40.933+00:00
+jira:JiraIssueChangelogItems:2:12766:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 add industry unittest (Web Link)""",,,2020-06-27T19:20:53.685+00:00
+jira:JiraIssueChangelogItems:2:13012:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 add IndustryQuery (getEfficiencyMetric) (Web Link)""",,,2020-06-28T19:33:53.703+00:00
+jira:JiraIssueChangelogItems:2:13181:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 add IndustryQuery.test.ts (Web Link)""",,,2020-06-29T19:34:20.886+00:00
+jira:JiraIssueChangelogItems:2:13187:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectEfficiency (which has a developer bug) (Web Link)""",,,2020-06-29T19:34:21.216+00:00
+jira:JiraIssueChangelogItems:2:13189:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 add IndustryQuery (getEfficiencyMetric) (Web Link)""",,,2020-06-29T19:34:21.533+00:00
+jira:JiraIssueChangelogItems:2:13190:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 add Industry model (Web Link)""",,,2020-06-29T19:34:21.602+00:00
+jira:JiraIssueChangelogItems:2:13192:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 rename (Web Link)""",,,2020-06-29T19:34:21.612+00:00
+jira:JiraIssueChangelogItems:2:13193:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 add industry unittest (Web Link)""",,,2020-06-29T19:34:21.632+00:00
+jira:JiraIssueChangelogItems:2:13194:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 add getQualityMetric (Web Link)""",,,2020-06-29T19:34:21.652+00:00
+jira:JiraIssueChangelogItems:2:13257:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectQuality (Web Link)""",,,2020-06-30T07:08:13.527+00:00
+jira:JiraIssueChangelogItems:2:15273:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,"This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectQuality (Web Link)""","This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectQuality (Web Link)""",,,2020-07-05T18:20:07.965+00:00
+jira:JiraIssueChangelogItems:2:15274:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,"This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectEfficiency (which has a developer bug) (Web Link)""","This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectEfficiency (which has a developer bug) (Web Link)""",,,2020-07-05T18:20:09.481+00:00
+jira:JiraIssueChangelogItems:2:15305:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 add group industy data (Web Link)""",,,2020-07-05T18:20:35.972+00:00
+jira:JiraIssueChangelogItems:2:15310:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,,"This issue links to ""Commit - #EE-160 fix group industry data's bug (Web Link)""",,,2020-07-05T18:20:36.221+00:00
+jira:JiraIssueChangelogItems:2:15351:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,"This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectQuality (Web Link)""","This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectQuality (Web Link)""",,,2020-07-05T23:49:54.024+00:00
+jira:JiraIssueChangelogItems:2:15357:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,"This issue links to ""Commit - #EE-160 fix group industry data's bug (Web Link)""","This issue links to ""Commit - #EE-160 fix group industry data's bug (Web Link)""",,,2020-07-05T23:49:54.265+00:00
+jira:JiraIssueChangelogItems:2:15397:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,"This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectQuality (Web Link)""","This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectQuality (Web Link)""",,,2020-07-06T02:45:22.440+00:00
+jira:JiraIssueChangelogItems:2:15400:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,"This issue links to ""Commit - #EE-160 fix group industry data's bug (Web Link)""","This issue links to ""Commit - #EE-160 fix group industry data's bug (Web Link)""",,,2020-07-06T02:45:22.555+00:00
+jira:JiraIssueChangelogItems:2:15536:RemoteIssueLink,jira:JiraIssue:2:10063,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,,RemoteIssueLink,"This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectQuality (Web Link)""","This issue links to ""Commit - #EE-160 add IndustryController.getIndustryProjectQuality (Web Link)""",,,2020-07-06T12:38:44.036+00:00
diff --git a/plugins/jira/e2e/snapshot_tables/issues.csv b/plugins/jira/e2e/snapshot_tables/issues.csv
index 8c6d48d5..a9bd2f7e 100644
--- a/plugins/jira/e2e/snapshot_tables/issues.csv
+++ b/plugins/jira/e2e/snapshot_tables/issues.csv
@@ -1,31 +1,31 @@
 id,url,icon_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,creator_name,assignee_id,assignee_name,severity,component
-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,​四个排序图:测试/注释覆盖度、复用度、模块性,,,故事,DONE,已完成,-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,0,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
-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,已完成,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,,Medium,0,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
-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,0,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
-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,0,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
-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,​通用技术任务,,,任务,DONE,已完成,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,0,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
-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,0,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0c2490cf0c09e2e598,Gerile Tu,,
-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,​多团队支持,,,任务,DONE,已完成,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,0,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,
-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 拆分,,,任务,DONE,已完成,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,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,
-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版本,,,任务,DONE,已完成,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,0,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,
-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,调整​文件夹结构,,,任务,DONE,已完成,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,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,
-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,路由权限控制,,,任务,DONE,已完成,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,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,
-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 开发阶段构建速度,,,任务,DONE,已完成,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,0,60,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,
-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,​新的错误处理机制,,,任务,DONE,已完成,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,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,
-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,0,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0aaa47a00c1997ea8e,chao.cheng,,
-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,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0984083c0c12e5af8f,lin.hao,,
-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,0,60,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,
-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,0,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0aaa47a00c1997ea8e,chao.cheng,,
-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,,,子任务,DONE,已完成,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,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
-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,​定接口,,,子任务,DONE,已完成,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,0,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,
-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,​提供后端接口,,,子任务,DONE,已完成,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,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,
-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,​数据填充与联调,,,子任务,DONE,已完成,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,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
-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,,,子任务,DONE,已完成,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,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
-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,​定接口,,,子任务,DONE,已完成,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,0,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,
-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,​后端接口,,,子任务,DONE,已完成,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,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,
-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,​数据填充与联调,,,子任务,DONE,已完成,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,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
-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,准备测试用例,,,子任务,DONE,已完成,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,0,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0984083c0c12e5af8f,lin.hao,,
-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,,,子任务,DONE,已完成,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,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
-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,定接口,,,子任务,DONE,已完成,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,0,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,
-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,后端接口,,,子任务,DONE,已完成,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,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,
-jira:JiraIssue:2:10099,https://merico.atlassian.net/browse/EE-37,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-37,数据填充与联调 ,,,子任务,DONE,已完成,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,0,0,0,jira:JiraUser:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraUser:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
+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,​四个排序图:测试/注释覆盖度、复用度、模块性,,,故事,DONE,已完成,-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,0,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
+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,已完成,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,,Medium,0,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
+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,0,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
+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,0,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
+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,​通用技术任务,,,任务,DONE,已完成,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,0,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
+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,0,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c2490cf0c09e2e598,Gerile Tu,,
+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,​多团队支持,,,任务,DONE,已完成,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,0,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,
+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 拆分,,,任务,DONE,已完成,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,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,
+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版本,,,任务,DONE,已完成,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,0,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,
+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,调整​文件夹结构,,,任务,DONE,已完成,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,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,
+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,路由权限控制,,,任务,DONE,已完成,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,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,
+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 开发阶段构建速度,,,任务,DONE,已完成,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,0,60,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,
+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,​新的错误处理机制,,,任务,DONE,已完成,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,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,
+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,0,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0aaa47a00c1997ea8e,chao.cheng,,
+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,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0984083c0c12e5af8f,lin.hao,,
+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,0,60,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,
+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,0,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0aaa47a00c1997ea8e,chao.cheng,,
+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,,,子任务,DONE,已完成,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,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
+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,​定接口,,,子任务,DONE,已完成,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,0,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,
+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,​提供后端接口,,,子任务,DONE,已完成,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,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,
+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,​数据填充与联调,,,子任务,DONE,已完成,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,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
+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,,,子任务,DONE,已完成,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,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
+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,​定接口,,,子任务,DONE,已完成,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,0,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,
+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,​后端接口,,,子任务,DONE,已完成,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,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,
+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,​数据填充与联调,,,子任务,DONE,已完成,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,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
+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,准备测试用例,,,子任务,DONE,已完成,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,0,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0984083c0c12e5af8f,lin.hao,,
+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,,,子任务,DONE,已完成,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,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
+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,定接口,,,子任务,DONE,已完成,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,0,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0a47d31e0c2a15fd87,yuxiang,,
+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,后端接口,,,子任务,DONE,已完成,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,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0ba04d9c0c220c18d8,yanghui,,
+jira:JiraIssue:2:10099,https://merico.atlassian.net/browse/EE-37,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium,EE-37,数据填充与联调 ,,,子任务,DONE,已完成,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,0,0,0,jira:JiraAccount:2:5e9711ba34f7b90c0fbc37d3,Rankin Zheng,jira:JiraAccount:2:5ecfbd0c730ec90c1999cadf,Dingding Zhang,,
diff --git a/plugins/jira/impl/impl.go b/plugins/jira/impl/impl.go
index 455d8ac7..a9131849 100644
--- a/plugins/jira/impl/impl.go
+++ b/plugins/jira/impl/impl.go
@@ -66,10 +66,10 @@ func (plugin Jira) SubTaskMetas() []core.SubTaskMeta {
 		tasks.CollectIssuesMeta,
 		tasks.ExtractIssuesMeta,
 
-		tasks.CollectChangelogsMeta,
-		tasks.ExtractChangelogsMeta,
+		tasks.CollectIssueChangelogsMeta,
+		tasks.ExtractIssueChangelogsMeta,
 
-		tasks.CollectUsersMeta,
+		tasks.CollectAccountsMeta,
 
 		tasks.CollectWorklogsMeta,
 		tasks.ExtractWorklogsMeta,
@@ -86,7 +86,7 @@ func (plugin Jira) SubTaskMetas() []core.SubTaskMeta {
 
 		tasks.ConvertWorklogsMeta,
 
-		tasks.ConvertChangelogsMeta,
+		tasks.ConvertIssueChangelogsMeta,
 
 		tasks.ConvertSprintsMeta,
 		tasks.ConvertSprintIssuesMeta,
@@ -94,8 +94,8 @@ func (plugin Jira) SubTaskMetas() []core.SubTaskMeta {
 		tasks.ConvertIssueCommitsMeta,
 		tasks.ConvertIssueRepoCommitsMeta,
 
-		tasks.ExtractUsersMeta,
-		tasks.ConvertUsersMeta,
+		tasks.ExtractAccountsMeta,
+		tasks.ConvertAccountsMeta,
 	}
 }
 
diff --git a/plugins/jira/models/user.go b/plugins/jira/models/account.go
similarity index 95%
rename from plugins/jira/models/user.go
rename to plugins/jira/models/account.go
index 975ffa35..4dc95d58 100644
--- a/plugins/jira/models/user.go
+++ b/plugins/jira/models/account.go
@@ -21,7 +21,7 @@ import (
 	"github.com/apache/incubator-devlake/models/common"
 )
 
-type JiraUser struct {
+type JiraAccount struct {
 	common.NoPKModel
 
 	// collected fields
@@ -34,6 +34,6 @@ type JiraUser struct {
 	Timezone     string `gorm:"type:varchar(255)"`
 }
 
-func (JiraUser) TableName() string {
+func (JiraAccount) TableName() string {
 	return "_tool_jira_accounts"
 }
diff --git a/plugins/jira/models/changelog.go b/plugins/jira/models/issue_changelog.go
similarity index 86%
rename from plugins/jira/models/changelog.go
rename to plugins/jira/models/issue_changelog.go
index bd965056..fb627b9a 100644
--- a/plugins/jira/models/changelog.go
+++ b/plugins/jira/models/issue_changelog.go
@@ -23,7 +23,7 @@ import (
 	"github.com/apache/incubator-devlake/models/common"
 )
 
-type JiraChangelog struct {
+type JiraIssueChangelogs struct {
 	common.NoPKModel
 
 	// collected fields
@@ -37,7 +37,7 @@ type JiraChangelog struct {
 	IssueUpdated      *time.Time `comment:"corresponding issue.updated time, changelog might need update IFF changelog.issue_updated < issue.updated"`
 }
 
-type JiraChangelogItem struct {
+type JiraIssueChangelogItems struct {
 	common.NoPKModel
 
 	// collected fields
@@ -52,10 +52,10 @@ type JiraChangelogItem struct {
 	ToString     string
 }
 
-func (JiraChangelog) TableName() string {
-	return "_tool_jira_changelogs"
+func (JiraIssueChangelogs) TableName() string {
+	return "_tool_jira_issue_changelogs"
 }
 
-func (JiraChangelogItem) TableName() string {
-	return "_tool_jira_changelog_items"
+func (JiraIssueChangelogItems) TableName() string {
+	return "_tool_jira_issue_changelog_items"
 }
diff --git a/plugins/jira/models/migrationscripts/archived/user.go b/plugins/jira/models/migrationscripts/archived/account.go
similarity index 69%
rename from plugins/jira/models/migrationscripts/archived/user.go
rename to plugins/jira/models/migrationscripts/archived/account.go
index e10a048a..4acb7316 100644
--- a/plugins/jira/models/migrationscripts/archived/user.go
+++ b/plugins/jira/models/migrationscripts/archived/account.go
@@ -19,19 +19,19 @@ package archived
 
 import "github.com/apache/incubator-devlake/models/migrationscripts/archived"
 
-type JiraUser struct {
+type JiraAccount struct {
 	archived.NoPKModel
 
 	// collected fields
-	SourceId    uint64 `gorm:"primarykey"`
-	AccountId   string `gorm:"primaryKey;type:varchar(100)"`
-	AccountType string `gorm:"type:varchar(100)"`
-	Name        string `gorm:"type:varchar(255)"`
-	Email       string `gorm:"type:varchar(255)"`
-	AvatarUrl   string `gorm:"type:varchar(255)"`
-	Timezone    string `gorm:"type:varchar(255)"`
+	ConnectionId uint64 `gorm:"primarykey"`
+	AccountId    string `gorm:"primaryKey;type:varchar(100)"`
+	AccountType  string `gorm:"type:varchar(100)"`
+	Name         string `gorm:"type:varchar(255)"`
+	Email        string `gorm:"type:varchar(255)"`
+	AvatarUrl    string `gorm:"type:varchar(255)"`
+	Timezone     string `gorm:"type:varchar(255)"`
 }
 
-func (JiraUser) TableName() string {
+func (JiraAccount) TableName() string {
 	return "_tool_jira_accounts"
 }
diff --git a/plugins/jira/models/migrationscripts/archived/board.go b/plugins/jira/models/migrationscripts/archived/board.go
index 31479df1..60120908 100644
--- a/plugins/jira/models/migrationscripts/archived/board.go
+++ b/plugins/jira/models/migrationscripts/archived/board.go
@@ -21,25 +21,14 @@ import "github.com/apache/incubator-devlake/models/migrationscripts/archived"
 
 type JiraBoard struct {
 	archived.NoPKModel
-	SourceId  uint64 `gorm:"primaryKey"`
-	BoardId   uint64 `gorm:"primaryKey"`
-	ProjectId uint
-	Name      string `gorm:"type:varchar(255)"`
-	Self      string `gorm:"type:varchar(255)"`
-	Type      string `gorm:"type:varchar(100)"`
-}
-
-type JiraBoardIssue struct {
-	SourceId uint64 `gorm:"primaryKey"`
-	BoardId  uint64 `gorm:"primaryKey"`
-	IssueId  uint64 `gorm:"primaryKey"`
-	archived.NoPKModel
+	ConnectionId uint64 `gorm:"primaryKey"`
+	BoardId      uint64 `gorm:"primaryKey"`
+	ProjectId    uint
+	Name         string `gorm:"type:varchar(255)"`
+	Self         string `gorm:"type:varchar(255)"`
+	Type         string `gorm:"type:varchar(100)"`
 }
 
 func (JiraBoard) TableName() string {
 	return "_tool_jira_boards"
 }
-
-func (JiraBoardIssue) TableName() string {
-	return "_tool_jira_board_issues"
-}
diff --git a/plugins/jira/models/migrationscripts/archived/project.go b/plugins/jira/models/migrationscripts/archived/board_issue.go
similarity index 76%
copy from plugins/jira/models/migrationscripts/archived/project.go
copy to plugins/jira/models/migrationscripts/archived/board_issue.go
index 305ebd24..f0a6b21c 100644
--- a/plugins/jira/models/migrationscripts/archived/project.go
+++ b/plugins/jira/models/migrationscripts/archived/board_issue.go
@@ -19,14 +19,13 @@ package archived
 
 import "github.com/apache/incubator-devlake/models/migrationscripts/archived"
 
-type JiraProject struct {
+type JiraBoardIssue struct {
+	ConnectionId uint64 `gorm:"primaryKey"`
+	BoardId      uint64 `gorm:"primaryKey"`
+	IssueId      uint64 `gorm:"primaryKey"`
 	archived.NoPKModel
-	SourceId uint64 `gorm:"primarykey"`
-	Id       string `gorm:"primaryKey;type:varchar(255)"`
-	Key      string `gorm:"type:varchar(255)"`
-	Name     string `gorm:"type:varchar(255)"`
 }
 
-func (JiraProject) TableName() string {
-	return "_tool_jira_projects"
+func (JiraBoardIssue) TableName() string {
+	return "_tool_jira_board_issues"
 }
diff --git a/plugins/jira/models/migrationscripts/archived/connection.go b/plugins/jira/models/migrationscripts/archived/connection.go
new file mode 100644
index 00000000..28d2d523
--- /dev/null
+++ b/plugins/jira/models/migrationscripts/archived/connection.go
@@ -0,0 +1,66 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package archived
+
+import (
+	"github.com/apache/incubator-devlake/models/migrationscripts/archived"
+)
+
+type BasicAuth struct {
+	Username string `mapstructure:"username" validate:"required" json:"username"`
+	Password string `mapstructure:"password" validate:"required" json:"password" encrypt:"yes"`
+}
+
+type BaseConnection struct {
+	Name string `gorm:"type:varchar(100);uniqueIndex" json:"name" validate:"required"`
+	archived.Model
+}
+
+type RestConnection struct {
+	BaseConnection `mapstructure:",squash"`
+	Endpoint       string `mapstructure:"endpoint" validate:"required" json:"endpoint"`
+	Proxy          string `mapstructure:"proxy" json:"proxy"`
+	RateLimit      int    `comment:"api request rate limit per hour" json:"rateLimit"`
+}
+
+type TestConnectionRequest struct {
+	Endpoint  string `json:"endpoint"`
+	Proxy     string `json:"proxy"`
+	BasicAuth `mapstructure:",squash"`
+}
+
+type BoardResponse struct {
+	Id    int
+	Title string
+	Value string
+}
+
+type EpicResponse struct {
+	Id    int
+	Title string
+	Value string
+}
+
+type JiraConnection struct {
+	RestConnection `mapstructure:",squash"`
+	BasicAuth      `mapstructure:",squash"`
+}
+
+func (JiraConnection) TableName() string {
+	return "_tool_jira_connections"
+}
diff --git a/plugins/jira/models/migrationscripts/archived/connection_history.go b/plugins/jira/models/migrationscripts/archived/connection_history.go
new file mode 100644
index 00000000..603b04d4
--- /dev/null
+++ b/plugins/jira/models/migrationscripts/archived/connection_history.go
@@ -0,0 +1,56 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package archived
+
+import "time"
+
+type JiraConnectionV11 struct {
+	ID                         uint64    `gorm:"primaryKey" json:"id"`
+	CreatedAt                  time.Time `json:"createdAt"`
+	UpdatedAt                  time.Time `json:"updatedAt"`
+	Name                       string    `gorm:"type:varchar(100);uniqueIndex" json:"name" validate:"required"`
+	Endpoint                   string    `json:"endpoint" validate:"required"`
+	BasicAuthEncoded           string    `json:"basicAuthEncoded" validate:"required"`
+	EpicKeyField               string    `gorm:"type:varchar(50);" json:"epicKeyField"`
+	StoryPointField            string    `gorm:"type:varchar(50);" json:"storyPointField"`
+	RemotelinkCommitShaPattern string    `gorm:"type:varchar(255);comment='golang regexp, the first group will be recognized as commit sha, ref https://github.com/google/re2/wiki/Syntax'" json:"remotelinkCommitShaPattern"`
+	Proxy                      string    `json:"proxy"`
+	RateLimit                  int       `comment:"api request rate limt per hour" json:"rateLimit"`
+}
+
+func (JiraConnectionV11) TableName() string {
+	return "_tool_jira_connections"
+}
+
+type JiraConnectionV10 struct {
+	ID                         uint64    `gorm:"primaryKey" json:"id"`
+	CreatedAt                  time.Time `json:"createdAt"`
+	UpdatedAt                  time.Time `json:"updatedAt"`
+	Name                       string    `gorm:"type:varchar(100);uniqueIndex" json:"name" validate:"required"`
+	Endpoint                   string    `json:"endpoint" validate:"required"`
+	BasicAuthEncoded           string    `json:"basicAuthEncoded" validate:"required"`
+	EpicKeyField               string    `gorm:"type:varchar(50);" json:"epicKeyField"`
+	StoryPointField            string    `gorm:"type:varchar(50);" json:"storyPointField"`
+	RemotelinkCommitShaPattern string    `gorm:"type:varchar(255);comment='golang regexp, the first group will be recognized as commit sha, ref https://github.com/google/re2/wiki/Syntax'" json:"remotelinkCommitShaPattern"`
+	Proxy                      string    `json:"proxy"`
+	RateLimit                  int       `comment:"api request rate limt per hour" json:"rateLimit"`
+}
+
+func (JiraConnectionV10) TableName() string {
+	return "_tool_jira_source"
+}
diff --git a/plugins/jira/models/migrationscripts/archived/issue.go b/plugins/jira/models/migrationscripts/archived/issue.go
index fd98e396..61d4d9e3 100644
--- a/plugins/jira/models/migrationscripts/archived/issue.go
+++ b/plugins/jira/models/migrationscripts/archived/issue.go
@@ -26,11 +26,12 @@ import (
 
 type JiraIssue struct {
 	// collected fields
-	SourceId                 uint64 `gorm:"primaryKey"`
+	ConnectionId             uint64 `gorm:"primaryKey"`
 	IssueId                  uint64 `gorm:"primarykey"`
 	ProjectId                uint64
 	Self                     string `gorm:"type:varchar(255)"`
-	Key                      string `gorm:"type:varchar(255)"`
+	IconURL                  string `gorm:"type:varchar(255);column:icon_url"`
+	IssueKey                 string `gorm:"type:varchar(255)"`
 	Summary                  string
 	Type                     string `gorm:"type:varchar(255)"`
 	EpicKey                  string `gorm:"type:varchar(255)"`
@@ -57,29 +58,13 @@ type JiraIssue struct {
 	Updated                  time.Time `gorm:"index"`
 	SpentMinutes             int64
 	LeadTimeMinutes          uint
-	StdStoryPoint            uint
+	StdStoryPoint            int64
 	StdType                  string `gorm:"type:varchar(255)"`
 	StdStatus                string `gorm:"type:varchar(255)"`
 	AllFields                datatypes.JSONMap
-
-	// internal status tracking
-	ChangelogUpdated  *time.Time
-	RemotelinkUpdated *time.Time
-	archived.NoPKModel
-}
-
-type JiraIssueCommit struct {
 	archived.NoPKModel
-	SourceId  uint64 `gorm:"primaryKey"`
-	IssueId   uint64 `gorm:"primaryKey"`
-	CommitSha string `gorm:"primaryKey;type:varchar(40)"`
-	CommitUrl string `gorm:"type:varchar(255)"`
 }
 
 func (JiraIssue) TableName() string {
 	return "_tool_jira_issues"
 }
-
-func (JiraIssueCommit) TableName() string {
-	return "_tool_jira_issue_commits"
-}
diff --git a/plugins/jira/models/migrationscripts/archived/changelog.go b/plugins/jira/models/migrationscripts/archived/issue_changelog.go
similarity index 61%
rename from plugins/jira/models/migrationscripts/archived/changelog.go
rename to plugins/jira/models/migrationscripts/archived/issue_changelog.go
index 4b87297b..4fa043d1 100644
--- a/plugins/jira/models/migrationscripts/archived/changelog.go
+++ b/plugins/jira/models/migrationscripts/archived/issue_changelog.go
@@ -23,38 +23,39 @@ import (
 	"github.com/apache/incubator-devlake/models/migrationscripts/archived"
 )
 
-type JiraChangelog struct {
+type JiraIssueChangelogs struct {
 	archived.NoPKModel
 
 	// collected fields
-	SourceId          uint64 `gorm:"primaryKey"`
+	ConnectionId      uint64 `gorm:"primaryKey"`
 	ChangelogId       uint64 `gorm:"primarykey"`
 	IssueId           uint64 `gorm:"index"`
 	AuthorAccountId   string `gorm:"type:varchar(255)"`
 	AuthorDisplayName string `gorm:"type:varchar(255)"`
 	AuthorActive      bool
-	Created           time.Time `gorm:"index"`
+	Created           time.Time  `gorm:"index"`
+	IssueUpdated      *time.Time `comment:"corresponding issue.updated time, changelog might need update IFF changelog.issue_updated < issue.updated"`
 }
 
-type JiraChangelogItem struct {
+type JiraIssueChangelogItems struct {
 	archived.NoPKModel
 
 	// collected fields
-	SourceId    uint64 `gorm:"primaryKey"`
-	ChangelogId uint64 `gorm:"primaryKey"`
-	Field       string `gorm:"primaryKey"`
-	FieldType   string
-	FieldId     string
-	From        string
-	FromString  string
-	To          string
-	ToString    string
+	ConnectionId uint64 `gorm:"primaryKey"`
+	ChangelogId  uint64 `gorm:"primaryKey"`
+	Field        string `gorm:"primaryKey"`
+	FieldType    string
+	FieldId      string
+	FromValue    string
+	FromString   string
+	ToValue      string
+	ToString     string
 }
 
-func (JiraChangelog) TableName() string {
-	return "_tool_jira_changelogs"
+func (JiraIssueChangelogs) TableName() string {
+	return "_tool_jira_issue_changelogs"
 }
 
-func (JiraChangelogItem) TableName() string {
-	return "_tool_jira_changelog_items"
+func (JiraIssueChangelogItems) TableName() string {
+	return "_tool_jira_issue_changelog_items"
 }
diff --git a/plugins/jira/models/migrationscripts/archived/remotelink.go b/plugins/jira/models/migrationscripts/archived/issue_commit.go
similarity index 69%
copy from plugins/jira/models/migrationscripts/archived/remotelink.go
copy to plugins/jira/models/migrationscripts/archived/issue_commit.go
index 7dde5e72..51f3ee76 100644
--- a/plugins/jira/models/migrationscripts/archived/remotelink.go
+++ b/plugins/jira/models/migrationscripts/archived/issue_commit.go
@@ -19,20 +19,16 @@ package archived
 
 import (
 	"github.com/apache/incubator-devlake/models/migrationscripts/archived"
-	"gorm.io/datatypes"
 )
 
-type JiraRemotelink struct {
+type JiraIssueCommit struct {
 	archived.NoPKModel
-	SourceId     uint64 `gorm:"primaryKey"`
-	RemotelinkId uint64 `gorm:"primarykey"`
-	IssueId      uint64 `gorm:"index"`
-	RawJson      datatypes.JSON
-	Self         string `gorm:"type:varchar(255)"`
-	Title        string
-	Url          string `gorm:"type:varchar(255)"`
+	ConnectionId uint64 `gorm:"primaryKey"`
+	IssueId      uint64 `gorm:"primaryKey"`
+	CommitSha    string `gorm:"primaryKey;type:varchar(40)"`
+	CommitUrl    string `gorm:"type:varchar(255)"`
 }
 
-func (JiraRemotelink) TableName() string {
-	return "_tool_jira_remotelinks"
+func (JiraIssueCommit) TableName() string {
+	return "_tool_jira_issue_commits"
 }
diff --git a/plugins/jira/models/migrationscripts/updateSchemas20220616.go b/plugins/jira/models/migrationscripts/archived/issue_label.go
similarity index 69%
rename from plugins/jira/models/migrationscripts/updateSchemas20220616.go
rename to plugins/jira/models/migrationscripts/archived/issue_label.go
index a02f7fda..1c666d3a 100644
--- a/plugins/jira/models/migrationscripts/updateSchemas20220616.go
+++ b/plugins/jira/models/migrationscripts/archived/issue_label.go
@@ -15,38 +15,22 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package migrationscripts
+package archived
 
 import (
-	"context"
 	"github.com/apache/incubator-devlake/models/migrationscripts/archived"
-
-	"gorm.io/gorm"
 )
 
-type JiraIssueLabel0616 struct {
+// Please note that Issue Labels can also apply to Pull Requests.
+// Pull Requests are considered Issues in GitHub.
+
+type JiraIssueLabel struct {
 	ConnectionId uint64 `gorm:"primaryKey;autoIncrement:false"`
 	IssueId      uint64 `gorm:"primaryKey;autoIncrement:false"`
 	LabelName    string `gorm:"primaryKey;type:varchar(255)"`
 	archived.NoPKModel
 }
 
-func (JiraIssueLabel0616) TableName() string {
+func (JiraIssueLabel) TableName() string {
 	return "_tool_jira_issue_labels"
 }
-
-type UpdateSchemas20220616 struct{}
-
-func (*UpdateSchemas20220616) Up(ctx context.Context, db *gorm.DB) error {
-
-	err := db.Migrator().AutoMigrate(JiraIssueLabel0616{})
-	return err
-}
-
-func (*UpdateSchemas20220616) Version() uint64 {
-	return 20220616154646
-}
-
-func (*UpdateSchemas20220616) Name() string {
-	return "add jira issue labels"
-}
diff --git a/plugins/jira/models/migrationscripts/archived/project.go b/plugins/jira/models/migrationscripts/archived/project.go
index 305ebd24..de16c6c1 100644
--- a/plugins/jira/models/migrationscripts/archived/project.go
+++ b/plugins/jira/models/migrationscripts/archived/project.go
@@ -21,10 +21,12 @@ import "github.com/apache/incubator-devlake/models/migrationscripts/archived"
 
 type JiraProject struct {
 	archived.NoPKModel
-	SourceId uint64 `gorm:"primarykey"`
-	Id       string `gorm:"primaryKey;type:varchar(255)"`
-	Key      string `gorm:"type:varchar(255)"`
-	Name     string `gorm:"type:varchar(255)"`
+
+	// collected fields
+	ConnectionId uint64 `gorm:"primarykey"`
+	Id           string `gorm:"primaryKey;type:varchar(255)"`
+	ProjectKey   string `gorm:"type:varchar(255)"`
+	Name         string `gorm:"type:varchar(255)"`
 }
 
 func (JiraProject) TableName() string {
diff --git a/plugins/jira/models/migrationscripts/archived/remotelink.go b/plugins/jira/models/migrationscripts/archived/remotelink.go
index 7dde5e72..c0ab385a 100644
--- a/plugins/jira/models/migrationscripts/archived/remotelink.go
+++ b/plugins/jira/models/migrationscripts/archived/remotelink.go
@@ -18,19 +18,24 @@ limitations under the License.
 package archived
 
 import (
+	"time"
+
 	"github.com/apache/incubator-devlake/models/migrationscripts/archived"
 	"gorm.io/datatypes"
 )
 
 type JiraRemotelink struct {
 	archived.NoPKModel
-	SourceId     uint64 `gorm:"primaryKey"`
+
+	// collected fields
+	ConnectionId uint64 `gorm:"primaryKey"`
 	RemotelinkId uint64 `gorm:"primarykey"`
 	IssueId      uint64 `gorm:"index"`
 	RawJson      datatypes.JSON
 	Self         string `gorm:"type:varchar(255)"`
 	Title        string
 	Url          string `gorm:"type:varchar(255)"`
+	IssueUpdated *time.Time
 }
 
 func (JiraRemotelink) TableName() string {
diff --git a/plugins/jira/models/migrationscripts/archived/source.go b/plugins/jira/models/migrationscripts/archived/source.go
deleted file mode 100644
index e941e701..00000000
--- a/plugins/jira/models/migrationscripts/archived/source.go
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package archived
-
-import "github.com/apache/incubator-devlake/models/migrationscripts/archived"
-
-type JiraSource struct {
-	archived.Model
-	Name                       string `gorm:"type:varchar(100);uniqueIndex" json:"name" validate:"required"`
-	Endpoint                   string `json:"endpoint" validate:"required"`
-	BasicAuthEncoded           string `json:"basicAuthEncoded" validate:"required"`
-	EpicKeyField               string `gorm:"type:varchar(50);" json:"epicKeyField"`
-	StoryPointField            string `gorm:"type:varchar(50);" json:"storyPointField"`
-	RemotelinkCommitShaPattern string `gorm:"type:varchar(255);comment='golang regexp, the first group will be recognized as commit sha, ref https://github.com/google/re2/wiki/Syntax'" json:"remotelinkCommitShaPattern"`
-	Proxy                      string `json:"proxy"`
-	RateLimit                  int    `comment:"api request rate limt per second"`
-}
-
-type JiraIssueTypeMapping struct {
-	SourceID     uint64 `gorm:"primaryKey" json:"jiraSourceId" validate:"required"`
-	UserType     string `gorm:"type:varchar(50);primaryKey" json:"userType" validate:"required"`
-	StandardType string `gorm:"type:varchar(50)" json:"standardType" validate:"required"`
-}
-
-type JiraIssueStatusMapping struct {
-	SourceID       uint64 `gorm:"primaryKey" json:"jiraSourceId" validate:"required"`
-	UserType       string `gorm:"type:varchar(50);primaryKey" json:"userType" validate:"required"`
-	UserStatus     string `gorm:"type:varchar(50);primaryKey" json:"userStatus" validate:"required"`
-	StandardStatus string `gorm:"type:varchar(50)" json:"standardStatus" validate:"required"`
-}
-
-func (JiraSource) TableName() string {
-	return "_tool_jira_sources"
-}
-
-func (JiraIssueTypeMapping) TableName() string {
-	return "_tool_jira_issue_type_mappings"
-}
-
-func (JiraIssueStatusMapping) TableName() string {
-	return "_tool_jira_issue_status_mappings"
-}
diff --git a/plugins/jira/models/migrationscripts/archived/sprint.go b/plugins/jira/models/migrationscripts/archived/sprint.go
index dd1f87a5..4ca8fe86 100644
--- a/plugins/jira/models/migrationscripts/archived/sprint.go
+++ b/plugins/jira/models/migrationscripts/archived/sprint.go
@@ -24,7 +24,7 @@ import (
 )
 
 type JiraSprint struct {
-	SourceId      uint64 `gorm:"primaryKey"`
+	ConnectionId  uint64 `gorm:"primaryKey"`
 	SprintId      uint64 `gorm:"primaryKey"`
 	Self          string `gorm:"type:varchar(255)"`
 	State         string `gorm:"type:varchar(255)"`
@@ -38,14 +38,14 @@ type JiraSprint struct {
 
 type JiraBoardSprint struct {
 	archived.NoPKModel
-	SourceId uint64 `gorm:"primaryKey"`
-	BoardId  uint64 `gorm:"primaryKey"`
-	SprintId uint64 `gorm:"primaryKey"`
+	ConnectionId uint64 `gorm:"primaryKey"`
+	BoardId      uint64 `gorm:"primaryKey"`
+	SprintId     uint64 `gorm:"primaryKey"`
 }
 
 type JiraSprintIssue struct {
 	archived.NoPKModel
-	SourceId         uint64 `gorm:"primaryKey"`
+	ConnectionId     uint64 `gorm:"primaryKey"`
 	SprintId         uint64 `gorm:"primaryKey"`
 	IssueId          uint64 `gorm:"primaryKey"`
 	ResolutionDate   *time.Time
diff --git a/plugins/jira/models/migrationscripts/updateSchemas20220614.go b/plugins/jira/models/migrationscripts/archived/status.go
similarity index 75%
rename from plugins/jira/models/migrationscripts/updateSchemas20220614.go
rename to plugins/jira/models/migrationscripts/archived/status.go
index 7d64d376..20ae5e92 100644
--- a/plugins/jira/models/migrationscripts/updateSchemas20220614.go
+++ b/plugins/jira/models/migrationscripts/archived/status.go
@@ -15,13 +15,10 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package migrationscripts
+package archived
 
 import (
-	"context"
-
 	"github.com/apache/incubator-devlake/models/migrationscripts/archived"
-	"gorm.io/gorm"
 )
 
 type JiraStatus struct {
@@ -36,19 +33,3 @@ type JiraStatus struct {
 func (JiraStatus) TableName() string {
 	return "_tool_jira_statuses"
 }
-
-type UpdateSchemas20220614 struct{}
-
-func (*UpdateSchemas20220614) Up(ctx context.Context, db *gorm.DB) error {
-	return db.Migrator().AutoMigrate(
-		&JiraStatus{},
-	)
-}
-
-func (*UpdateSchemas20220614) Version() uint64 {
-	return 20220614112900
-}
-
-func (*UpdateSchemas20220614) Name() string {
-	return "add jira status"
-}
diff --git a/plugins/jira/models/migrationscripts/archived/worklog.go b/plugins/jira/models/migrationscripts/archived/worklog.go
index 5e131d0d..ff31cff5 100644
--- a/plugins/jira/models/migrationscripts/archived/worklog.go
+++ b/plugins/jira/models/migrationscripts/archived/worklog.go
@@ -25,7 +25,7 @@ import (
 
 type JiraWorklog struct {
 	archived.NoPKModel
-	SourceId         uint64 `gorm:"primaryKey"`
+	ConnectionId     uint64 `gorm:"primaryKey"`
 	IssueId          uint64 `gorm:"primarykey"`
 	WorklogId        string `gorm:"primarykey;type:varchar(255)"`
 	AuthorId         string `gorm:"type:varchar(255)"`
@@ -34,6 +34,7 @@ type JiraWorklog struct {
 	TimeSpentSeconds int
 	Updated          time.Time
 	Started          time.Time
+	IssueUpdated     *time.Time
 }
 
 func (JiraWorklog) TableName() string {
diff --git a/plugins/jira/models/migrationscripts/init_schema.go b/plugins/jira/models/migrationscripts/init_schema.go
index 93f1fc53..5af83d2a 100644
--- a/plugins/jira/models/migrationscripts/init_schema.go
+++ b/plugins/jira/models/migrationscripts/init_schema.go
@@ -19,7 +19,11 @@ package migrationscripts
 
 import (
 	"context"
+	"encoding/base64"
+	"strings"
 
+	"github.com/apache/incubator-devlake/config"
+	"github.com/apache/incubator-devlake/plugins/core"
 	"github.com/apache/incubator-devlake/plugins/jira/models/migrationscripts/archived"
 	"gorm.io/gorm"
 )
@@ -27,28 +31,150 @@ import (
 type InitSchemas struct{}
 
 func (*InitSchemas) Up(ctx context.Context, db *gorm.DB) error {
-	return db.Migrator().AutoMigrate(
+
+	err := db.Migrator().DropTable(
+		// history table
+		"_raw_jira_api_users",
+		"_raw_jira_api_boards",
+		"_raw_jira_api_changelogs",
+		"_raw_jira_api_issues",
+		"_raw_jira_api_projects",
+		"_raw_jira_api_remotelinks",
+		"_raw_jira_api_sprints",
+		"_raw_jira_api_status",
+		"_raw_jira_api_worklogs",
+		"_tool_jira_accounts",
+		"_tool_jira_issue_type_mappings",
+		"_tool_jira_issue_status_mappings",
+		"_tool_jira_changelogs",
+		"_tool_jira_changelog_items",
 		&archived.JiraProject{},
-		&archived.JiraUser{},
 		&archived.JiraIssue{},
 		&archived.JiraBoard{},
 		&archived.JiraBoardIssue{},
-		&archived.JiraChangelog{},
-		&archived.JiraChangelogItem{},
 		&archived.JiraRemotelink{},
 		&archived.JiraIssueCommit{},
-		&archived.JiraSource{},
-		&archived.JiraIssueTypeMapping{},
-		&archived.JiraIssueStatusMapping{},
 		&archived.JiraSprint{},
 		&archived.JiraBoardSprint{},
 		&archived.JiraSprintIssue{},
 		&archived.JiraWorklog{},
 	)
+	if err != nil {
+		return err
+	}
+
+	// get connection history data
+	var result *gorm.DB
+	m := db.Migrator()
+
+	if m.HasTable(&archived.JiraConnectionV11{}) {
+		var jiraConns []archived.JiraConnectionV11
+		result = db.Find(&jiraConns)
+
+		if result.Error == nil {
+			err := db.Migrator().DropTable(&archived.JiraConnectionV11{})
+			if err != nil {
+				return err
+			}
+			err = db.Migrator().AutoMigrate(&archived.JiraConnection{})
+			if err != nil {
+				return err
+			}
+
+			for _, v := range jiraConns {
+				conn := &archived.JiraConnection{}
+				conn.ID = v.ID
+				conn.Name = v.Name
+				conn.Endpoint = v.Endpoint
+				conn.Proxy = v.Proxy
+				conn.RateLimit = v.RateLimit
+
+				c := config.GetConfig()
+				encKey := c.GetString("ENCODE_KEY")
+				auth, err := core.Decrypt(encKey, v.BasicAuthEncoded)
+				if err != nil {
+					return err
+				}
+				pk, err := base64.StdEncoding.DecodeString(auth)
+				if err != nil {
+					return err
+				}
+				originInfo := strings.Split(string(pk), ":")
+				if len(originInfo) == 2 {
+					conn.Username = originInfo[0]
+					conn.Password = originInfo[1]
+					// create
+					db.Create(&conn)
+				}
+			}
+		} else if m.HasTable(&archived.JiraConnectionV10{}) {
+			var jiraConns []archived.JiraConnectionV10
+			result = db.Find(&jiraConns)
+
+			if result.Error == nil {
+				err := db.Migrator().DropTable(&archived.JiraConnectionV10{})
+				if err != nil {
+					return err
+				}
+				err = db.Migrator().AutoMigrate(&archived.JiraConnection{})
+				if err != nil {
+					return err
+				}
+
+				for _, v := range jiraConns {
+					conn := &archived.JiraConnection{}
+					conn.ID = v.ID
+					conn.Name = v.Name
+					conn.Endpoint = v.Endpoint
+					conn.Proxy = v.Proxy
+					conn.RateLimit = v.RateLimit
+
+					c := config.GetConfig()
+					encKey := c.GetString("ENCODE_KEY")
+					auth, err := core.Decrypt(encKey, v.BasicAuthEncoded)
+					if err != nil {
+						return err
+					}
+					pk, err := base64.StdEncoding.DecodeString(auth)
+					if err != nil {
+						return err
+					}
+					originInfo := strings.Split(string(pk), ":")
+					if len(originInfo) == 2 {
+						conn.Username = originInfo[0]
+						conn.Password = originInfo[1]
+						// create
+						db.Create(&conn)
+					}
+				}
+			}
+		} else {
+			return result.Error
+		}
+	}
+
+	return db.Migrator().AutoMigrate(
+		&archived.JiraAccount{},
+		&archived.JiraBoardIssue{},
+		&archived.JiraBoard{},
+		&archived.JiraIssueChangelogItems{},
+		&archived.JiraIssueChangelogs{},
+		//&archived.JiraConnection{},
+		&archived.JiraIssueCommit{},
+		&archived.JiraIssueLabel{},
+		&archived.JiraIssue{},
+		&archived.JiraProject{},
+		&archived.JiraRemotelink{},
+		&archived.JiraSprint{},
+		&archived.JiraBoardSprint{},
+		&archived.JiraSprintIssue{},
+		&archived.JiraStatus{},
+		&archived.JiraWorklog{},
+	)
 }
 
 func (*InitSchemas) Version() uint64 {
-	return 20220407201138
+	return 20220707201138
 }
 
 func (*InitSchemas) Name() string {
diff --git a/plugins/jira/models/migrationscripts/register.go b/plugins/jira/models/migrationscripts/register.go
index 81df9841..06d924d0 100644
--- a/plugins/jira/models/migrationscripts/register.go
+++ b/plugins/jira/models/migrationscripts/register.go
@@ -25,18 +25,5 @@ import (
 func All() []migration.Script {
 	return []migration.Script{
 		new(InitSchemas),
-		new(UpdateSchemas20220505),
-		new(UpdateSchemas20220507),
-		new(UpdateSchemas20220518),
-		new(UpdateSchemas20220525),
-		new(UpdateSchemas20220526),
-		new(UpdateSchemas20220527),
-		new(UpdateSchemas20220601),
-		new(UpdateSchemas20220614),
-		new(UpdateSchemas20220615),
-		new(UpdateSchemas20220616),
-		new(UpdateSchemas20220620),
-		new(UpdateSchemas20220624),
-		new(UpdateSchemas20220630),
 	}
 }
diff --git a/plugins/jira/models/migrationscripts/updateSchemas20220505.go b/plugins/jira/models/migrationscripts/updateSchemas20220505.go
deleted file mode 100644
index ff4a6c81..00000000
--- a/plugins/jira/models/migrationscripts/updateSchemas20220505.go
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
-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 (
-	"context"
-	"github.com/apache/incubator-devlake/models/common"
-	"github.com/apache/incubator-devlake/plugins/jira/models/migrationscripts/archived"
-
-	"gorm.io/gorm"
-)
-
-type JiraConnection20220505 struct {
-	common.Model
-	Name                       string `gorm:"type:varchar(100);uniqueIndex" json:"name" validate:"required"`
-	Endpoint                   string `json:"endpoint" validate:"required"`
-	BasicAuthEncoded           string `json:"basicAuthEncoded" validate:"required"`
-	EpicKeyField               string `gorm:"type:varchar(50);" json:"epicKeyField"`
-	StoryPointField            string `gorm:"type:varchar(50);" json:"storyPointField"`
-	RemotelinkCommitShaPattern string `gorm:"type:varchar(255);comment='golang regexp, the first group will be recognized as commit sha, ref https://github.com/google/re2/wiki/Syntax'" json:"remotelinkCommitShaPattern"`
-	Proxy                      string `json:"proxy"`
-	RateLimit                  int    `comment:"api request rate limt per hour" json:"rateLimit"`
-}
-
-func (JiraConnection20220505) TableName() string {
-	return "_tool_jira_connections"
-}
-
-type UpdateSchemas20220505 struct{}
-
-func (*UpdateSchemas20220505) Up(ctx context.Context, db *gorm.DB) error {
-	err := db.Migrator().RenameTable(archived.JiraSource{}, JiraConnection20220505{})
-	if err != nil {
-		return err
-	}
-	err = db.Migrator().RenameColumn(archived.JiraBoard{}, "source_id", "connection_id")
-	if err != nil {
-		return err
-	}
-	err = db.Migrator().RenameColumn(archived.JiraProject{}, "source_id", "connection_id")
-	if err != nil {
-		return err
-	}
-	err = db.Migrator().RenameColumn(archived.JiraUser{}, "source_id", "connection_id")
-	if err != nil {
-		return err
-	}
-	err = db.Migrator().RenameColumn(archived.JiraIssue{}, "source_id", "connection_id")
-	if err != nil {
-		return err
-	}
-	err = db.Migrator().RenameColumn(archived.JiraBoardIssue{}, "source_id", "connection_id")
-	if err != nil {
-		return err
-	}
-	err = db.Migrator().RenameColumn(archived.JiraChangelog{}, "source_id", "connection_id")
-	if err != nil {
-		return err
-	}
-	err = db.Migrator().RenameColumn(archived.JiraChangelogItem{}, "source_id", "connection_id")
-	if err != nil {
-		return err
-	}
-	err = db.Migrator().RenameColumn(archived.JiraRemotelink{}, "source_id", "connection_id")
-	if err != nil {
-		return err
-	}
-	err = db.Migrator().RenameColumn(archived.JiraIssueCommit{}, "source_id", "connection_id")
-	if err != nil {
-		return err
-	}
-	err = db.Migrator().RenameColumn(archived.JiraIssueTypeMapping{}, "source_id", "connection_id")
-	if err != nil {
-		return err
-	}
-	err = db.Migrator().RenameColumn(archived.JiraIssueStatusMapping{}, "source_id", "connection_id")
-	if err != nil {
-		return err
-	}
-	err = db.Migrator().RenameColumn(archived.JiraSprint{}, "source_id", "connection_id")
-	if err != nil {
-		return err
-	}
-	err = db.Migrator().RenameColumn(archived.JiraBoardSprint{}, "source_id", "connection_id")
-	if err != nil {
-		return err
-	}
-	err = db.Migrator().RenameColumn(archived.JiraSprintIssue{}, "source_id", "connection_id")
-	if err != nil {
-		return err
-	}
-	err = db.Migrator().RenameColumn(archived.JiraWorklog{}, "source_id", "connection_id")
-	if err != nil {
-		return err
-	}
-	return nil
-}
-
-func (*UpdateSchemas20220505) Version() uint64 {
-	return 20220505212344
-}
-
-func (*UpdateSchemas20220505) Owner() string {
-	return "Jira"
-}
-
-func (*UpdateSchemas20220505) Name() string {
-	return "Rename source to connection "
-}
diff --git a/plugins/jira/models/migrationscripts/updateSchemas20220507.go b/plugins/jira/models/migrationscripts/updateSchemas20220507.go
deleted file mode 100644
index 0f2bf59e..00000000
--- a/plugins/jira/models/migrationscripts/updateSchemas20220507.go
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
-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 (
-	"context"
-	"time"
-
-	"github.com/apache/incubator-devlake/models/migrationscripts/archived"
-	"gorm.io/datatypes"
-	"gorm.io/gorm"
-)
-
-type JiraIssue20220507 struct {
-	// collected fields
-	SourceId                 uint64 `gorm:"primaryKey"`
-	IssueId                  uint64 `gorm:"primarykey"`
-	ProjectId                uint64
-	Self                     string `gorm:"type:varchar(255)"`
-	IconURL                  string `gorm:"type:varchar(255);column:icon_url"`
-	Key                      string `gorm:"type:varchar(255)"`
-	Summary                  string
-	Type                     string `gorm:"type:varchar(255)"`
-	EpicKey                  string `gorm:"type:varchar(255)"`
-	StatusName               string `gorm:"type:varchar(255)"`
-	StatusKey                string `gorm:"type:varchar(255)"`
-	StoryPoint               float64
-	OriginalEstimateMinutes  int64  // user input?
-	AggregateEstimateMinutes int64  // sum up of all subtasks?
-	RemainingEstimateMinutes int64  // could it be negative value?
-	CreatorAccountId         string `gorm:"type:varchar(255)"`
-	CreatorAccountType       string `gorm:"type:varchar(255)"`
-	CreatorDisplayName       string `gorm:"type:varchar(255)"`
-	AssigneeAccountId        string `gorm:"type:varchar(255);comment:latest assignee"`
-	AssigneeAccountType      string `gorm:"type:varchar(255)"`
-	AssigneeDisplayName      string `gorm:"type:varchar(255)"`
-	PriorityId               uint64
-	PriorityName             string `gorm:"type:varchar(255)"`
-	ParentId                 uint64
-	ParentKey                string `gorm:"type:varchar(255)"`
-	SprintId                 uint64 // latest sprint, issue might cross multiple sprints, would be addressed by #514
-	SprintName               string `gorm:"type:varchar(255)"`
-	ResolutionDate           *time.Time
-	Created                  time.Time
-	Updated                  time.Time `gorm:"index"`
-	SpentMinutes             int64
-	LeadTimeMinutes          uint
-	StdStoryPoint            uint
-	StdType                  string `gorm:"type:varchar(255)"`
-	StdStatus                string `gorm:"type:varchar(255)"`
-	AllFields                datatypes.JSONMap
-
-	// internal status tracking
-	ChangelogUpdated  *time.Time
-	RemotelinkUpdated *time.Time
-	archived.NoPKModel
-}
-
-func (JiraIssue20220507) TableName() string {
-	return "_tool_jira_issues"
-}
-
-type UpdateSchemas20220507 struct{}
-
-func (*UpdateSchemas20220507) Up(ctx context.Context, db *gorm.DB) error {
-	err := db.Migrator().AddColumn(&JiraIssue20220507{}, "icon_url")
-	if err != nil {
-		return err
-	}
-	return nil
-}
-
-func (*UpdateSchemas20220507) Version() uint64 {
-	return 20220507154646
-}
-
-func (*UpdateSchemas20220507) Name() string {
-	return "Add icon_url column to JiraIssue"
-}
diff --git a/plugins/jira/models/migrationscripts/updateSchemas20220525.go b/plugins/jira/models/migrationscripts/updateSchemas20220525.go
deleted file mode 100644
index d3a52509..00000000
--- a/plugins/jira/models/migrationscripts/updateSchemas20220525.go
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
-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 (
-	"context"
-
-	"github.com/apache/incubator-devlake/models/migrationscripts/archived"
-	jiraArchived "github.com/apache/incubator-devlake/plugins/jira/models/migrationscripts/archived"
-
-	"gorm.io/gorm"
-)
-
-type JiraProject20220525 struct {
-	archived.NoPKModel
-
-	// collected fields
-	ConnectionId uint64 `gorm:"primarykey"`
-	Id           string `gorm:"primaryKey;type:varchar(255)"`
-	ProjectKey   string `gorm:"type:varchar(255)"`
-	Name         string `gorm:"type:varchar(255)"`
-}
-
-func (JiraProject20220525) TableName() string {
-	return "_tool_jira_projects"
-}
-
-type UpdateSchemas20220525 struct{}
-
-func (*UpdateSchemas20220525) Up(ctx context.Context, db *gorm.DB) error {
-
-	err := db.Migrator().RenameColumn(jiraArchived.JiraProject{}, "key", "project_key")
-	if err != nil {
-		return err
-	}
-
-	return nil
-}
-
-func (*UpdateSchemas20220525) Version() uint64 {
-	return 20220525154646
-}
-
-func (*UpdateSchemas20220525) Name() string {
-	return "update `key` columns to `project_key` at _tool_jira_projects"
-}
diff --git a/plugins/jira/models/migrationscripts/updateSchemas20220526.go b/plugins/jira/models/migrationscripts/updateSchemas20220526.go
deleted file mode 100644
index b7bb634d..00000000
--- a/plugins/jira/models/migrationscripts/updateSchemas20220526.go
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
-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 (
-	"context"
-	"time"
-
-	"github.com/apache/incubator-devlake/models/migrationscripts/archived"
-	jiraArchived "github.com/apache/incubator-devlake/plugins/jira/models/migrationscripts/archived"
-
-	"gorm.io/datatypes"
-	"gorm.io/gorm"
-)
-
-type JiraIssue20220526 struct {
-	// collected fields
-	ConnectionId             uint64 `gorm:"primaryKey"`
-	IssueId                  uint64 `gorm:"primarykey"`
-	ProjectId                uint64
-	Self                     string `gorm:"type:varchar(255)"`
-	IconURL                  string `gorm:"type:varchar(255);column:icon_url"`
-	IssueKey                 string `gorm:"type:varchar(255)"`
-	Summary                  string
-	Type                     string `gorm:"type:varchar(255)"`
-	EpicKey                  string `gorm:"type:varchar(255)"`
-	StatusName               string `gorm:"type:varchar(255)"`
-	StatusKey                string `gorm:"type:varchar(255)"`
-	StoryPoint               float64
-	OriginalEstimateMinutes  int64  // user input?
-	AggregateEstimateMinutes int64  // sum up of all subtasks?
-	RemainingEstimateMinutes int64  // could it be negative value?
-	CreatorAccountId         string `gorm:"type:varchar(255)"`
-	CreatorAccountType       string `gorm:"type:varchar(255)"`
-	CreatorDisplayName       string `gorm:"type:varchar(255)"`
-	AssigneeAccountId        string `gorm:"type:varchar(255);comment:latest assignee"`
-	AssigneeAccountType      string `gorm:"type:varchar(255)"`
-	AssigneeDisplayName      string `gorm:"type:varchar(255)"`
-	PriorityId               uint64
-	PriorityName             string `gorm:"type:varchar(255)"`
-	ParentId                 uint64
-	ParentKey                string `gorm:"type:varchar(255)"`
-	SprintId                 uint64 // latest sprint, issue might cross multiple sprints, would be addressed by #514
-	SprintName               string `gorm:"type:varchar(255)"`
-	ResolutionDate           *time.Time
-	Created                  time.Time
-	Updated                  time.Time `gorm:"index"`
-	SpentMinutes             int64
-	LeadTimeMinutes          uint
-	StdStoryPoint            uint
-	StdType                  string `gorm:"type:varchar(255)"`
-	StdStatus                string `gorm:"type:varchar(255)"`
-	AllFields                datatypes.JSONMap
-
-	// internal status tracking
-	ChangelogUpdated  *time.Time
-	RemotelinkUpdated *time.Time
-	WorklogUpdated    *time.Time
-	archived.NoPKModel
-}
-
-func (JiraIssue20220526) TableName() string {
-	return "_tool_jira_issues"
-}
-
-type UpdateSchemas20220526 struct{}
-
-func (*UpdateSchemas20220526) Up(ctx context.Context, db *gorm.DB) error {
-
-	err := db.Migrator().RenameColumn(jiraArchived.JiraIssue{}, "key", "issue_key")
-	if err != nil {
-		return err
-	}
-
-	return nil
-}
-
-func (*UpdateSchemas20220526) Version() uint64 {
-	return 20220526154646
-}
-
-func (*UpdateSchemas20220526) Name() string {
-	return "update `key` columns to `issue_key` at _tool_jira_issues"
-}
diff --git a/plugins/jira/models/migrationscripts/updateSchemas20220527.go b/plugins/jira/models/migrationscripts/updateSchemas20220527.go
deleted file mode 100644
index ab9d2a27..00000000
--- a/plugins/jira/models/migrationscripts/updateSchemas20220527.go
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
-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 (
-	"context"
-
-	"github.com/apache/incubator-devlake/models/migrationscripts/archived"
-	jiraArchived "github.com/apache/incubator-devlake/plugins/jira/models/migrationscripts/archived"
-	"gorm.io/gorm"
-)
-
-type JiraChangelogItem20220527 struct {
-	archived.NoPKModel
-
-	// collected fields
-	SourceId    uint64 `gorm:"primaryKey"`
-	ChangelogId uint64 `gorm:"primaryKey"`
-	Field       string `gorm:"primaryKey"`
-	FieldType   string
-	FieldId     string
-	FromValue   string
-	FromString  string
-	ToValue     string
-	ToString    string
-}
-
-func (JiraChangelogItem20220527) TableName() string {
-	return "_tool_jira_changelog_items"
-}
-
-type UpdateSchemas20220527 struct{}
-
-func (*UpdateSchemas20220527) Up(ctx context.Context, db *gorm.DB) error {
-
-	err := db.Migrator().RenameColumn(jiraArchived.JiraChangelogItem{}, "from", "from_value")
-	if err != nil {
-		return err
-	}
-	err = db.Migrator().RenameColumn(jiraArchived.JiraChangelogItem{}, "to", "to_value")
-	if err != nil {
-		return err
-	}
-	return nil
-}
-
-func (*UpdateSchemas20220527) Version() uint64 {
-	return 20220527154646
-}
-
-func (*UpdateSchemas20220527) Name() string {
-	return "update `from` and `to` columns to `from_value` and `to_value` at _tool_jira_changelog_items"
-}
diff --git a/plugins/jira/models/migrationscripts/updateSchemas20220601.go b/plugins/jira/models/migrationscripts/updateSchemas20220601.go
deleted file mode 100644
index 7a7bb7b5..00000000
--- a/plugins/jira/models/migrationscripts/updateSchemas20220601.go
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
-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 (
-	"context"
-	"encoding/base64"
-	"strings"
-
-	"github.com/apache/incubator-devlake/plugins/core"
-	"github.com/apache/incubator-devlake/plugins/helper"
-	"gorm.io/gorm"
-)
-
-type JiraConnection20220601 struct {
-	helper.RestConnection
-	helper.BasicAuth
-	EpicKeyField               string `gorm:"type:varchar(50);" json:"epicKeyField"`
-	StoryPointField            string `gorm:"type:varchar(50);" json:"storyPointField"`
-	RemotelinkCommitShaPattern string `gorm:"type:varchar(255);comment='golang regexp, the first group will be recognized as commit sha, ref https://github.com/google/re2/wiki/Syntax'" json:"remotelinkCommitShaPattern"`
-}
-
-func (JiraConnection20220601) TableName() string {
-	return "_tool_jira_connections"
-}
-
-type UpdateSchemas20220601 struct {
-	config core.ConfigGetter
-	logger core.Logger
-}
-
-func (u *UpdateSchemas20220601) SetConfigGetter(getter core.ConfigGetter) {
-	u.config = getter
-}
-
-func (u *UpdateSchemas20220601) SetLogger(logger core.Logger) {
-	u.logger = logger
-}
-
-func (u *UpdateSchemas20220601) Up(ctx context.Context, db *gorm.DB) error {
-	var err error
-	if !db.Migrator().HasColumn(&JiraConnection20220505{}, "password") {
-		err = db.Migrator().AddColumn(&JiraConnection20220601{}, "password")
-		if err != nil {
-			return err
-		}
-	}
-
-	if !db.Migrator().HasColumn(&JiraConnection20220505{}, "username") {
-		err = db.Migrator().AddColumn(&JiraConnection20220601{}, "username")
-		if err != nil {
-			return err
-		}
-	}
-
-	if db.Migrator().HasColumn(&JiraConnection20220505{}, "basic_auth_encoded") {
-		connections := make([]*JiraConnection20220505, 0)
-		err = db.Find(&connections).Error
-		if err != nil {
-			return err
-		}
-		encKey := u.config.GetString(core.EncodeKeyEnvStr)
-		for _, connection := range connections {
-			basicAuthEncoded, err := core.Decrypt(encKey, connection.BasicAuthEncoded)
-			if err != nil {
-				return err
-			}
-			basicAuth, err := base64.StdEncoding.DecodeString(basicAuthEncoded)
-			if err != nil {
-				return err
-			}
-			strList := strings.Split(string(basicAuth), ":")
-			if len(strList) > 1 {
-				encPass, err := core.Encrypt(encKey, strList[1])
-				if err != nil {
-					return err
-				}
-				newConnection := JiraConnection20220601{
-					RestConnection: helper.RestConnection{
-						BaseConnection: helper.BaseConnection{
-							Name:  connection.Name,
-							Model: connection.Model,
-						},
-						Endpoint:  connection.Endpoint,
-						Proxy:     connection.Proxy,
-						RateLimit: connection.RateLimit,
-					},
-					BasicAuth: helper.BasicAuth{
-						Username: strList[0],
-						Password: encPass,
-					},
-					EpicKeyField:               connection.EpicKeyField,
-					StoryPointField:            connection.StoryPointField,
-					RemotelinkCommitShaPattern: connection.RemotelinkCommitShaPattern,
-				}
-				err = db.Save(newConnection).Error
-				if err != nil {
-					return err
-				}
-			}
-		}
-		err = db.Migrator().DropColumn(&JiraConnection20220505{}, "basic_auth_encoded")
-		if err != nil {
-			return err
-		}
-	}
-
-	return nil
-}
-
-func (*UpdateSchemas20220601) Version() uint64 {
-	return 20220601154646
-}
-
-func (*UpdateSchemas20220601) Name() string {
-	return "change basic_auth to username/password"
-}
diff --git a/plugins/jira/models/migrationscripts/updateSchemas20220615.go b/plugins/jira/models/migrationscripts/updateSchemas20220615.go
deleted file mode 100644
index f527cdde..00000000
--- a/plugins/jira/models/migrationscripts/updateSchemas20220615.go
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
-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 (
-	"context"
-	"time"
-
-	"gorm.io/gorm"
-)
-
-type UpdateSchemas20220615 struct {
-}
-
-type JiraIssue20220615 struct{}
-
-func (JiraIssue20220615) TableName() string {
-	return "_tool_jira_issues"
-}
-
-type JiraChangelog20220615 struct {
-	IssueUpdated *time.Time
-}
-
-func (JiraChangelog20220615) TableName() string {
-	return "_tool_jira_changelogs"
-}
-
-func (*UpdateSchemas20220615) Up(ctx context.Context, db *gorm.DB) error {
-	var err error
-	err = db.Migrator().DropColumn(&JiraIssue20220615{}, "changelog_updated")
-	if err != nil {
-		return err
-	}
-	err = db.Migrator().AutoMigrate(&JiraChangelog20220615{})
-	if err != nil {
-		return err
-	}
-
-	return nil
-}
-
-func (*UpdateSchemas20220615) Version() uint64 {
-	return 20220601154646
-}
-
-func (*UpdateSchemas20220615) Name() string {
-	return "replace issues.changelog_updated with changelogs.issue_updated"
-}
diff --git a/plugins/jira/models/migrationscripts/updateSchemas20220620.go b/plugins/jira/models/migrationscripts/updateSchemas20220620.go
deleted file mode 100644
index 70fc52fc..00000000
--- a/plugins/jira/models/migrationscripts/updateSchemas20220620.go
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
-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 (
-	"context"
-	"gorm.io/gorm"
-	"time"
-)
-
-type UpdateSchemas20220620 struct {
-}
-
-type JiraIssue20220620 struct{}
-
-func (JiraIssue20220620) TableName() string {
-	return "_tool_jira_issues"
-}
-
-type JiraWorklog20220620 struct {
-	IssueUpdated *time.Time
-}
-
-func (JiraWorklog20220620) TableName() string {
-	return "_tool_jira_worklogs"
-}
-
-type JiraRemotelink20220620 struct {
-	IssueUpdated *time.Time
-}
-
-func (JiraRemotelink20220620) TableName() string {
-	return "_tool_jira_remotelinks"
-}
-
-func (*UpdateSchemas20220620) Up(ctx context.Context, db *gorm.DB) error {
-	var err error
-	err = db.Migrator().DropColumn(&JiraIssue20220620{}, "worklog_updated")
-	if err != nil {
-		return err
-	}
-	err = db.Migrator().DropColumn(&JiraIssue20220620{}, "remotelink_updated")
-	if err != nil {
-		return err
-	}
-	err = db.Migrator().AutoMigrate(&JiraWorklog20220620{}, &JiraRemotelink20220620{})
-	if err != nil {
-		return err
-	}
-
-	return nil
-}
-
-func (*UpdateSchemas20220620) Version() uint64 {
-	return 20220620101111
-}
-
-func (*UpdateSchemas20220620) Name() string {
-	return "add column issue_updated to _tool_jira_worklogs and _tool_jira_remotelinks"
-}
diff --git a/plugins/jira/models/migrationscripts/updateSchemas20220624.go b/plugins/jira/models/migrationscripts/updateSchemas20220624.go
deleted file mode 100644
index 5dc389fa..00000000
--- a/plugins/jira/models/migrationscripts/updateSchemas20220624.go
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
-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 (
-	"context"
-
-	"gorm.io/gorm"
-)
-
-type JiraConnection20220624 struct {
-	EpicKeyField               string `gorm:"type:varchar(50);" json:"epicKeyField"`
-	StoryPointField            string `gorm:"type:varchar(50);" json:"storyPointField"`
-	RemotelinkCommitShaPattern string `gorm:"type:varchar(255);comment='golang regexp, the first group will be recognized as commit sha, ref https://github.com/google/re2/wiki/Syntax'" json:"remotelinkCommitShaPattern"`
-}
-
-func (JiraConnection20220624) TableName() string {
-	return "_tool_jira_connections"
-}
-
-type UpdateSchemas20220624 struct {
-}
-
-func (u *UpdateSchemas20220624) Up(ctx context.Context, db *gorm.DB) error {
-	err := db.Migrator().DropColumn(&JiraConnection20220624{}, "epic_key_field")
-	if err != nil {
-		return err
-	}
-	err = db.Migrator().DropColumn(&JiraConnection20220624{}, "story_point_field")
-	if err != nil {
-		return err
-	}
-	return db.Migrator().DropColumn(&JiraConnection20220624{}, "remotelink_commit_sha_pattern")
-}
-
-func (*UpdateSchemas20220624) Version() uint64 {
-	return 20220624102636
-}
-
-func (*UpdateSchemas20220624) Name() string {
-	return "remove epic_key_field, story_point_field, remotelink_commit_sha_pattern"
-}
diff --git a/plugins/jira/models/migrationscripts/updateSchemas20220630.go b/plugins/jira/models/migrationscripts/updateSchemas20220630.go
deleted file mode 100644
index 5e9132d1..00000000
--- a/plugins/jira/models/migrationscripts/updateSchemas20220630.go
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
-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 (
-	"context"
-
-	"gorm.io/gorm"
-)
-
-type JiraIssue20220630 struct {
-	StdStoryPoint    int64
-	TmpStdStoryPoint uint
-}
-
-func (JiraIssue20220630) TableName() string {
-	return "_tool_jira_issues"
-}
-
-type UpdateSchemas20220630 struct {
-}
-
-func (u *UpdateSchemas20220630) Up(ctx context.Context, db *gorm.DB) error {
-	err := db.Migrator().RenameColumn(&JiraIssue20220630{}, "std_story_point", "tmp_std_story_point")
-	if err != nil {
-		return err
-	}
-	err = db.Migrator().AddColumn(&JiraIssue20220630{}, "std_story_point")
-	if err != nil {
-		return err
-	}
-	err = db.Model(&JiraIssue20220630{}).Where("1 = 1").UpdateColumn("std_story_point", gorm.Expr("tmp_std_story_point")).Error
-	if err != nil {
-		return err
-	}
-	return db.Migrator().DropColumn(&JiraIssue20220630{}, "tmp_std_story_point")
-}
-
-func (*UpdateSchemas20220630) Version() uint64 {
-	return 20220630130656
-}
-
-func (*UpdateSchemas20220630) Name() string {
-	return "alter std_story_point from unsigned to signed"
-}
diff --git a/plugins/jira/models/migrationscripts/update_schemas20220518.go b/plugins/jira/models/migrationscripts/update_schemas20220518.go
deleted file mode 100644
index 9d8401c9..00000000
--- a/plugins/jira/models/migrationscripts/update_schemas20220518.go
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
-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 (
-	"context"
-	"time"
-
-	"gorm.io/datatypes"
-	"gorm.io/gorm"
-
-	"github.com/apache/incubator-devlake/models/migrationscripts/archived"
-)
-
-type JiraIssue20220518 struct {
-	// collected fields
-	SourceId                 uint64 `gorm:"primaryKey"`
-	IssueId                  uint64 `gorm:"primarykey"`
-	ProjectId                uint64
-	Self                     string `gorm:"type:varchar(255)"`
-	IconURL                  string `gorm:"type:varchar(255);column:icon_url"`
-	Key                      string `gorm:"type:varchar(255)"`
-	Summary                  string
-	Type                     string `gorm:"type:varchar(255)"`
-	EpicKey                  string `gorm:"type:varchar(255)"`
-	StatusName               string `gorm:"type:varchar(255)"`
-	StatusKey                string `gorm:"type:varchar(255)"`
-	StoryPoint               float64
-	OriginalEstimateMinutes  int64  // user input?
-	AggregateEstimateMinutes int64  // sum up of all subtasks?
-	RemainingEstimateMinutes int64  // could it be negative value?
-	CreatorAccountId         string `gorm:"type:varchar(255)"`
-	CreatorAccountType       string `gorm:"type:varchar(255)"`
-	CreatorDisplayName       string `gorm:"type:varchar(255)"`
-	AssigneeAccountId        string `gorm:"type:varchar(255);comment:latest assignee"`
-	AssigneeAccountType      string `gorm:"type:varchar(255)"`
-	AssigneeDisplayName      string `gorm:"type:varchar(255)"`
-	PriorityId               uint64
-	PriorityName             string `gorm:"type:varchar(255)"`
-	ParentId                 uint64
-	ParentKey                string `gorm:"type:varchar(255)"`
-	SprintId                 uint64 // latest sprint, issue might cross multiple sprints, would be addressed by #514
-	SprintName               string `gorm:"type:varchar(255)"`
-	ResolutionDate           *time.Time
-	Created                  time.Time
-	Updated                  time.Time `gorm:"index"`
-	SpentMinutes             int64
-	LeadTimeMinutes          uint
-	StdStoryPoint            uint
-	StdType                  string `gorm:"type:varchar(255)"`
-	StdStatus                string `gorm:"type:varchar(255)"`
-	AllFields                datatypes.JSONMap
-
-	// internal status tracking
-	ChangelogUpdated  *time.Time
-	RemotelinkUpdated *time.Time
-	WorklogUpdated    *time.Time
-	archived.NoPKModel
-}
-
-func (JiraIssue20220518) TableName() string {
-	return "_tool_jira_issues"
-}
-
-type UpdateSchemas20220518 struct{}
-
-func (*UpdateSchemas20220518) Up(ctx context.Context, db *gorm.DB) error {
-	err := db.Migrator().AddColumn(&JiraIssue20220518{}, "worklog_updated")
-	if err != nil {
-		return err
-	}
-	return nil
-}
-
-func (*UpdateSchemas20220518) Version() uint64 {
-	return 20220518132510
-}
-
-func (*UpdateSchemas20220518) Name() string {
-	return "Add worklog_updated column to JiraIssue"
-}
diff --git a/plugins/jira/tasks/user_collector.go b/plugins/jira/tasks/account_collector.go
similarity index 86%
rename from plugins/jira/tasks/user_collector.go
rename to plugins/jira/tasks/account_collector.go
index 6ccf5664..20340a54 100644
--- a/plugins/jira/tasks/user_collector.go
+++ b/plugins/jira/tasks/account_collector.go
@@ -31,19 +31,19 @@ import (
 
 const RAW_USERS_TABLE = "jira_api_users"
 
-var CollectUsersMeta = core.SubTaskMeta{
-	Name:             "collectUsers",
-	EntryPoint:       CollectUsers,
+var CollectAccountsMeta = core.SubTaskMeta{
+	Name:             "collectAccounts",
+	EntryPoint:       CollectAccounts,
 	EnabledByDefault: true,
-	Description:      "collect Jira users",
+	Description:      "collect Jira accounts",
 	DomainTypes:      []string{core.DOMAIN_TYPE_CROSS},
 }
 
-func CollectUsers(taskCtx core.SubTaskContext) error {
+func CollectAccounts(taskCtx core.SubTaskContext) error {
 	data := taskCtx.GetData().(*JiraTaskData)
 	db := taskCtx.GetDal()
 	logger := taskCtx.GetLogger()
-	logger.Info("collect user")
+	logger.Info("collect account")
 	cursor, err := db.Cursor(
 		Select("account_id"),
 		From("_tool_jira_accounts"),
@@ -52,7 +52,7 @@ func CollectUsers(taskCtx core.SubTaskContext) error {
 	if err != nil {
 		return err
 	}
-	iterator, err := helper.NewDalCursorIterator(db, cursor, reflect.TypeOf(models.JiraUser{}))
+	iterator, err := helper.NewDalCursorIterator(db, cursor, reflect.TypeOf(models.JiraAccount{}))
 	if err != nil {
 		return err
 	}
@@ -73,7 +73,7 @@ func CollectUsers(taskCtx core.SubTaskContext) error {
 		Input:       iterator,
 		UrlTemplate: "api/2/user",
 		Query: func(reqData *helper.RequestData) (url.Values, error) {
-			user := reqData.Input.(*models.JiraUser)
+			user := reqData.Input.(*models.JiraAccount)
 			query := url.Values{}
 			query.Set(queryKey, user.AccountId)
 			return query, nil
@@ -88,7 +88,7 @@ func CollectUsers(taskCtx core.SubTaskContext) error {
 		},
 	})
 	if err != nil {
-		logger.Error("collect user error:", err)
+		logger.Error("collect account error:", err)
 		return err
 	}
 
diff --git a/plugins/jira/tasks/user_convertor.go b/plugins/jira/tasks/account_convertor.go
similarity index 77%
rename from plugins/jira/tasks/user_convertor.go
rename to plugins/jira/tasks/account_convertor.go
index c20aba8f..650d7270 100644
--- a/plugins/jira/tasks/user_convertor.go
+++ b/plugins/jira/tasks/account_convertor.go
@@ -18,6 +18,8 @@ limitations under the License.
 package tasks
 
 import (
+	"reflect"
+
 	"github.com/apache/incubator-devlake/models/domainlayer"
 	"github.com/apache/incubator-devlake/models/domainlayer/crossdomain"
 	"github.com/apache/incubator-devlake/models/domainlayer/didgen"
@@ -25,27 +27,26 @@ import (
 	"github.com/apache/incubator-devlake/plugins/core/dal"
 	"github.com/apache/incubator-devlake/plugins/helper"
 	"github.com/apache/incubator-devlake/plugins/jira/models"
-	"reflect"
 )
 
-var ConvertUsersMeta = core.SubTaskMeta{
-	Name:             "convertUsers",
-	EntryPoint:       ConvertUsers,
+var ConvertAccountsMeta = core.SubTaskMeta{
+	Name:             "convertAccounts",
+	EntryPoint:       ConvertAccounts,
 	EnabledByDefault: true,
-	Description:      "convert Jira users",
+	Description:      "convert Jira accounts",
 	DomainTypes:      []string{core.DOMAIN_TYPE_CROSS},
 }
 
-func ConvertUsers(taskCtx core.SubTaskContext) error {
+func ConvertAccounts(taskCtx core.SubTaskContext) error {
 	data := taskCtx.GetData().(*JiraTaskData)
 	connectionId := data.Options.ConnectionId
 	boardId := data.Options.BoardId
 	logger := taskCtx.GetLogger()
 	db := taskCtx.GetDal()
-	logger.Info("convert user")
+	logger.Info("convert account")
 	clauses := []dal.Clause{
 		dal.Select("*"),
-		dal.From(&models.JiraUser{}),
+		dal.From(&models.JiraAccount{}),
 		dal.Where("connection_id = ?", connectionId),
 	}
 	cursor, err := db.Cursor(clauses...)
@@ -54,7 +55,7 @@ func ConvertUsers(taskCtx core.SubTaskContext) error {
 	}
 	defer cursor.Close()
 
-	userIdGen := didgen.NewDomainIdGenerator(&models.JiraUser{})
+	accountIdGen := didgen.NewDomainIdGenerator(&models.JiraAccount{})
 	converter, err := helper.NewDataConverter(helper.DataConverterArgs{
 		RawDataSubTaskArgs: helper.RawDataSubTaskArgs{
 			Ctx: taskCtx,
@@ -64,17 +65,17 @@ func ConvertUsers(taskCtx core.SubTaskContext) error {
 			},
 			Table: RAW_USERS_TABLE,
 		},
-		InputRowType: reflect.TypeOf(models.JiraUser{}),
+		InputRowType: reflect.TypeOf(models.JiraAccount{}),
 		Input:        cursor,
 		Convert: func(inputRow interface{}) ([]interface{}, error) {
-			jiraUser := inputRow.(*models.JiraUser)
+			jiraAccount := inputRow.(*models.JiraAccount)
 			u := &crossdomain.Account{
 				DomainEntity: domainlayer.DomainEntity{
-					Id: userIdGen.Generate(connectionId, jiraUser.AccountId),
+					Id: accountIdGen.Generate(connectionId, jiraAccount.AccountId),
 				},
-				UserName:  jiraUser.Name,
-				Email:     jiraUser.Email,
-				AvatarUrl: jiraUser.AvatarUrl,
+				UserName:  jiraAccount.Name,
+				Email:     jiraAccount.Email,
+				AvatarUrl: jiraAccount.AvatarUrl,
 			}
 			return []interface{}{u}, nil
 		},
diff --git a/plugins/jira/tasks/user_extractor.go b/plugins/jira/tasks/account_extractor.go
similarity index 87%
rename from plugins/jira/tasks/user_extractor.go
rename to plugins/jira/tasks/account_extractor.go
index 2d5c855f..9ff3b917 100644
--- a/plugins/jira/tasks/user_extractor.go
+++ b/plugins/jira/tasks/account_extractor.go
@@ -25,17 +25,17 @@ import (
 	"github.com/apache/incubator-devlake/plugins/jira/tasks/apiv2models"
 )
 
-var _ core.SubTaskEntryPoint = ExtractUsers
+var _ core.SubTaskEntryPoint = ExtractAccounts
 
-var ExtractUsersMeta = core.SubTaskMeta{
-	Name:             "extractUsers",
-	EntryPoint:       ExtractUsers,
+var ExtractAccountsMeta = core.SubTaskMeta{
+	Name:             "extractAccounts",
+	EntryPoint:       ExtractAccounts,
 	EnabledByDefault: true,
 	Description:      "extract Jira users",
 	DomainTypes:      []string{core.DOMAIN_TYPE_CROSS},
 }
 
-func ExtractUsers(taskCtx core.SubTaskContext) error {
+func ExtractAccounts(taskCtx core.SubTaskContext) error {
 	data := taskCtx.GetData().(*JiraTaskData)
 	extractor, err := helper.NewApiExtractor(helper.ApiExtractorArgs{
 		RawDataSubTaskArgs: helper.RawDataSubTaskArgs{
@@ -47,7 +47,7 @@ func ExtractUsers(taskCtx core.SubTaskContext) error {
 			Table: RAW_USERS_TABLE,
 		},
 		Extract: func(row *helper.RawData) ([]interface{}, error) {
-			var user apiv2models.User
+			var user apiv2models.Account
 			err := json.Unmarshal(row.Data, &user)
 			if err != nil {
 				return nil, err
diff --git a/plugins/jira/tasks/apiv2models/changelog.go b/plugins/jira/tasks/apiv2models/changelog.go
index 3d12212a..e77a6293 100644
--- a/plugins/jira/tasks/apiv2models/changelog.go
+++ b/plugins/jira/tasks/apiv2models/changelog.go
@@ -18,20 +18,21 @@ limitations under the License.
 package apiv2models
 
 import (
+	"time"
+
 	"github.com/apache/incubator-devlake/plugins/helper"
 	"github.com/apache/incubator-devlake/plugins/jira/models"
-	"time"
 )
 
 type Changelog struct {
 	ID      uint64             `json:"id,string"`
-	Author  User               `json:"author"`
+	Author  Account            `json:"author"`
 	Created helper.Iso8601Time `json:"created"`
 	Items   []ChangelogItem    `json:"items"`
 }
 
-func (c Changelog) ToToolLayer(connectionId, issueId uint64, issueUpdated *time.Time) (*models.JiraChangelog, *models.JiraUser) {
-	return &models.JiraChangelog{
+func (c Changelog) ToToolLayer(connectionId, issueId uint64, issueUpdated *time.Time) (*models.JiraIssueChangelogs, *models.JiraAccount) {
+	return &models.JiraIssueChangelogs{
 		ConnectionId:      connectionId,
 		ChangelogId:       c.ID,
 		IssueId:           issueId,
@@ -52,8 +53,8 @@ type ChangelogItem struct {
 	ToString   string `json:"toString"`
 }
 
-func (c ChangelogItem) ToToolLayer(connectionId, changelogId uint64) *models.JiraChangelogItem {
-	return &models.JiraChangelogItem{
+func (c ChangelogItem) ToToolLayer(connectionId, changelogId uint64) *models.JiraIssueChangelogItems {
+	return &models.JiraIssueChangelogItems{
 		ConnectionId: connectionId,
 		ChangelogId:  changelogId,
 		Field:        c.Field,
@@ -65,16 +66,16 @@ func (c ChangelogItem) ToToolLayer(connectionId, changelogId uint64) *models.Jir
 	}
 }
 
-func (c ChangelogItem) ExtractUser(connectionId uint64) []*models.JiraUser {
+func (c ChangelogItem) ExtractUser(connectionId uint64) []*models.JiraAccount {
 	if c.Field != "assignee" {
 		return nil
 	}
-	var result []*models.JiraUser
+	var result []*models.JiraAccount
 	if c.FromValue != "" {
-		result = append(result, &models.JiraUser{ConnectionId: connectionId, AccountId: c.FromValue})
+		result = append(result, &models.JiraAccount{ConnectionId: connectionId, AccountId: c.FromValue})
 	}
 	if c.ToValue != "" {
-		result = append(result, &models.JiraUser{ConnectionId: connectionId, AccountId: c.ToValue})
+		result = append(result, &models.JiraAccount{ConnectionId: connectionId, AccountId: c.ToValue})
 	}
 	return result
 }
diff --git a/plugins/jira/tasks/apiv2models/issue.go b/plugins/jira/tasks/apiv2models/issue.go
index 52dd60c6..7cad3635 100644
--- a/plugins/jira/tasks/apiv2models/issue.go
+++ b/plugins/jira/tasks/apiv2models/issue.go
@@ -19,9 +19,10 @@ package apiv2models
 
 import (
 	"encoding/json"
-	"gorm.io/datatypes"
 	"time"
 
+	"gorm.io/datatypes"
+
 	"github.com/apache/incubator-devlake/plugins/helper"
 	"github.com/apache/incubator-devlake/plugins/jira/models"
 )
@@ -96,7 +97,7 @@ type Issue struct {
 		Aggregatetimeoriginalestimate interface{}        `json:"aggregatetimeoriginalestimate"`
 		Versions                      []interface{}      `json:"versions"`
 		Issuelinks                    []interface{}      `json:"issuelinks"`
-		Assignee                      *User              `json:"assignee"`
+		Assignee                      *Account           `json:"assignee"`
 		Updated                       helper.Iso8601Time `json:"updated"`
 		Status                        struct {
 			Self           string `json:"self"`
@@ -123,9 +124,9 @@ type Issue struct {
 		Archiveddate          interface{}   `json:"archiveddate"`
 		Aggregatetimeestimate *int64        `json:"aggregatetimeestimate"`
 		Summary               string        `json:"summary"`
-		Creator               User          `json:"creator"`
+		Creator               Account       `json:"creator"`
 		Subtasks              []interface{} `json:"subtasks"`
-		Reporter              User          `json:"reporter"`
+		Reporter              Account       `json:"reporter"`
 		Aggregateprogress     struct {
 			Progress int `json:"progress"`
 			Total    int `json:"total"`
@@ -224,12 +225,12 @@ func (i *Issue) SetAllFields(raw datatypes.JSON) error {
 	return nil
 }
 
-func (i Issue) ExtractEntities(connectionId uint64) ([]uint64, *models.JiraIssue, []*models.JiraWorklog, []*models.JiraChangelog, []*models.JiraChangelogItem, []*models.JiraUser) {
+func (i Issue) ExtractEntities(connectionId uint64) ([]uint64, *models.JiraIssue, []*models.JiraWorklog, []*models.JiraIssueChangelogs, []*models.JiraIssueChangelogItems, []*models.JiraAccount) {
 	issue := i.toToolLayer(connectionId)
 	var worklogs []*models.JiraWorklog
-	var changelogs []*models.JiraChangelog
-	var changelogItems []*models.JiraChangelogItem
-	var users []*models.JiraUser
+	var changelogs []*models.JiraIssueChangelogs
+	var changelogItems []*models.JiraIssueChangelogItems
+	var users []*models.JiraAccount
 	var sprints []uint64
 
 	if i.Fields.Worklog != nil {
diff --git a/plugins/jira/tasks/apiv2models/user.go b/plugins/jira/tasks/apiv2models/user.go
index 46970535..cecdf085 100644
--- a/plugins/jira/tasks/apiv2models/user.go
+++ b/plugins/jira/tasks/apiv2models/user.go
@@ -19,7 +19,7 @@ package apiv2models
 
 import "github.com/apache/incubator-devlake/plugins/jira/models"
 
-type User struct {
+type Account struct {
 	Self         string `json:"self"`
 	Key          string `json:"key"`
 	Name         string `json:"name"`
@@ -39,7 +39,7 @@ type User struct {
 	Locale      string `json:"locale"`
 }
 
-func (u *User) getAccountId() string {
+func (u *Account) getAccountId() string {
 	if u == nil {
 		return ""
 	}
@@ -49,8 +49,8 @@ func (u *User) getAccountId() string {
 	return u.EmailAddress
 }
 
-func (u *User) ToToolLayer(connectionId uint64) *models.JiraUser {
-	return &models.JiraUser{
+func (u *Account) ToToolLayer(connectionId uint64) *models.JiraAccount {
+	return &models.JiraAccount{
 		ConnectionId: connectionId,
 		AccountId:    u.getAccountId(),
 		AccountType:  u.AccountType,
diff --git a/plugins/jira/tasks/apiv2models/user_test.go b/plugins/jira/tasks/apiv2models/user_test.go
index 1e4c5bbd..73af35fd 100644
--- a/plugins/jira/tasks/apiv2models/user_test.go
+++ b/plugins/jira/tasks/apiv2models/user_test.go
@@ -59,7 +59,7 @@ func TestUser_getAccountId(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			u := &User{
+			u := &Account{
 				Self:         tt.fields.Self,
 				Key:          tt.fields.Key,
 				Name:         tt.fields.Name,
diff --git a/plugins/jira/tasks/apiv2models/worklog.go b/plugins/jira/tasks/apiv2models/worklog.go
index db8cddac..d3f5aaff 100644
--- a/plugins/jira/tasks/apiv2models/worklog.go
+++ b/plugins/jira/tasks/apiv2models/worklog.go
@@ -18,16 +18,17 @@ limitations under the License.
 package apiv2models
 
 import (
-	"github.com/apache/incubator-devlake/plugins/helper"
 	"time"
 
+	"github.com/apache/incubator-devlake/plugins/helper"
+
 	"github.com/apache/incubator-devlake/plugins/jira/models"
 )
 
 type Worklog struct {
 	Self             string             `json:"self"`
-	Author           *User              `json:"author"`
-	UpdateAuthor     *User              `json:"updateAuthor"`
+	Author           *Account           `json:"author"`
+	UpdateAuthor     *Account           `json:"updateAuthor"`
 	Comment          string             `json:"comment"`
 	Created          string             `json:"created"`
 	Updated          helper.Iso8601Time `json:"updated"`
diff --git a/plugins/jira/tasks/changelog_collector.go b/plugins/jira/tasks/issue_changelog_collector.go
similarity index 88%
rename from plugins/jira/tasks/changelog_collector.go
rename to plugins/jira/tasks/issue_changelog_collector.go
index bcfb38db..fe169d89 100644
--- a/plugins/jira/tasks/changelog_collector.go
+++ b/plugins/jira/tasks/issue_changelog_collector.go
@@ -31,19 +31,19 @@ import (
 	"github.com/apache/incubator-devlake/plugins/jira/tasks/apiv2models"
 )
 
-var _ core.SubTaskEntryPoint = CollectChangelogs
+var _ core.SubTaskEntryPoint = CollectIssueChangelogs
 
-const RAW_CHANGELOG_TABLE = "jira_api_changelogs"
+const RAW_CHANGELOG_TABLE = "jira_api_issue_changelogs"
 
-var CollectChangelogsMeta = core.SubTaskMeta{
-	Name:             "collectChangelogs",
-	EntryPoint:       CollectChangelogs,
+var CollectIssueChangelogsMeta = core.SubTaskMeta{
+	Name:             "collectIssueChangelogs",
+	EntryPoint:       CollectIssueChangelogs,
 	EnabledByDefault: true,
-	Description:      "collect Jira change logs",
+	Description:      "collect Jira Issue change logs",
 	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
-func CollectChangelogs(taskCtx core.SubTaskContext) error {
+func CollectIssueChangelogs(taskCtx core.SubTaskContext) error {
 	data := taskCtx.GetData().(*JiraTaskData)
 	if data.JiraServerInfo.DeploymentType == models.DeploymentServer {
 		return nil
@@ -56,7 +56,7 @@ func CollectChangelogs(taskCtx core.SubTaskContext) error {
 		dal.Select("i.issue_id, i.updated AS update_time"),
 		dal.From("_tool_jira_board_issues bi"),
 		dal.Join("LEFT JOIN _tool_jira_issues i ON (bi.connection_id = i.connection_id AND bi.issue_id = i.issue_id)"),
-		dal.Join("LEFT JOIN _tool_jira_changelogs c ON (c.connection_id = i.connection_id AND c.issue_id = i.issue_id)"),
+		dal.Join("LEFT JOIN _tool_jira_issue_changelogs c ON (c.connection_id = i.connection_id AND c.issue_id = i.issue_id)"),
 		dal.Where(`i.updated > i.created AND bi.connection_id = ?  AND bi.board_id = ?  `, data.Options.ConnectionId, data.Options.BoardId),
 		dal.Groupby("i.issue_id, i.updated"),
 		dal.Having("i.updated > max(c.issue_updated) OR  max(c.issue_updated) IS NULL"),
diff --git a/plugins/jira/tasks/changelog_convertor.go b/plugins/jira/tasks/issue_changelog_convertor.go
similarity index 73%
rename from plugins/jira/tasks/changelog_convertor.go
rename to plugins/jira/tasks/issue_changelog_convertor.go
index bbcbf8bb..0b70eada 100644
--- a/plugins/jira/tasks/changelog_convertor.go
+++ b/plugins/jira/tasks/issue_changelog_convertor.go
@@ -18,12 +18,13 @@ limitations under the License.
 package tasks
 
 import (
-	"github.com/apache/incubator-devlake/plugins/core/dal"
 	"reflect"
 	"strconv"
 	"strings"
 	"time"
 
+	"github.com/apache/incubator-devlake/plugins/core/dal"
+
 	"github.com/apache/incubator-devlake/models/domainlayer"
 	"github.com/apache/incubator-devlake/models/domainlayer/didgen"
 	"github.com/apache/incubator-devlake/models/domainlayer/ticket"
@@ -32,23 +33,23 @@ import (
 	"github.com/apache/incubator-devlake/plugins/jira/models"
 )
 
-var ConvertChangelogsMeta = core.SubTaskMeta{
-	Name:             "convertChangelogs",
-	EntryPoint:       ConvertChangelogs,
+var ConvertIssueChangelogsMeta = core.SubTaskMeta{
+	Name:             "convertIssueChangelogs",
+	EntryPoint:       ConvertIssueChangelogs,
 	EnabledByDefault: true,
-	Description:      "convert Jira change logs",
+	Description:      "convert Jira Issue change logs",
 	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
-type ChangelogItemResult struct {
-	models.JiraChangelogItem
+type IssueChangelogItemResult struct {
+	models.JiraIssueChangelogItems
 	IssueId           uint64 `gorm:"index"`
 	AuthorAccountId   string
 	AuthorDisplayName string
 	Created           time.Time
 }
 
-func ConvertChangelogs(taskCtx core.SubTaskContext) error {
+func ConvertIssueChangelogs(taskCtx core.SubTaskContext) error {
 	data := taskCtx.GetData().(*JiraTaskData)
 	connectionId := data.Options.ConnectionId
 	boardId := data.Options.BoardId
@@ -57,17 +58,17 @@ func ConvertChangelogs(taskCtx core.SubTaskContext) error {
 	logger.Info("covert changelog")
 	// select all changelogs belongs to the board
 	clauses := []dal.Clause{
-		dal.Select("_tool_jira_changelog_items.*, _tool_jira_changelogs.issue_id, author_account_id, author_display_name, created"),
-		dal.From("_tool_jira_changelog_items"),
-		dal.Join(`left join _tool_jira_changelogs on (
-			_tool_jira_changelogs.connection_id = _tool_jira_changelog_items.connection_id
-			AND _tool_jira_changelogs.changelog_id = _tool_jira_changelog_items.changelog_id
+		dal.Select("_tool_jira_issue_changelog_items.*, _tool_jira_issue_changelogs.issue_id, author_account_id, author_display_name, created"),
+		dal.From("_tool_jira_issue_changelog_items"),
+		dal.Join(`left join _tool_jira_issue_changelogs on (
+			_tool_jira_issue_changelogs.connection_id = _tool_jira_issue_changelog_items.connection_id
+			AND _tool_jira_issue_changelogs.changelog_id = _tool_jira_issue_changelog_items.changelog_id
 		)`),
 		dal.Join(`left join _tool_jira_board_issues on (
-			_tool_jira_board_issues.connection_id = _tool_jira_changelogs.connection_id
-			AND _tool_jira_board_issues.issue_id = _tool_jira_changelogs.issue_id
+			_tool_jira_board_issues.connection_id = _tool_jira_issue_changelogs.connection_id
+			AND _tool_jira_board_issues.issue_id = _tool_jira_issue_changelogs.issue_id
 		)`),
-		dal.Where("_tool_jira_changelog_items.connection_id = ? AND _tool_jira_board_issues.board_id = ?", connectionId, boardId),
+		dal.Where("_tool_jira_issue_changelog_items.connection_id = ? AND _tool_jira_board_issues.board_id = ?", connectionId, boardId),
 	}
 	cursor, err := db.Cursor(clauses...)
 	if err != nil {
@@ -77,8 +78,8 @@ func ConvertChangelogs(taskCtx core.SubTaskContext) error {
 	defer cursor.Close()
 	issueIdGenerator := didgen.NewDomainIdGenerator(&models.JiraIssue{})
 	sprintIdGenerator := didgen.NewDomainIdGenerator(&models.JiraSprint{})
-	changelogIdGenerator := didgen.NewDomainIdGenerator(&models.JiraChangelogItem{})
-	userIdGen := didgen.NewDomainIdGenerator(&models.JiraUser{})
+	changelogIdGenerator := didgen.NewDomainIdGenerator(&models.JiraIssueChangelogItems{})
+	accountIdGen := didgen.NewDomainIdGenerator(&models.JiraAccount{})
 	converter, err := helper.NewDataConverter(helper.DataConverterArgs{
 		RawDataSubTaskArgs: helper.RawDataSubTaskArgs{
 			Ctx: taskCtx,
@@ -88,10 +89,10 @@ func ConvertChangelogs(taskCtx core.SubTaskContext) error {
 			},
 			Table: RAW_CHANGELOG_TABLE,
 		},
-		InputRowType: reflect.TypeOf(ChangelogItemResult{}),
+		InputRowType: reflect.TypeOf(IssueChangelogItemResult{}),
 		Input:        cursor,
 		Convert: func(inputRow interface{}) ([]interface{}, error) {
-			row := inputRow.(*ChangelogItemResult)
+			row := inputRow.(*IssueChangelogItemResult)
 			changelog := &ticket.Changelog{
 				DomainEntity: domainlayer.DomainEntity{Id: changelogIdGenerator.Generate(
 					row.ConnectionId,
@@ -99,7 +100,7 @@ func ConvertChangelogs(taskCtx core.SubTaskContext) error {
 					row.Field,
 				)},
 				IssueId:           issueIdGenerator.Generate(row.ConnectionId, row.IssueId),
-				AuthorId:          userIdGen.Generate(connectionId, row.AuthorAccountId),
+				AuthorId:          accountIdGen.Generate(connectionId, row.AuthorAccountId),
 				AuthorName:        row.AuthorDisplayName,
 				FieldId:           row.FieldId,
 				FieldName:         row.Field,
@@ -109,10 +110,10 @@ func ConvertChangelogs(taskCtx core.SubTaskContext) error {
 			}
 			if row.Field == "assignee" {
 				if row.ToValue != "" {
-					changelog.OriginalToValue = userIdGen.Generate(connectionId, row.ToValue)
+					changelog.OriginalToValue = accountIdGen.Generate(connectionId, row.ToValue)
 				}
 				if row.FromValue != "" {
-					changelog.OriginalFromValue = userIdGen.Generate(connectionId, row.FromValue)
+					changelog.OriginalFromValue = accountIdGen.Generate(connectionId, row.FromValue)
 				}
 			}
 			if row.Field == "Sprint" {
diff --git a/plugins/jira/tasks/changelog_extractor.go b/plugins/jira/tasks/issue_changelog_extractor.go
similarity index 89%
rename from plugins/jira/tasks/changelog_extractor.go
rename to plugins/jira/tasks/issue_changelog_extractor.go
index cadd2815..92ce64f9 100644
--- a/plugins/jira/tasks/changelog_extractor.go
+++ b/plugins/jira/tasks/issue_changelog_extractor.go
@@ -26,17 +26,17 @@ import (
 	"github.com/apache/incubator-devlake/plugins/jira/tasks/apiv2models"
 )
 
-var _ core.SubTaskEntryPoint = ExtractChangelogs
+var _ core.SubTaskEntryPoint = ExtractIssueChangelogs
 
-var ExtractChangelogsMeta = core.SubTaskMeta{
-	Name:             "extractChangelogs",
-	EntryPoint:       ExtractChangelogs,
+var ExtractIssueChangelogsMeta = core.SubTaskMeta{
+	Name:             "extractIssueChangelogs",
+	EntryPoint:       ExtractIssueChangelogs,
 	EnabledByDefault: true,
-	Description:      "extract Jira change logs",
+	Description:      "extract Jira Issue change logs",
 	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
-func ExtractChangelogs(taskCtx core.SubTaskContext) error {
+func ExtractIssueChangelogs(taskCtx core.SubTaskContext) error {
 	data := taskCtx.GetData().(*JiraTaskData)
 	if data.JiraServerInfo.DeploymentType == models.DeploymentServer {
 		return nil
diff --git a/plugins/jira/tasks/issue_convertor.go b/plugins/jira/tasks/issue_convertor.go
index d1be94d8..9eb9985f 100644
--- a/plugins/jira/tasks/issue_convertor.go
+++ b/plugins/jira/tasks/issue_convertor.go
@@ -18,11 +18,12 @@ limitations under the License.
 package tasks
 
 import (
-	"github.com/apache/incubator-devlake/plugins/core/dal"
 	"net/url"
 	"path/filepath"
 	"reflect"
 
+	"github.com/apache/incubator-devlake/plugins/core/dal"
+
 	"github.com/apache/incubator-devlake/models/domainlayer"
 	"github.com/apache/incubator-devlake/models/domainlayer/didgen"
 	"github.com/apache/incubator-devlake/models/domainlayer/ticket"
@@ -64,7 +65,7 @@ func ConvertIssues(taskCtx core.SubTaskContext) error {
 	defer cursor.Close()
 
 	issueIdGen := didgen.NewDomainIdGenerator(&jiraModels.JiraIssue{})
-	userIdGen := didgen.NewDomainIdGenerator(&jiraModels.JiraUser{})
+	accountIdGen := didgen.NewDomainIdGenerator(&jiraModels.JiraAccount{})
 	boardIdGen := didgen.NewDomainIdGenerator(&jiraModels.JiraBoard{})
 	boardId := boardIdGen.Generate(data.Options.ConnectionId, data.Options.BoardId)
 
@@ -103,13 +104,13 @@ func ConvertIssues(taskCtx core.SubTaskContext) error {
 				TimeSpentMinutes:        jiraIssue.SpentMinutes,
 			}
 			if jiraIssue.CreatorAccountId != "" {
-				issue.CreatorId = userIdGen.Generate(data.Options.ConnectionId, jiraIssue.CreatorAccountId)
+				issue.CreatorId = accountIdGen.Generate(data.Options.ConnectionId, jiraIssue.CreatorAccountId)
 			}
 			if jiraIssue.CreatorDisplayName != "" {
 				issue.CreatorName = jiraIssue.CreatorDisplayName
 			}
 			if jiraIssue.AssigneeAccountId != "" {
-				issue.AssigneeId = userIdGen.Generate(data.Options.ConnectionId, jiraIssue.AssigneeAccountId)
+				issue.AssigneeId = accountIdGen.Generate(data.Options.ConnectionId, jiraIssue.AssigneeAccountId)
 			}
 			if jiraIssue.AssigneeDisplayName != "" {
 				issue.AssigneeName = jiraIssue.AssigneeDisplayName
diff --git a/plugins/jira/tasks/worklog_convertor.go b/plugins/jira/tasks/worklog_convertor.go
index ded11faa..628e99b4 100644
--- a/plugins/jira/tasks/worklog_convertor.go
+++ b/plugins/jira/tasks/worklog_convertor.go
@@ -18,9 +18,10 @@ limitations under the License.
 package tasks
 
 import (
-	"github.com/apache/incubator-devlake/plugins/core/dal"
 	"reflect"
 
+	"github.com/apache/incubator-devlake/plugins/core/dal"
+
 	"github.com/apache/incubator-devlake/models/domainlayer"
 	"github.com/apache/incubator-devlake/models/domainlayer/didgen"
 	"github.com/apache/incubator-devlake/models/domainlayer/ticket"
@@ -59,7 +60,7 @@ func ConvertWorklogs(taskCtx core.SubTaskContext) error {
 	defer cursor.Close()
 
 	worklogIdGen := didgen.NewDomainIdGenerator(&models.JiraWorklog{})
-	userIdGen := didgen.NewDomainIdGenerator(&models.JiraUser{})
+	accountIdGen := didgen.NewDomainIdGenerator(&models.JiraAccount{})
 	issueIdGen := didgen.NewDomainIdGenerator(&models.JiraIssue{})
 	converter, err := helper.NewDataConverter(helper.DataConverterArgs{
 		RawDataSubTaskArgs: helper.RawDataSubTaskArgs{
@@ -82,7 +83,7 @@ func ConvertWorklogs(taskCtx core.SubTaskContext) error {
 				LoggedDate:       &jiraWorklog.Updated,
 			}
 			if jiraWorklog.AuthorId != "" {
-				worklog.AuthorId = userIdGen.Generate(connectionId, jiraWorklog.AuthorId)
+				worklog.AuthorId = accountIdGen.Generate(connectionId, jiraWorklog.AuthorId)
 			}
 			return []interface{}{worklog}, nil
 		},