Skip to content

Commit 208ee18

Browse files
committed
feat: #72 import issue type status
1 parent 47fefac commit 208ee18

File tree

2 files changed

+60
-11
lines changed

2 files changed

+60
-11
lines changed

Diff for: app/Commands/IssueImportCommand.php

+19-2
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']);

Diff for: tests/Feature/IssueImportCommandTest.php

+41-9
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)