Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit ac38550

Browse files
feat: #72 import issue type status
1 parent 5c6734f commit ac38550

File tree

2 files changed

+60
-11
lines changed

2 files changed

+60
-11
lines changed

‎app/Commands/IssueImportCommand.php

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use App\Coding\Iteration;
77
use App\Coding\ProjectSetting;
88
use Exception;
9+
use Illuminate\Support\Arr;
910
use LaravelZero\Framework\Commands\Command;
1011
use Rap2hpoutre\FastExcel\Facades\FastExcel;
1112

@@ -33,9 +34,10 @@ class IssueImportCommand extends Command
3334
*/
3435
protected $description = '导入事项';
3536

36-
protected array $iterationMap = [];
37-
protected array $issueTypes = [];
3837
protected array $issueCodeMap = [];
38+
protected array $issueTypes = [];
39+
protected array $issueTypeStatus = [];
40+
protected array $iterationMap = [];
3941

4042
/**
4143
* Execute the console command.
@@ -83,6 +85,18 @@ private function getIssueTypes(ProjectSetting $projectSetting, array $row): void
8385
}
8486
}
8587

88+
private function getStatusId(ProjectSetting $projectSetting, string $issueType, string $statusChinese): int
89+
{
90+
if (!isset($this->issueTypeStatus[$issueType])) {
91+
$result = $projectSetting->getIssueTypeStatus($this->codingToken, $this->codingProjectUri, $issueType);
92+
foreach ($result as $item) {
93+
$tmp = $item['IssueStatus'];
94+
$this->issueTypeStatus[$issueType][$tmp['Name']] = $tmp['Id'];
95+
}
96+
}
97+
return intval($this->issueTypeStatus[$issueType][$statusChinese]);
98+
}
99+
86100
private function createIssueByRow(ProjectSetting $projectSetting, Issue $issue, Iteration $iteration, array $row)
87101
{
88102
$this->getIssueTypes($projectSetting, $row);
@@ -112,6 +126,9 @@ private function createIssueByRow(ProjectSetting $projectSetting, Issue $issue,
112126
$data[$english] = $row[$chinese];
113127
}
114128
}
129+
if (!empty($row['状态'])) {
130+
$data['StatusId'] = $this->getStatusId($projectSetting, $data['Type'], $row['状态']);
131+
}
115132
$result = $issue->create($this->codingToken, $this->codingProjectUri, $data);
116133
if (isset($row['ID'])) {
117134
$this->issueCodeMap[$row['ID']] = intval($result['Code']);

‎tests/Feature/IssueImportCommandTest.php

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,33 @@ protected function setUp(): void
2626

2727
public function testImportSuccess()
2828
{
29-
$mock = \Mockery::mock(ProjectSetting::class, [])->makePartial();
30-
$this->instance(ProjectSetting::class, $mock);
29+
$projectSettingMock = \Mockery::mock(ProjectSetting::class, [])->makePartial();
30+
$this->instance(ProjectSetting::class, $projectSettingMock);
3131

32-
$mock->shouldReceive('getIssueTypes')->times(1)->andReturn(json_decode(
32+
$projectSettingMock->shouldReceive('getIssueTypes')->times(1)->andReturn(json_decode(
3333
file_get_contents($this->dataDir . 'coding/' . 'DescribeProjectIssueTypeListResponse.json'),
3434
true
3535
)['Response']['IssueTypes']);
36+
$requirementStatus = json_decode(
37+
file_get_contents($this->dataDir . 'coding/' . 'DescribeProjectIssueStatusListResponse.json'),
38+
true
39+
)['Response']['ProjectIssueStatusList'];
40+
$projectSettingMock->shouldReceive('getIssueTypeStatus')->times(5)->andReturn(
41+
$requirementStatus,
42+
$requirementStatus,
43+
[
44+
['IssueStatus' => ['Id' => 11, 'Name' => '已完成']],
45+
['IssueStatus' => ['Id' => 12, 'Name' => '处理中']],
46+
],
47+
[
48+
['IssueStatus' => ['Id' => 11, 'Name' => '未开始']],
49+
['IssueStatus' => ['Id' => 12, 'Name' => '处理中']],
50+
],
51+
[
52+
['IssueStatus' => ['Id' => 22, 'Name' => '处理中']],
53+
['IssueStatus' => ['Id' => 23, 'Name' => '待处理']],
54+
]
55+
);
3656

3757
$issueMock = \Mockery::mock(Issue::class, [])->makePartial();
3858
$this->instance(Issue::class, $issueMock);
@@ -66,13 +86,17 @@ public function testImportSuccess()
6686

6787
public function testImportUserStorySuccess()
6888
{
69-
$mock = \Mockery::mock(ProjectSetting::class, [])->makePartial();
70-
$this->instance(ProjectSetting::class, $mock);
89+
$projectSettingMock = \Mockery::mock(ProjectSetting::class, [])->makePartial();
90+
$this->instance(ProjectSetting::class, $projectSettingMock);
7191

72-
$mock->shouldReceive('getIssueTypes')->times(1)->andReturn(json_decode(
92+
$projectSettingMock->shouldReceive('getIssueTypes')->times(1)->andReturn(json_decode(
7393
file_get_contents($this->dataDir . 'coding/' . 'DescribeProjectIssueTypeListResponse.json'),
7494
true
7595
)['Response']['IssueTypes']);
96+
$projectSettingMock->shouldReceive('getIssueTypeStatus')->times(1)->andReturn(json_decode(
97+
file_get_contents($this->dataDir . 'coding/' . 'DescribeProjectIssueStatusListResponse.json'),
98+
true
99+
)['Response']['ProjectIssueStatusList']);
76100

77101
$issueMock = \Mockery::mock(Issue::class, [])->makePartial();
78102
$this->instance(Issue::class, $issueMock);
@@ -101,6 +125,7 @@ public function testImportUserStorySuccess()
101125
'IterationCode' => 2746,
102126
'DueDate' => '2021年10月21日',
103127
'StoryPoint' => '2',
128+
'StatusId' => 9,
104129
]
105130
])->andReturn($result);
106131

@@ -113,13 +138,17 @@ public function testImportUserStorySuccess()
113138

114139
public function testImportSubTask()
115140
{
116-
$mock = \Mockery::mock(ProjectSetting::class, [])->makePartial();
117-
$this->instance(ProjectSetting::class, $mock);
141+
$projectSettingMock = \Mockery::mock(ProjectSetting::class, [])->makePartial();
142+
$this->instance(ProjectSetting::class, $projectSettingMock);
118143

119-
$mock->shouldReceive('getIssueTypes')->times(1)->andReturn(json_decode(
144+
$projectSettingMock->shouldReceive('getIssueTypes')->times(1)->andReturn(json_decode(
120145
file_get_contents($this->dataDir . 'coding/' . 'DescribeProjectIssueTypeListResponse.json'),
121146
true
122147
)['Response']['IssueTypes']);
148+
$projectSettingMock->shouldReceive('getIssueTypeStatus')->times(2)->andReturn(json_decode(
149+
file_get_contents($this->dataDir . 'coding/' . 'DescribeProjectIssueStatusListResponse.json'),
150+
true
151+
)['Response']['ProjectIssueStatusList']);
123152

124153
$issueMock = \Mockery::mock(Issue::class, [])->makePartial();
125154
$this->instance(Issue::class, $issueMock);
@@ -139,6 +168,7 @@ public function testImportSubTask()
139168
'Name' => '用户可通过手机号注册账户',
140169
'DueDate' => '2021年10月21日',
141170
'StoryPoint' => '2',
171+
'StatusId' => 9,
142172
]
143173
])->andReturn($parentIssue);
144174

@@ -153,6 +183,7 @@ public function testImportSubTask()
153183
'Name' => '完成手机号注册的短信验证码发送接口',
154184
'Priority' => "0",
155185
'ParentCode' => 2742,
186+
'StatusId' => 13,
156187
]
157188
])->andReturn($subTask1);
158189

@@ -167,6 +198,7 @@ public function testImportSubTask()
167198
'Name' => '完成通过手机号注册用户的接口',
168199
'Priority' => "1",
169200
'ParentCode' => 2742,
201+
'StatusId' => 13,
170202
]
171203
])->andReturn($subTask2);
172204

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /