Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
performance
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zry
performance
Commits
28e2c18b
Commit
28e2c18b
authored
Jun 10, 2021
by
ruyun.zhang@suvalue.com
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
二次分配结构加载,数据未加载
parent
e743ba6d
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
325 additions
and
19 deletions
+325
-19
performance/Performance.Api/Controllers/SecondAllotController.cs
+18
-1
performance/Performance.Api/wwwroot/Performance.DtoModels.xml
+10
-5
performance/Performance.DtoModels/HandsonTable.cs
+21
-9
performance/Performance.DtoModels/Request/SecondEmpRequest.cs
+8
-0
performance/Performance.DtoModels/TitleValue.cs
+10
-4
performance/Performance.Services/RedistributionService.cs
+258
-0
No files found.
performance/Performance.Api/Controllers/SecondAllotController.cs
View file @
28e2c18b
...
@@ -23,18 +23,21 @@ public class SecondAllotController : ControllerBase
...
@@ -23,18 +23,21 @@ public class SecondAllotController : ControllerBase
private
readonly
SecondAllotService
secondAllotService
;
private
readonly
SecondAllotService
secondAllotService
;
private
readonly
ResultComputeService
resultComputeService
;
private
readonly
ResultComputeService
resultComputeService
;
private
readonly
SecondAllotDetails
secondAllotDetails
;
private
readonly
SecondAllotDetails
secondAllotDetails
;
private
readonly
RedistributionService
_redistributionService
;
public
SecondAllotController
(
public
SecondAllotController
(
ClaimService
claimService
,
ClaimService
claimService
,
SecondAllotService
secondAllotService
,
SecondAllotService
secondAllotService
,
ResultComputeService
resultComputeService
,
ResultComputeService
resultComputeService
,
SecondAllotDetails
secondAllotDetails
SecondAllotDetails
secondAllotDetails
,
RedistributionService
redistributionService
)
)
{
{
this
.
claimService
=
claimService
;
this
.
claimService
=
claimService
;
this
.
secondAllotService
=
secondAllotService
;
this
.
secondAllotService
=
secondAllotService
;
this
.
resultComputeService
=
resultComputeService
;
this
.
resultComputeService
=
resultComputeService
;
this
.
secondAllotDetails
=
secondAllotDetails
;
this
.
secondAllotDetails
=
secondAllotDetails
;
_redistributionService
=
redistributionService
;
}
}
#
region
二次绩效列表、录入数据展示,保存数据
#
region
二次绩效列表、录入数据展示,保存数据
...
@@ -530,5 +533,19 @@ public ApiResponse AutoCompleteBodyData([FromRoute] int secondId, SecondEmployee
...
@@ -530,5 +533,19 @@ public ApiResponse AutoCompleteBodyData([FromRoute] int secondId, SecondEmployee
var
result
=
secondAllotService
.
AutoComplete
(
secondId
,
request
);
var
result
=
secondAllotService
.
AutoComplete
(
secondId
,
request
);
return
new
ApiResponse
(
ResponseType
.
OK
,
result
);
return
new
ApiResponse
(
ResponseType
.
OK
,
result
);
}
}
/// <summary>
/// 二次绩效录入页面
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[
Route
(
"api/second/redistribution"
)]
[
HttpGet
]
public
ApiResponse
Redistribution
([
FromRoute
]
SecondLoadRequest
request
)
{
var
result
=
_redistributionService
.
Load
(
request
.
SecondId
,
request
.
ComputeMode
);
return
new
ApiResponse
(
ResponseType
.
OK
,
result
);
}
}
}
}
}
performance/Performance.Api/wwwroot/Performance.DtoModels.xml
View file @
28e2c18b
...
@@ -3810,24 +3810,29 @@
...
@@ -3810,24 +3810,29 @@
数据集合
数据集合
</summary>
</summary>
</member>
</member>
<member
name=
"T:Performance.DtoModels.TitleValue`
1
"
>
<member
name=
"T:Performance.DtoModels.TitleValue`
2
"
>
<summary>
<summary>
title value
title value
</summary>
</summary>
</member>
</member>
<member
name=
"P:Performance.DtoModels.TitleValue`
1
.Title"
>
<member
name=
"P:Performance.DtoModels.TitleValue`
2
.Title"
>
<summary>
<summary>
Title
Title
</summary>
</summary>
</member>
</member>
<member
name=
"P:Performance.DtoModels.TitleValue`
1
.Value"
>
<member
name=
"P:Performance.DtoModels.TitleValue`
2
.Value"
>
<summary>
<summary>
Value
Value
</summary>
</summary>
</member>
</member>
<member
name=
"P:Performance.DtoModels.TitleValue`1.State"
>
<member
name=
"P:Performance.DtoModels.TitleValue`2.State"
>
<summary>
存储数据
</summary>
</member>
<member
name=
"T:Performance.DtoModels.TitleValue`1"
>
<summary>
<summary>
1、已选,2、未选,3、已被选择
title value
</summary>
</summary>
</member>
</member>
<member
name=
"T:Performance.DtoModels.TitleValue"
>
<member
name=
"T:Performance.DtoModels.TitleValue"
>
...
...
performance/Performance.DtoModels/HandsonTable.cs
View file @
28e2c18b
...
@@ -6,23 +6,35 @@
...
@@ -6,23 +6,35 @@
namespace
Performance.DtoModels
namespace
Performance.DtoModels
{
{
public
class
HandsonTable
public
class
HandsonTableBase
{
public
HandsonTableBase
()
{
ColHeaders
=
new
List
<
string
>();
Columns
=
new
List
<
HandsonColumn
>();
Data
=
new
List
<
Dictionary
<
string
,
string
>>();
NestedHeadersArray
=
new
List
<
List
<
string
>>();
}
public
List
<
string
>
ColHeaders
{
get
;
set
;
}
public
List
<
Dictionary
<
string
,
string
>>
Data
{
get
;
set
;
}
public
List
<
HandsonColumn
>
Columns
{
get
;
set
;
}
public
List
<
List
<
string
>>
NestedHeadersArray
{
get
;
set
;
}
}
public
class
HandsonTable
:
HandsonTableBase
{
{
private
IEnumerable
<
collect_permission
>
_permissions
;
private
IEnumerable
<
collect_permission
>
_permissions
;
private
List
<
Dictionary
<
string
,
string
>>
_data
;
public
HandsonTable
(
int
sheetType
,
string
[]
cols
,
List
<
collect_permission
>
permissions
)
public
HandsonTable
(
int
sheetType
,
string
[]
cols
,
List
<
collect_permission
>
permissions
)
:
base
()
{
{
_permissions
=
permissions
;
_permissions
=
permissions
;
_data
=
new
List
<
Dictionary
<
string
,
string
>>();
InitColHeaders
(
sheetType
,
cols
);
InitColHeaders
(
sheetType
,
cols
);
InitColumns
(
permissions
);
InitColumns
(
permissions
);
}
}
public
string
[]
ColHeaders
{
get
;
private
set
;
}
public
List
<
Dictionary
<
string
,
string
>>
Data
=>
_data
;
public
HandsonColumn
[]
Columns
{
get
;
private
set
;
}
/// <summary>
/// <summary>
///
///
...
@@ -43,7 +55,7 @@ public void SetRowData(IEnumerable<HandsonRowData> datas, bool isTypein)
...
@@ -43,7 +55,7 @@ public void SetRowData(IEnumerable<HandsonRowData> datas, bool isTypein)
else
if
(
dic
.
ContainsKey
(
item
.
Name
.
ToLower
())
&&
_permissions
.
Any
(
w
=>
w
.
HeadName
.
ToLower
()
==
item
.
Name
.
ToLower
()))
else
if
(
dic
.
ContainsKey
(
item
.
Name
.
ToLower
())
&&
_permissions
.
Any
(
w
=>
w
.
HeadName
.
ToLower
()
==
item
.
Name
.
ToLower
()))
dic
[
item
.
Name
.
ToLower
()]
=
item
.
Value
?.
ToString
()
??
""
;
dic
[
item
.
Name
.
ToLower
()]
=
item
.
Value
?.
ToString
()
??
""
;
}
}
_d
ata
.
Add
(
dic
);
D
ata
.
Add
(
dic
);
}
}
}
}
...
@@ -68,7 +80,7 @@ private void InitColHeaders(int sheetType, string[] cols)
...
@@ -68,7 +80,7 @@ private void InitColHeaders(int sheetType, string[] cols)
if
(!
_permissions
.
Any
(
w
=>
w
.
HeadName
.
ToLower
()
==
item
&&
w
.
Visible
==
1
))
if
(!
_permissions
.
Any
(
w
=>
w
.
HeadName
.
ToLower
()
==
item
&&
w
.
Visible
==
1
))
necessitys
.
Remove
(
item
);
necessitys
.
Remove
(
item
);
}
}
ColHeaders
=
necessitys
.
ToArray
()
;
ColHeaders
=
necessitys
;
}
}
private
void
InitColumns
(
List
<
collect_permission
>
permissions
)
private
void
InitColumns
(
List
<
collect_permission
>
permissions
)
...
@@ -80,7 +92,7 @@ private void InitColumns(List<collect_permission> permissions)
...
@@ -80,7 +92,7 @@ private void InitColumns(List<collect_permission> permissions)
var
readnoly
=
_permissions
.
FirstOrDefault
(
f
=>
f
.
HeadName
==
item
)?.
Readnoly
==
1
;
var
readnoly
=
_permissions
.
FirstOrDefault
(
f
=>
f
.
HeadName
==
item
)?.
Readnoly
==
1
;
columns
.
Add
(
new
HandsonColumn
(
item
.
ToLower
(),
readnoly
));
columns
.
Add
(
new
HandsonColumn
(
item
.
ToLower
(),
readnoly
));
}
}
Columns
=
columns
.
ToArray
()
;
Columns
=
columns
;
}
}
private
Dictionary
<
string
,
string
>
CreateDataRow
(
string
key
,
string
value
)
private
Dictionary
<
string
,
string
>
CreateDataRow
(
string
key
,
string
value
)
...
...
performance/Performance.DtoModels/Request/SecondEmpRequest.cs
View file @
28e2c18b
...
@@ -5,6 +5,14 @@
...
@@ -5,6 +5,14 @@
namespace
Performance.DtoModels
namespace
Performance.DtoModels
{
{
public
class
SecondLoadRequest
{
public
int
SecondId
{
get
;
set
;
}
/// <summary>
/// 计算方式:1 不计算 2 横向计算 3 纵向计算
/// </summary>
public
int
ComputeMode
{
get
;
set
;
}
}
public
class
SecondEmployeeRequest
public
class
SecondEmployeeRequest
{
{
public
string
EmployeeName
{
get
;
set
;
}
public
string
EmployeeName
{
get
;
set
;
}
...
...
performance/Performance.DtoModels/TitleValue.cs
View file @
28e2c18b
...
@@ -7,7 +7,7 @@ namespace Performance.DtoModels
...
@@ -7,7 +7,7 @@ namespace Performance.DtoModels
/// <summary>
/// <summary>
/// title value
/// title value
/// </summary>
/// </summary>
public
class
TitleValue
<
T
>
public
class
TitleValue
<
T
V
,
TS
>
{
{
/// <summary>
/// <summary>
/// Title
/// Title
...
@@ -16,11 +16,17 @@ public class TitleValue<T>
...
@@ -16,11 +16,17 @@ public class TitleValue<T>
/// <summary>
/// <summary>
/// Value
/// Value
/// </summary>
/// </summary>
public
T
Value
{
get
;
set
;
}
public
T
V
Value
{
get
;
set
;
}
/// <summary>
/// <summary>
///
1、已选,2、未选,3、已被选择
///
存储数据
/// </summary>
/// </summary>
public
int
State
{
get
;
set
;
}
public
TS
State
{
get
;
set
;
}
}
/// <summary>
/// title value
/// </summary>
public
class
TitleValue
<
T
>
:
TitleValue
<
T
,
int
>
{
}
}
/// <summary>
/// <summary>
/// title value
/// title value
...
...
performance/Performance.Services/RedistributionService.cs
0 → 100644
View file @
28e2c18b
using
AutoMapper
;
using
Performance.DtoModels
;
using
Performance.EntityModels
;
using
Performance.Repository
;
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Text
;
namespace
Performance.Services
{
public
class
RedistributionService
:
IAutoInjection
{
private
readonly
PerforPerallotRepository
_perallotRepository
;
private
readonly
PerforAgsecondallotRepository
_secondallotRepository
;
private
readonly
PerforAgworkloadRepository
_agworkloadRepository
;
public
RedistributionService
(
PerforPerallotRepository
perallotRepository
,
PerforAgsecondallotRepository
secondallotRepository
,
PerforAgworkloadRepository
agworkloadRepository
)
{
_perallotRepository
=
perallotRepository
;
_secondallotRepository
=
secondallotRepository
;
_agworkloadRepository
=
agworkloadRepository
;
}
/// <summary>
///
/// </summary>
/// <param name="secondId"></param>
/// <param name="computeMode">计算方式:1 不计算 2 横向计算 3 纵向计算</param>
/// <returns></returns>
public
HandsonTableBase
Load
(
int
secondId
,
int
computeMode
)
{
var
second
=
_secondallotRepository
.
GetEntity
(
t
=>
t
.
Id
==
secondId
);
if
(
second
==
null
)
throw
new
PerformanceException
(
"参数SecondId无效!"
);
var
allot
=
_perallotRepository
.
GetEntity
(
t
=>
t
.
ID
==
second
.
AllotId
);
if
(
allot
==
null
)
throw
new
PerformanceException
(
"绩效记录不存在!"
);
var
loads
=
GetWorkLoads
(
allot
.
HospitalId
,
second
.
UnitType
,
second
.
Department
);
var
(
colHeaderCustoms
,
columnCustoms
)
=
GetCustomColumns
(
computeMode
,
loads
);
HandsonTableBase
handson
=
new
HandsonTableBase
();
switch
(
computeMode
)
{
case
1
:
handson
=
ComputeMode_Format1
(
colHeaderCustoms
,
columnCustoms
);
break
;
case
2
:
handson
=
ComputeMode_Format2
(
colHeaderCustoms
,
columnCustoms
);
break
;
case
3
:
handson
=
ComputeMode_Format3
(
colHeaderCustoms
,
columnCustoms
,
loads
);
break
;
}
#
region
结构案例
//var colHeaders = new List<string> { "工号", "姓名", "核算单元", "主管", "人员系数", "出勤", "职称", "职称系数", "A班", "P班", "N班", "考核得分", "A班", "P班", "N班", "考核得分", "单项奖励A", "单项奖励B", "夜班绩效", };
//var columns = new List<HandsonColumn>
//{
// new HandsonColumn("WorkNumber"),
// new HandsonColumn("Name"),
// new HandsonColumn("Department"),
// new HandsonColumn("Post"),
// new HandsonColumn("StaffCoefficient"),
// new HandsonColumn("ActualAttendance"),
// new HandsonColumn("JobTitle"),
// new HandsonColumn("TitleCoefficient"),
// new HandsonColumn("Workload_Default_84"),
// new HandsonColumn("Workload_Default_85"),
// new HandsonColumn("Workload_Default_86"),
// new HandsonColumn("AssessmentScore_Default"),
// new HandsonColumn("Workload_101_84"),
// new HandsonColumn("Workload_101_85"),
// new HandsonColumn("Workload_101_86"),
// new HandsonColumn("AssessmentScore_101"),
// new HandsonColumn("SingleAwards_125"),
// new HandsonColumn("SingleAwards_126"),
// new HandsonColumn("SingleAwards_127"),
// new HandsonColumn("NightWorkPerformance"),
//};
//var data = new List<Dictionary<string, string>>
//{
// new Dictionary<string, string>
// {
// { "WorkNumber", "0575" },
// { "Name", "甘永玫" },
// { "Department", "肿瘤科三区" },
// { "Post", "是" },
// { "StaffCoefficient", "1.0000" },
// { "ActualAttendance", "30.0000" },
// { "JobTitle", "主管护师" },
// { "TitleCoefficient", "1.3000" },
// { "Workload_Default_84", "1" },
// { "Workload_Default_85", "2" },
// { "Workload_Default_86", "3" },
// { "AssessmentScore_Default", "100" },
// { "Workload_101_84", "1" },
// { "Workload_101_85", "2" },
// { "Workload_101_86", "3" },
// { "AssessmentScore_101", "99" },
// { "SingleAwards_125", "100" },
// { "SingleAwards_126", "200" },
// { "SingleAwards_127", "300" },
// },
//};
//handson.ColHeaders = colHeaders;
//handson.Columns = columns;
//handson.Data = data;
#
endregion
return
handson
;
}
/// <summary>
/// 动态生成列头信息
/// </summary>
/// <param name="computeMode"></param>
/// <param name="loads"></param>
/// <returns></returns>
private
(
List
<
string
>
colHeaderCustoms
,
List
<
HandsonColumn
>
columnCustoms
)
GetCustomColumns
(
int
computeMode
,
List
<
TitleValue
<
string
,
decimal
?>>
loads
)
{
var
colHeaderCustoms
=
new
List
<
string
>();
var
columnCustoms
=
new
List
<
HandsonColumn
>();
// 工作量
if
(
computeMode
==
2
||
computeMode
==
3
)
{
var
keys
=
loads
.
Where
(
w
=>
w
.
Title
.
StartsWith
(
"AssessmentScore_"
)).
Select
(
w
=>
w
.
Title
.
Replace
(
"AssessmentScore_"
,
""
)).
Distinct
();
foreach
(
var
key
in
keys
)
{
foreach
(
var
item
in
loads
.
Where
(
w
=>
w
.
Title
.
Equals
(
$"AssessmentScore_
{
key
}
"
)
||
w
.
Title
.
StartsWith
(
$"Workload_
{
key
}
_"
)))
{
colHeaderCustoms
.
Add
(
item
.
Value
);
columnCustoms
.
Add
(
new
HandsonColumn
(
item
.
Title
,
format
:
DataFormat
.
小数
));
}
}
}
// 单项奖励
foreach
(
var
awards
in
loads
.
Where
(
w
=>
w
.
Title
.
StartsWith
(
"SingleAwards_"
)))
{
colHeaderCustoms
.
Add
(
awards
.
Value
);
columnCustoms
.
Add
(
new
HandsonColumn
(
awards
.
Title
,
format
:
DataFormat
.
小数
));
}
return
(
colHeaderCustoms
,
columnCustoms
);
}
/// <summary>
/// 获取工作量及单项奖励
/// </summary>
/// <param name="hospitalId"></param>
/// <param name="unitType"></param>
/// <param name="accountingUnit"></param>
/// <returns></returns>
private
List
<
TitleValue
<
string
,
decimal
?>>
GetWorkLoads
(
int
hospitalId
,
string
unitType
,
string
accountingUnit
)
{
var
workloads
=
_agworkloadRepository
.
GetEntities
(
t
=>
t
.
HospitalId
==
hospitalId
&&
t
.
Department
==
accountingUnit
&&
t
.
UnitType
==
unitType
)
??
new
List
<
ag_workload
>();
var
loads
=
workloads
.
OrderBy
(
t
=>
t
.
WorkTypeId
).
ThenBy
(
t
=>
t
.
Sort
)
.
Select
(
t
=>
new
TitleValue
<
string
,
decimal
?>
{
Title
=
t
.
ItemId
,
Value
=
t
.
ItemName
,
State
=
t
.
FactorValue
})
.
ToList
();
return
loads
;
}
/// <summary>
/// 格式生成,不计算,手动录入
/// </summary>
/// <param name="colHeaders"></param>
/// <param name="columns"></param>
/// <returns></returns>
private
HandsonTableBase
ComputeMode_Format1
(
List
<
string
>
colHeaders
,
List
<
HandsonColumn
>
columns
)
{
HandsonTableBase
handson
=
new
HandsonTableBase
();
handson
.
ColHeaders
.
AddRange
(
new
string
[]
{
"工号"
,
"姓名"
,
"核算单元"
,
"主管"
,
"职称绩效"
,
"工作量绩效工资"
,
});
handson
.
Columns
.
AddRange
(
new
HandsonColumn
[]
{
new
HandsonColumn
(
"WorkNumber"
),
new
HandsonColumn
(
"Name"
),
new
HandsonColumn
(
"Department"
),
new
HandsonColumn
(
"Post"
),
new
HandsonColumn
(
"TitlePerformance"
,
format
:
DataFormat
.
小数
),
new
HandsonColumn
(
"WorkPerformance"
,
format
:
DataFormat
.
小数
),
});
handson
.
ColHeaders
.
AddRange
(
colHeaders
);
handson
.
Columns
.
AddRange
(
columns
);
handson
.
ColHeaders
.
AddRange
(
new
string
[]
{
"夜班绩效"
,
});
handson
.
Columns
.
AddRange
(
new
HandsonColumn
[]
{
new
HandsonColumn
(
"NightWorkPerformance"
,
format
:
DataFormat
.
小数
),
});
return
handson
;
}
/// <summary>
/// 格式生成,横向计算,不使用系数
/// </summary>
/// <param name="colHeaders"></param>
/// <param name="columns"></param>
/// <returns></returns>
private
HandsonTableBase
ComputeMode_Format2
(
List
<
string
>
colHeaders
,
List
<
HandsonColumn
>
columns
)
{
HandsonTableBase
handson
=
new
HandsonTableBase
();
handson
.
ColHeaders
.
AddRange
(
new
string
[]
{
"工号"
,
"姓名"
,
"核算单元"
,
"主管"
,
"人员系数"
,
"出勤"
,
"职称"
,
"职称系数"
,
});
handson
.
Columns
.
AddRange
(
new
HandsonColumn
[]
{
new
HandsonColumn
(
"WorkNumber"
),
new
HandsonColumn
(
"Name"
),
new
HandsonColumn
(
"Department"
),
new
HandsonColumn
(
"Post"
),
new
HandsonColumn
(
"StaffCoefficient"
,
format
:
DataFormat
.
小数
),
new
HandsonColumn
(
"ActualAttendance"
,
format
:
DataFormat
.
小数
),
new
HandsonColumn
(
"JobTitle"
),
new
HandsonColumn
(
"TitleCoefficient"
,
format
:
DataFormat
.
小数
),
});
handson
.
ColHeaders
.
AddRange
(
colHeaders
);
handson
.
Columns
.
AddRange
(
columns
);
handson
.
ColHeaders
.
AddRange
(
new
string
[]
{
"夜班绩效"
,
});
handson
.
Columns
.
AddRange
(
new
HandsonColumn
[]
{
new
HandsonColumn
(
"NightWorkPerformance"
,
format
:
DataFormat
.
小数
),
});
return
handson
;
}
/// <summary>
/// 格式生成,纵向计算,使用系数计算
/// </summary>
/// <param name="colHeaders"></param>
/// <param name="columns"></param>
/// <param name="loads"></param>
/// <returns></returns>
private
HandsonTableBase
ComputeMode_Format3
(
List
<
string
>
colHeaders
,
List
<
HandsonColumn
>
columns
,
IEnumerable
<
TitleValue
<
string
,
decimal
?>>
loads
)
{
HandsonTableBase
handson
=
ComputeMode_Format2
(
colHeaders
,
columns
);
var
fs
=
handson
.
Columns
.
Select
(
col
=>
{
var
f
=
loads
.
FirstOrDefault
(
w
=>
w
.
Title
.
StartsWith
(
$"Workload_"
)
&&
w
.
State
.
HasValue
&&
w
.
State
!=
0
&&
w
.
Title
==
col
.
Data
);
return
f
==
null
||
!
f
.
State
.
HasValue
?
""
:
f
.
State
.
Value
.
ToString
(
"F0"
);
});
handson
.
NestedHeadersArray
.
Add
(
handson
.
ColHeaders
);
handson
.
NestedHeadersArray
.
Add
(
fs
.
ToList
());
return
handson
;
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment