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
db51957b
Commit
db51957b
authored
Aug 14, 2019
by
李承祥
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
界面日志信息输出
parent
1c089166
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
170 additions
and
48 deletions
+170
-48
performance/Performance.Services/AllotCompute/CheckDataService.cs
+5
-1
performance/Performance.Services/AllotCompute/ImportDataService.cs
+16
-8
performance/Performance.Services/AllotCompute/ProcessComputService.cs
+14
-1
performance/Performance.Services/AllotCompute/ResultComputeService.cs
+8
-2
performance/Performance.Services/AllotService.cs
+28
-14
performance/Performance.Services/ConfigService.cs
+22
-14
performance/Performance.Services/Hubs/AllotLogHub.cs
+14
-3
performance/Performance.Services/LogManageService.cs
+37
-0
performance/Performance.Services/NewExtractService.cs
+26
-5
No files found.
performance/Performance.Services/AllotCompute/CheckDataService.cs
View file @
db51957b
...
@@ -15,16 +15,19 @@ public class CheckDataService : IAutoInjection
...
@@ -15,16 +15,19 @@ public class CheckDataService : IAutoInjection
private
PerforCofcheckRepository
perforCofcheckRepository
;
private
PerforCofcheckRepository
perforCofcheckRepository
;
private
PerforLogcheckRepository
perforLogcheckRepository
;
private
PerforLogcheckRepository
perforLogcheckRepository
;
private
PerforCofdrugtypeRepository
perforCofdrugtypeRepository
;
private
PerforCofdrugtypeRepository
perforCofdrugtypeRepository
;
private
LogManageService
logManageService
;
public
CheckDataService
(
PerSheetService
perSheetService
,
public
CheckDataService
(
PerSheetService
perSheetService
,
PerforCofcheckRepository
perforCofcheckRepository
,
PerforCofcheckRepository
perforCofcheckRepository
,
PerforLogcheckRepository
perforLogcheckRepository
,
PerforLogcheckRepository
perforLogcheckRepository
,
PerforCofdrugtypeRepository
perforCofdrugtypeRepository
PerforCofdrugtypeRepository
perforCofdrugtypeRepository
,
LogManageService
logManageService
)
)
{
{
this
.
perSheetService
=
perSheetService
;
this
.
perSheetService
=
perSheetService
;
this
.
perforCofcheckRepository
=
perforCofcheckRepository
;
this
.
perforCofcheckRepository
=
perforCofcheckRepository
;
this
.
perforLogcheckRepository
=
perforLogcheckRepository
;
this
.
perforLogcheckRepository
=
perforLogcheckRepository
;
this
.
perforCofdrugtypeRepository
=
perforCofdrugtypeRepository
;
this
.
perforCofdrugtypeRepository
=
perforCofdrugtypeRepository
;
this
.
logManageService
=
logManageService
;
}
}
internal
bool
Check
(
PerExcel
excel
,
per_allot
allot
)
internal
bool
Check
(
PerExcel
excel
,
per_allot
allot
)
{
{
...
@@ -232,6 +235,7 @@ public void InsertLog(int allotId, int type, int level, string title, string mes
...
@@ -232,6 +235,7 @@ public void InsertLog(int allotId, int type, int level, string title, string mes
Message
=
message
Message
=
message
};
};
perforLogcheckRepository
.
Add
(
model
);
perforLogcheckRepository
.
Add
(
model
);
logManageService
.
WriteMsg
(
"绩效数据校验"
,
$"
{
title
}
-
{
message
}
"
,
allotId
,
"ReceiveMessage"
);
}
}
#
endregion
#
endregion
}
}
...
...
performance/Performance.Services/AllotCompute/ImportDataService.cs
View file @
db51957b
...
@@ -27,7 +27,8 @@ public class ImportDataService : IAutoInjection
...
@@ -27,7 +27,8 @@ public class ImportDataService : IAutoInjection
private
PerforImemployeeRepository
perforImEmployeeRepository
;
private
PerforImemployeeRepository
perforImEmployeeRepository
;
private
PerforImaccountbasicRepository
perforImaccountbasicRepository
;
private
PerforImaccountbasicRepository
perforImaccountbasicRepository
;
private
PerforImspecialunitRepository
perforImspecialunitRepository
;
private
PerforImspecialunitRepository
perforImspecialunitRepository
;
private
PerforLogdbugRepository
logdbug
;
//private PerforLogdbugRepository logdbug;
private
readonly
LogManageService
logManageService
;
public
ImportDataService
(
PerSheetService
perSheetService
,
public
ImportDataService
(
PerSheetService
perSheetService
,
PerforPersheetRepository
perforPerSheetRepository
,
PerforPersheetRepository
perforPerSheetRepository
,
PerforPerallotRepository
perforPerallotRepository
,
PerforPerallotRepository
perforPerallotRepository
,
...
@@ -36,7 +37,8 @@ public class ImportDataService : IAutoInjection
...
@@ -36,7 +37,8 @@ public class ImportDataService : IAutoInjection
PerforImemployeeRepository
perforImEmployeeRepository
,
PerforImemployeeRepository
perforImEmployeeRepository
,
PerforImaccountbasicRepository
perforImaccountbasicRepository
,
PerforImaccountbasicRepository
perforImaccountbasicRepository
,
PerforImspecialunitRepository
perforImspecialunitRepository
,
PerforImspecialunitRepository
perforImspecialunitRepository
,
PerforLogdbugRepository
logdbug
)
//PerforLogdbugRepository logdbug
LogManageService
logManageService
)
{
{
this
.
perSheetService
=
perSheetService
;
this
.
perSheetService
=
perSheetService
;
this
.
perforPerSheetRepository
=
perforPerSheetRepository
;
this
.
perforPerSheetRepository
=
perforPerSheetRepository
;
...
@@ -46,7 +48,8 @@ public class ImportDataService : IAutoInjection
...
@@ -46,7 +48,8 @@ public class ImportDataService : IAutoInjection
this
.
perforImEmployeeRepository
=
perforImEmployeeRepository
;
this
.
perforImEmployeeRepository
=
perforImEmployeeRepository
;
this
.
perforImaccountbasicRepository
=
perforImaccountbasicRepository
;
this
.
perforImaccountbasicRepository
=
perforImaccountbasicRepository
;
this
.
perforImspecialunitRepository
=
perforImspecialunitRepository
;
this
.
perforImspecialunitRepository
=
perforImspecialunitRepository
;
this
.
logdbug
=
logdbug
;
//this.logdbug = logdbug;
this
.
logManageService
=
logManageService
;
}
}
/// <summary>
/// <summary>
...
@@ -86,7 +89,8 @@ private PerExcel Import(per_allot allot)
...
@@ -86,7 +89,8 @@ private PerExcel Import(per_allot allot)
var
sheet
=
workbook
.
GetSheetAt
(
i
);
var
sheet
=
workbook
.
GetSheetAt
(
i
);
var
sheetType
=
perSheetService
.
GetSheetType
(
sheet
.
SheetName
);
var
sheetType
=
perSheetService
.
GetSheetType
(
sheet
.
SheetName
);
logdbug
.
Add
(
allot
.
ID
,
"开始读取excel文件"
,
JsonHelper
.
Serialize
(
new
{
sheetType
,
Description
=
EnumHelper
.
GetDescription
(
sheetType
),
name
=
sheet
.
SheetName
}));
//logdbug.Add(allot.ID, "开始读取excel文件", JsonHelper.Serialize(new { sheetType, Description = EnumHelper.GetDescription(sheetType), name = sheet.SheetName }));
logManageService
.
WriteMsg
(
"开始读取excel文件"
,
JsonHelper
.
Serialize
(
new
{
sheetType
,
Description
=
EnumHelper
.
GetDescription
(
sheetType
),
name
=
sheet
.
SheetName
}),
allot
.
ID
,
"ReceiveMessage"
,
true
);
if
(
SheetType
.
Unidentifiable
!=
sheetType
)
if
(
SheetType
.
Unidentifiable
!=
sheetType
)
{
{
var
st
=
perSheetService
.
Sheet
(
sheet
);
var
st
=
perSheetService
.
Sheet
(
sheet
);
...
@@ -233,22 +237,26 @@ private bool Save(PerExcel excel, int allotId)
...
@@ -233,22 +237,26 @@ private bool Save(PerExcel excel, int allotId)
{
{
if
(
sheet
.
SheetType
==
SheetType
.
Employee
)
if
(
sheet
.
SheetType
==
SheetType
.
Employee
)
{
{
logdbug
.
Add
(
allotId
,
"开始保存人员数据数据"
,
sheet
.
SheetName
);
//logdbug.Add(allotId, "开始保存人员数据数据", sheet.SheetName);
logManageService
.
WriteMsg
(
"保存基础数据"
,
"开始保存人员数据数据"
,
allotId
,
"ReceiveMessage"
,
true
);
SaveEmployee
(
sheet
,
allotId
);
SaveEmployee
(
sheet
,
allotId
);
}
}
else
if
(
sheet
.
SheetType
==
SheetType
.
AccountBasic
)
else
if
(
sheet
.
SheetType
==
SheetType
.
AccountBasic
)
{
{
logdbug
.
Add
(
allotId
,
"开始保存临床科室医护绩效测算基础数据"
,
sheet
.
SheetName
);
//logdbug.Add(allotId, "开始保存临床科室医护绩效测算基础数据", sheet.SheetName);
logManageService
.
WriteMsg
(
"保存基础数据"
,
"开始保存临床科室医护绩效测算基础数据"
,
allotId
,
"ReceiveMessage"
,
true
);
SaveAccountBasic
(
sheet
,
allotId
);
SaveAccountBasic
(
sheet
,
allotId
);
}
}
else
if
(
sheet
.
SheetType
==
SheetType
.
SpecialUnit
)
else
if
(
sheet
.
SheetType
==
SheetType
.
SpecialUnit
)
{
{
logdbug
.
Add
(
allotId
,
"开始保存特殊核算单元数据"
,
sheet
.
SheetName
);
//logdbug.Add(allotId, "开始保存特殊核算单元数据", sheet.SheetName);
logManageService
.
WriteMsg
(
"保存基础数据"
,
"开始保存特殊核算单元数据"
,
allotId
,
"ReceiveMessage"
,
true
);
SaveSpecialUnit
(
sheet
,
allotId
);
SaveSpecialUnit
(
sheet
,
allotId
);
}
}
else
else
{
{
logdbug
.
Add
(
allotId
,
"开始保存统一格式数据"
,
sheet
.
SheetName
);
//logdbug.Add(allotId, "开始保存统一格式数据", sheet.SheetName);
logManageService
.
WriteMsg
(
"保存基础数据"
,
$"开始保存
{
sheet
.
SheetName
}
数据"
,
allotId
,
"ReceiveMessage"
,
true
);
SaveCommon
(
sheet
,
allotId
);
SaveCommon
(
sheet
,
allotId
);
}
}
}
}
...
...
performance/Performance.Services/AllotCompute/ProcessComputService.cs
View file @
db51957b
...
@@ -25,6 +25,7 @@ public class ProcessComputService : IAutoInjection
...
@@ -25,6 +25,7 @@ public class ProcessComputService : IAutoInjection
private
PerforResaccountRepository
perforResaccountRepository
;
private
PerforResaccountRepository
perforResaccountRepository
;
private
PerforResbaiscnormRepository
perforResbaiscnormRepository
;
private
PerforResbaiscnormRepository
perforResbaiscnormRepository
;
private
PerforCofdrugtypeRepository
perforCofdrugtypeRepository
;
private
PerforCofdrugtypeRepository
perforCofdrugtypeRepository
;
private
readonly
LogManageService
logManageService
;
public
ProcessComputService
(
PerforCofincomeRepository
perforCofincomeRepository
,
public
ProcessComputService
(
PerforCofincomeRepository
perforCofincomeRepository
,
PerforCofdrugpropRepository
perforCofdrugpropRepository
,
PerforCofdrugpropRepository
perforCofdrugpropRepository
,
PerforPersheetRepository
perforPerSheetRepository
,
PerforPersheetRepository
perforPerSheetRepository
,
...
@@ -33,7 +34,8 @@ public class ProcessComputService : IAutoInjection
...
@@ -33,7 +34,8 @@ public class ProcessComputService : IAutoInjection
PerforImemployeeRepository
perforImEmployeeRepository
,
PerforImemployeeRepository
perforImEmployeeRepository
,
PerforResaccountRepository
perforResaccountRepository
,
PerforResaccountRepository
perforResaccountRepository
,
PerforResbaiscnormRepository
perforResbaiscnormRepository
,
PerforResbaiscnormRepository
perforResbaiscnormRepository
,
PerforCofdrugtypeRepository
perforCofdrugtypeRepository
)
PerforCofdrugtypeRepository
perforCofdrugtypeRepository
,
LogManageService
logManageService
)
{
{
this
.
perforCofincomeRepository
=
perforCofincomeRepository
;
this
.
perforCofincomeRepository
=
perforCofincomeRepository
;
this
.
perforCofdrugpropRepository
=
perforCofdrugpropRepository
;
this
.
perforCofdrugpropRepository
=
perforCofdrugpropRepository
;
...
@@ -44,6 +46,7 @@ public class ProcessComputService : IAutoInjection
...
@@ -44,6 +46,7 @@ public class ProcessComputService : IAutoInjection
this
.
perforResaccountRepository
=
perforResaccountRepository
;
this
.
perforResaccountRepository
=
perforResaccountRepository
;
this
.
perforResbaiscnormRepository
=
perforResbaiscnormRepository
;
this
.
perforResbaiscnormRepository
=
perforResbaiscnormRepository
;
this
.
perforCofdrugtypeRepository
=
perforCofdrugtypeRepository
;
this
.
perforCofdrugtypeRepository
=
perforCofdrugtypeRepository
;
this
.
logManageService
=
logManageService
;
}
}
/// <summary>
/// <summary>
...
@@ -160,6 +163,7 @@ private void Save(List<PerSheet> perSheets, int allotId)
...
@@ -160,6 +163,7 @@ private void Save(List<PerSheet> perSheets, int allotId)
{
{
foreach
(
var
sheet
in
perSheets
)
foreach
(
var
sheet
in
perSheets
)
{
{
logManageService
.
WriteMsg
(
"正在生成绩效"
,
$"保存核算数据 -
{
sheet
.
SheetName
}
"
,
allotId
,
"ReceiveMessage"
);
if
(
sheet
.
SheetType
==
SheetType
.
ComputeDoctorAccount
)
if
(
sheet
.
SheetType
==
SheetType
.
ComputeDoctorAccount
)
{
{
SaveComputeDoctorAccount
(
sheet
,
allotId
);
SaveComputeDoctorAccount
(
sheet
,
allotId
);
...
@@ -187,25 +191,31 @@ private List<PerSheet> MergeCompute(PerExcel excel, int allotid)
...
@@ -187,25 +191,31 @@ private List<PerSheet> MergeCompute(PerExcel excel, int allotid)
//合并科室收入、支出
//合并科室收入、支出
var
incomeconfs
=
perforCofincomeRepository
.
GetEntities
();
var
incomeconfs
=
perforCofincomeRepository
.
GetEntities
();
var
economicCompute
=
new
PerSheetDataComputeEconomic
();
var
economicCompute
=
new
PerSheetDataComputeEconomic
();
logManageService
.
WriteMsg
(
"正在生成绩效"
,
"计算科室经济核算汇总表"
,
allotid
,
"ReceiveMessage"
);
var
mergeResult
=
economicCompute
.
MergeCompute
(
excel
,
incomeconfs
);
var
mergeResult
=
economicCompute
.
MergeCompute
(
excel
,
incomeconfs
);
//一次计算
//一次计算
logManageService
.
WriteMsg
(
"正在生成绩效"
,
"计算科室经济核算汇总表 -- 第一次计算"
,
allotid
,
"ReceiveMessage"
);
var
onceEconomic
=
economicCompute
.
OnceCompute
(
mergeResult
);
var
onceEconomic
=
economicCompute
.
OnceCompute
(
mergeResult
);
//二次计算
//二次计算
logManageService
.
WriteMsg
(
"正在生成绩效"
,
"计算科室经济核算汇总表 -- 第二次计算"
,
allotid
,
"ReceiveMessage"
);
var
twiceEconomicResult
=
economicCompute
.
TwiceCompute
(
onceEconomic
);
var
twiceEconomicResult
=
economicCompute
.
TwiceCompute
(
onceEconomic
);
twiceEconomicResult
.
Sheet
.
SheetType
=
SheetType
.
ComputeEconomic
;
twiceEconomicResult
.
Sheet
.
SheetType
=
SheetType
.
ComputeEconomic
;
perSheet
.
Add
(
twiceEconomicResult
.
Sheet
);
perSheet
.
Add
(
twiceEconomicResult
.
Sheet
);
logManageService
.
WriteMsg
(
"正在生成绩效"
,
"计算科室经济核算汇总表 -- 计算完成"
,
allotid
,
"ReceiveMessage"
);
//工作量
//工作量
var
workloadCompute
=
new
PerSheetDataComputeWorkload
();
var
workloadCompute
=
new
PerSheetDataComputeWorkload
();
var
workload1
=
excel
.
PerSheet
.
FirstOrDefault
(
t
=>
t
.
SheetType
==
SheetType
.
Workload
&&
t
.
SheetName
.
Contains
(
"医生组"
));
var
workload1
=
excel
.
PerSheet
.
FirstOrDefault
(
t
=>
t
.
SheetType
==
SheetType
.
Workload
&&
t
.
SheetName
.
Contains
(
"医生组"
));
workload1
.
SheetName
=
"医生组工作量绩效测算表"
;
workload1
.
SheetName
=
"医生组工作量绩效测算表"
;
logManageService
.
WriteMsg
(
"正在生成绩效"
,
"获取药品费用分割比例"
,
allotid
,
"ReceiveMessage"
);
var
confs
=
GetDrugConfig
(
excel
,
allotid
);
var
confs
=
GetDrugConfig
(
excel
,
allotid
);
//医生组 一次计算
//医生组 一次计算
//var onceWorkload1 = workloadCompute.OnceCompute(workload1, confs);
//var onceWorkload1 = workloadCompute.OnceCompute(workload1, confs);
//医生组 二次计算
//医生组 二次计算
logManageService
.
WriteMsg
(
"正在生成绩效"
,
"医生组工作量计算"
,
allotid
,
"ReceiveMessage"
);
var
twiceWorkloadResult1
=
workloadCompute
.
TwiceCompute
(
workload1
);
var
twiceWorkloadResult1
=
workloadCompute
.
TwiceCompute
(
workload1
);
twiceWorkloadResult1
.
Sheet
.
SheetType
=
SheetType
.
ComputeDoctorWorkload
;
twiceWorkloadResult1
.
Sheet
.
SheetType
=
SheetType
.
ComputeDoctorWorkload
;
...
@@ -216,6 +226,7 @@ private List<PerSheet> MergeCompute(PerExcel excel, int allotid)
...
@@ -216,6 +226,7 @@ private List<PerSheet> MergeCompute(PerExcel excel, int allotid)
//护理组 一次计算
//护理组 一次计算
//var onceWorkload2 = workloadCompute.OnceCompute(workload2);
//var onceWorkload2 = workloadCompute.OnceCompute(workload2);
//护理组 二次计算
//护理组 二次计算
logManageService
.
WriteMsg
(
"正在生成绩效"
,
"护理组工作量计算"
,
allotid
,
"ReceiveMessage"
);
var
twiceWorkloadResult2
=
workloadCompute
.
TwiceCompute
(
workload2
);
var
twiceWorkloadResult2
=
workloadCompute
.
TwiceCompute
(
workload2
);
twiceWorkloadResult2
.
Sheet
.
SheetType
=
SheetType
.
ComputeNurseWorkload
;
twiceWorkloadResult2
.
Sheet
.
SheetType
=
SheetType
.
ComputeNurseWorkload
;
...
@@ -224,8 +235,10 @@ private List<PerSheet> MergeCompute(PerExcel excel, int allotid)
...
@@ -224,8 +235,10 @@ private List<PerSheet> MergeCompute(PerExcel excel, int allotid)
var
deptAccounting
=
excel
.
PerSheet
.
FirstOrDefault
(
t
=>
t
.
SheetType
==
SheetType
.
AccountBasic
);
var
deptAccounting
=
excel
.
PerSheet
.
FirstOrDefault
(
t
=>
t
.
SheetType
==
SheetType
.
AccountBasic
);
var
dataList
=
deptAccounting
.
PerData
.
Select
(
t
=>
(
PerDataAccountBaisc
)
t
);
var
dataList
=
deptAccounting
.
PerData
.
Select
(
t
=>
(
PerDataAccountBaisc
)
t
);
logManageService
.
WriteMsg
(
"正在生成绩效"
,
"计算保底绩效参考标准"
,
allotid
,
"ReceiveMessage"
);
var
baiscnormList
=
ComputeMinimum
(
dataList
,
twiceEconomicResult
.
PerData
,
twiceWorkloadResult1
.
PerData
,
twiceWorkloadResult2
.
PerData
,
allotid
);
var
baiscnormList
=
ComputeMinimum
(
dataList
,
twiceEconomicResult
.
PerData
,
twiceWorkloadResult1
.
PerData
,
twiceWorkloadResult2
.
PerData
,
allotid
);
logManageService
.
WriteMsg
(
"正在生成绩效"
,
"计算科室绩效"
,
allotid
,
"ReceiveMessage"
);
var
sheet
=
Compute
(
dataList
,
twiceEconomicResult
.
PerData
,
twiceWorkloadResult1
.
PerData
,
twiceWorkloadResult2
.
PerData
,
baiscnormList
);
var
sheet
=
Compute
(
dataList
,
twiceEconomicResult
.
PerData
,
twiceWorkloadResult1
.
PerData
,
twiceWorkloadResult2
.
PerData
,
baiscnormList
);
perSheet
.
AddRange
(
sheet
);
perSheet
.
AddRange
(
sheet
);
...
...
performance/Performance.Services/AllotCompute/ResultComputeService.cs
View file @
db51957b
...
@@ -22,6 +22,7 @@ public class ResultComputeService : IAutoInjection
...
@@ -22,6 +22,7 @@ public class ResultComputeService : IAutoInjection
private
readonly
PerforResbaiscnormRepository
perforResbaiscnormRepository
;
private
readonly
PerforResbaiscnormRepository
perforResbaiscnormRepository
;
private
readonly
PerforResspecialunitRepository
perforResspecialunitRepository
;
private
readonly
PerforResspecialunitRepository
perforResspecialunitRepository
;
private
readonly
PerforImaccountbasicRepository
perforImaccountbasicRepository
;
private
readonly
PerforImaccountbasicRepository
perforImaccountbasicRepository
;
private
readonly
LogManageService
logManageService
;
public
ResultComputeService
(
public
ResultComputeService
(
PerforImemployeeRepository
perforImEmployeeRepository
,
PerforImemployeeRepository
perforImEmployeeRepository
,
...
@@ -29,7 +30,8 @@ public class ResultComputeService : IAutoInjection
...
@@ -29,7 +30,8 @@ public class ResultComputeService : IAutoInjection
PerforResbaiscnormRepository
perforResbaiscnormRepository
,
PerforResbaiscnormRepository
perforResbaiscnormRepository
,
PerforResspecialunitRepository
perforResspecialunitRepository
,
PerforResspecialunitRepository
perforResspecialunitRepository
,
PerforImaccountbasicRepository
perforImaccountbasicRepository
,
PerforImaccountbasicRepository
perforImaccountbasicRepository
,
BaiscNormService
baiscNormService
,
ComputeDirector
computeDirector
)
BaiscNormService
baiscNormService
,
ComputeDirector
computeDirector
,
LogManageService
logManageService
)
{
{
this
.
baiscNormService
=
baiscNormService
;
this
.
baiscNormService
=
baiscNormService
;
this
.
computeDirector
=
computeDirector
;
this
.
computeDirector
=
computeDirector
;
...
@@ -38,6 +40,7 @@ public class ResultComputeService : IAutoInjection
...
@@ -38,6 +40,7 @@ public class ResultComputeService : IAutoInjection
this
.
perforResbaiscnormRepository
=
perforResbaiscnormRepository
;
this
.
perforResbaiscnormRepository
=
perforResbaiscnormRepository
;
this
.
perforResspecialunitRepository
=
perforResspecialunitRepository
;
this
.
perforResspecialunitRepository
=
perforResspecialunitRepository
;
this
.
perforImaccountbasicRepository
=
perforImaccountbasicRepository
;
this
.
perforImaccountbasicRepository
=
perforImaccountbasicRepository
;
this
.
logManageService
=
logManageService
;
}
}
/// <summary>
/// <summary>
...
@@ -51,13 +54,15 @@ public List<res_baiscnorm> Compute(per_allot allot, PerExcel excel, List<PerShee
...
@@ -51,13 +54,15 @@ public List<res_baiscnorm> Compute(per_allot allot, PerExcel excel, List<PerShee
var
accountbasicList
=
perforImaccountbasicRepository
.
GetEntities
(
t
=>
t
.
AllotID
==
allot
.
ID
);
var
accountbasicList
=
perforImaccountbasicRepository
.
GetEntities
(
t
=>
t
.
AllotID
==
allot
.
ID
);
List
<
ComputeEmployee
>
computeEmployees
=
Mapper
.
Map
<
List
<
ComputeEmployee
>>(
empolyeeList
);
List
<
ComputeEmployee
>
computeEmployees
=
Mapper
.
Map
<
List
<
ComputeEmployee
>>(
empolyeeList
);
logManageService
.
WriteMsg
(
"正在生成绩效"
,
"临床科室主任、临床科室副主任、临床科室护士长 最终绩效数据计算"
,
allot
.
ID
,
"ReceiveMessage"
);
var
computResult
=
computeDirector
.
Compute
(
computeEmployees
,
accountbasicList
,
allot
);
var
computResult
=
computeDirector
.
Compute
(
computeEmployees
,
accountbasicList
,
allot
);
//计算 绩效标准 基数(科主任、副主任、护士长 =>> 平均值)
//计算 绩效标准 基数(科主任、副主任、护士长 =>> 平均值)
List
<
res_baiscnorm
>
baiscnormList
=
new
List
<
res_baiscnorm
>();
List
<
res_baiscnorm
>
baiscnormList
=
new
List
<
res_baiscnorm
>();
baiscNormService
.
ComputeAvg
(
baiscnormList
,
accountbasicList
,
computResult
);
baiscNormService
.
ComputeAvg
(
baiscnormList
,
accountbasicList
,
computResult
);
baiscNormService
.
DocterNurseBaiscnorm
(
baiscnormList
,
accountbasicList
,
perSheets
);
baiscNormService
.
DocterNurseBaiscnorm
(
baiscnormList
,
accountbasicList
,
perSheets
);
logManageService
.
WriteMsg
(
"正在生成绩效"
,
"院领导、业务中层、工勤人员 最终绩效数据计算"
,
allot
.
ID
,
"ReceiveMessage"
);
var
computResult2
=
computeDirector
.
Compute
(
computeEmployees
,
allot
,
baiscnormList
);
var
computResult2
=
computeDirector
.
Compute
(
computeEmployees
,
allot
,
baiscnormList
);
//计算 行政人员 平均值
//计算 行政人员 平均值
baiscNormService
.
ComputeOtherAvg
(
baiscnormList
,
computResult2
,
empolyeeList
);
baiscNormService
.
ComputeOtherAvg
(
baiscnormList
,
computResult2
,
empolyeeList
);
...
@@ -68,6 +73,7 @@ public List<res_baiscnorm> Compute(per_allot allot, PerExcel excel, List<PerShee
...
@@ -68,6 +73,7 @@ public List<res_baiscnorm> Compute(per_allot allot, PerExcel excel, List<PerShee
perforRescomputeRepository
.
AddRange
(
computes
.
ToArray
());
perforRescomputeRepository
.
AddRange
(
computes
.
ToArray
());
baiscnormList
.
ForEach
(
t
=>
t
.
AllotID
=
allot
.
ID
);
baiscnormList
.
ForEach
(
t
=>
t
.
AllotID
=
allot
.
ID
);
logManageService
.
WriteMsg
(
"正在生成绩效"
,
"保存最终绩效数据"
,
allot
.
ID
,
"ReceiveMessage"
);
perforResbaiscnormRepository
.
AddRange
(
baiscnormList
.
ToArray
());
perforResbaiscnormRepository
.
AddRange
(
baiscnormList
.
ToArray
());
return
baiscnormList
;
return
baiscnormList
;
...
...
performance/Performance.Services/AllotService.cs
View file @
db51957b
...
@@ -24,7 +24,7 @@ public class AllotService : IAutoInjection
...
@@ -24,7 +24,7 @@ public class AllotService : IAutoInjection
private
ImportDataService
importDataService
;
private
ImportDataService
importDataService
;
private
ProcessComputService
processComputService
;
private
ProcessComputService
processComputService
;
private
ResultComputeService
resultComputeService
;
private
ResultComputeService
resultComputeService
;
private
PerforLogdbugRepository
logdbug
;
//
private PerforLogdbugRepository logdbug;
private
ConfigService
configService
;
private
ConfigService
configService
;
private
IHostingEnvironment
_evn
;
private
IHostingEnvironment
_evn
;
...
@@ -35,7 +35,8 @@ public class AllotService : IAutoInjection
...
@@ -35,7 +35,8 @@ public class AllotService : IAutoInjection
private
PerforPeragainallotRepository
_againallotRepository
;
private
PerforPeragainallotRepository
_againallotRepository
;
private
PerforLogcheckRepository
perforLogcheckRepository
;
private
PerforLogcheckRepository
perforLogcheckRepository
;
private
readonly
PerforHospitalRepository
perforHospitalRepository
;
private
readonly
PerforHospitalRepository
perforHospitalRepository
;
private
readonly
IHubContext
<
AllotLogHub
>
hubContext
;
//private readonly IHubContext<AllotLogHub> hubContext;
private
readonly
LogManageService
logManageService
;
public
AllotService
(
PerforPerallotRepository
allotRepository
,
public
AllotService
(
PerforPerallotRepository
allotRepository
,
BaiscNormService
baiscNormService
,
BaiscNormService
baiscNormService
,
...
@@ -44,14 +45,15 @@ public class AllotService : IAutoInjection
...
@@ -44,14 +45,15 @@ public class AllotService : IAutoInjection
ProcessComputService
processComputService
,
ProcessComputService
processComputService
,
ResultComputeService
resultComputeService
,
ResultComputeService
resultComputeService
,
ConfigService
configService
,
ConfigService
configService
,
PerforLogdbugRepository
logdbug
,
//
PerforLogdbugRepository logdbug,
IHostingEnvironment
evn
,
ILogger
<
AllotService
>
logger
,
IHostingEnvironment
evn
,
ILogger
<
AllotService
>
logger
,
IEmailService
emailService
,
IEmailService
emailService
,
IOptions
<
Application
>
options
,
IOptions
<
Application
>
options
,
PerforPeragainallotRepository
againallotRepository
,
PerforPeragainallotRepository
againallotRepository
,
PerforLogcheckRepository
perforLogcheckRepository
,
PerforLogcheckRepository
perforLogcheckRepository
,
PerforHospitalRepository
perforHospitalRepository
,
PerforHospitalRepository
perforHospitalRepository
,
IHubContext
<
AllotLogHub
>
hubContext
)
//IHubContext<AllotLogHub> hubContext
LogManageService
logManageService
)
{
{
_allotRepository
=
allotRepository
;
_allotRepository
=
allotRepository
;
_againallotRepository
=
againallotRepository
;
_againallotRepository
=
againallotRepository
;
...
@@ -65,10 +67,11 @@ public class AllotService : IAutoInjection
...
@@ -65,10 +67,11 @@ public class AllotService : IAutoInjection
this
.
emailService
=
emailService
;
this
.
emailService
=
emailService
;
this
.
options
=
options
;
this
.
options
=
options
;
this
.
configService
=
configService
;
this
.
configService
=
configService
;
this
.
logdbug
=
logdbug
;
//
this.logdbug = logdbug;
this
.
perforLogcheckRepository
=
perforLogcheckRepository
;
this
.
perforLogcheckRepository
=
perforLogcheckRepository
;
this
.
perforHospitalRepository
=
perforHospitalRepository
;
this
.
perforHospitalRepository
=
perforHospitalRepository
;
this
.
hubContext
=
hubContext
;
//this.hubContext = hubContext;
this
.
logManageService
=
logManageService
;
}
}
#
region
基础功能
#
region
基础功能
...
@@ -212,41 +215,52 @@ public void Generate(per_allot allot, string mail)
...
@@ -212,41 +215,52 @@ public void Generate(per_allot allot, string mail)
DateTime
time
=
DateTime
.
Now
;
DateTime
time
=
DateTime
.
Now
;
try
try
{
{
hubContext
.
Clients
.
Group
(
"aaaa"
).
SendAsync
(
"ReceiveMessage"
,
"绩效开始执行"
,
"绩效开始执行"
);
//hubContext.Clients.Group("aaaa").SendAsync("ReceiveMessage", "绩效开始执行", "绩效开始执行");
logdbug
.
Add
(
allot
.
ID
,
"绩效开始执行"
,
JsonHelper
.
Serialize
(
allot
));
//logdbug.Add(allot.ID, "绩效开始执行", JsonHelper.Serialize(allot));
logManageService
.
WriteMsg
(
"绩效开始执行"
,
JsonHelper
.
Serialize
(
allot
),
allot
.
ID
,
"ReceiveMessage"
,
true
);
configService
.
Clear
(
allot
.
ID
);
configService
.
Clear
(
allot
.
ID
);
UpdateAllotStates
(
allot
.
ID
,
(
int
)
AllotStates
.
InCheckData
,
EnumHelper
.
GetDescription
(
AllotStates
.
InCheckData
));
// 导出数据
// 导出数据
var
excel
=
importDataService
.
ReadDataAndSave
(
allot
);
var
excel
=
importDataService
.
ReadDataAndSave
(
allot
);
UpdateAllotStates
(
allot
.
ID
,
(
int
)
AllotStates
.
InCheckData
,
EnumHelper
.
GetDescription
(
AllotStates
.
InCheckData
));
if
(!
checkDataService
.
Check
(
excel
,
allot
))
if
(!
checkDataService
.
Check
(
excel
,
allot
))
{
{
UpdateAllotStates
(
allot
.
ID
,
(
int
)
AllotStates
.
CheckFail
,
EnumHelper
.
GetDescription
(
AllotStates
.
CheckFail
));
UpdateAllotStates
(
allot
.
ID
,
(
int
)
AllotStates
.
CheckFail
,
EnumHelper
.
GetDescription
(
AllotStates
.
CheckFail
));
SendEmail
(
allot
,
mail
,
3
,
time
);
SendEmail
(
allot
,
mail
,
3
,
time
);
logdbug
.
Add
(
allot
.
ID
,
"绩效数据校验失败"
,
JsonHelper
.
Serialize
(
allot
));
//logdbug.Add(allot.ID, "绩效数据校验失败", JsonHelper.Serialize(allot));
logManageService
.
WriteMsg
(
"绩效数据校验失败"
,
JsonHelper
.
Serialize
(
allot
),
allot
.
ID
,
"ReceiveMessage"
,
true
);
return
;
return
;
}
}
UpdateAllotStates
(
allot
.
ID
,
(
int
)
AllotStates
.
InGenerate
,
EnumHelper
.
GetDescription
(
AllotStates
.
InGenerate
));
UpdateAllotStates
(
allot
.
ID
,
(
int
)
AllotStates
.
InGenerate
,
EnumHelper
.
GetDescription
(
AllotStates
.
InGenerate
));
// 计算合并数据
// 计算合并数据
logdbug
.
Add
(
allot
.
ID
,
"计算合并数据"
,
JsonHelper
.
Serialize
(
allot
));
//logdbug.Add(allot.ID, "计算合并数据", JsonHelper.Serialize(allot));
logManageService
.
WriteMsg
(
"正在生成绩效"
,
"计算合并数据"
,
allot
.
ID
,
"ReceiveMessage"
,
true
);
List
<
PerSheet
>
list
=
processComputService
.
MergeAndSave
(
excel
,
allot
);
List
<
PerSheet
>
list
=
processComputService
.
MergeAndSave
(
excel
,
allot
);
//var baiscnorm = baiscNormService.NurseBaiscnorm(list);
//var baiscnorm = baiscNormService.NurseBaiscnorm(list);
//logdbug.Add(allot.ID, "护士平均绩效", JsonHelper.Serialize(baiscnorm));
//logdbug.Add(allot.ID, "护士平均绩效", JsonHelper.Serialize(baiscnorm));
// 计算最总数据
// 计算最总数据
logdbug
.
Add
(
allot
.
ID
,
"绩效结果计算数据开始"
,
""
);
//logdbug.Add(allot.ID, "绩效结果计算数据开始", "");
logManageService
.
WriteMsg
(
"正在生成绩效"
,
"计算最终绩效数据"
,
allot
.
ID
,
"ReceiveMessage"
,
true
);
var
baiscnormList
=
resultComputeService
.
Compute
(
allot
,
excel
,
list
);
var
baiscnormList
=
resultComputeService
.
Compute
(
allot
,
excel
,
list
);
logManageService
.
WriteMsg
(
"正在生成绩效"
,
"计算最终特殊科室绩效数据"
,
allot
.
ID
,
"ReceiveMessage"
,
true
);
resultComputeService
.
SpecialUnitCompute
(
excel
,
allot
,
baiscnormList
);
resultComputeService
.
SpecialUnitCompute
(
excel
,
allot
,
baiscnormList
);
logManageService
.
WriteMsg
(
"正在生成绩效"
,
"保存最终特殊科室绩效数据"
,
allot
.
ID
,
"ReceiveMessage"
,
true
);
UpdateAllotStates
(
allot
.
ID
,
(
int
)
AllotStates
.
GenerateSucceed
,
EnumHelper
.
GetDescription
(
AllotStates
.
GenerateSucceed
));
UpdateAllotStates
(
allot
.
ID
,
(
int
)
AllotStates
.
GenerateSucceed
,
EnumHelper
.
GetDescription
(
AllotStates
.
GenerateSucceed
));
//发送邮件
//发送邮件
SendEmail
(
allot
,
mail
,
1
,
time
);
SendEmail
(
allot
,
mail
,
1
,
time
);
logdbug
.
Add
(
allot
.
ID
,
"绩效开始执行"
,
"绩效生成成功"
);
//logdbug.Add(allot.ID, "绩效开始执行", "绩效生成成功");
logManageService
.
WriteMsg
(
"绩效生成结束"
,
"绩效生成成功"
,
allot
.
ID
,
"ReceiveMessage"
,
true
);
}
}
catch
(
Exception
ex
)
catch
(
Exception
ex
)
{
{
UpdateAllotStates
(
allot
.
ID
,
(
int
)
AllotStates
.
GenerateFail
,
EnumHelper
.
GetDescription
(
AllotStates
.
GenerateFail
));
UpdateAllotStates
(
allot
.
ID
,
(
int
)
AllotStates
.
GenerateFail
,
EnumHelper
.
GetDescription
(
AllotStates
.
GenerateFail
));
SendEmail
(
allot
,
mail
,
2
,
time
);
SendEmail
(
allot
,
mail
,
2
,
time
);
logdbug
.
Add
(
allot
.
ID
,
"绩效开始执行"
,
ex
.
ToString
());
//logdbug.Add(allot.ID, "绩效开始执行", ex.ToString());
logManageService
.
WriteMsg
(
"绩效生成失败"
,
ex
.
ToString
(),
allot
.
ID
,
"ReceiveMessage"
,
true
);
//throw ex;
//throw ex;
}
}
}
}
...
...
performance/Performance.Services/ConfigService.cs
View file @
db51957b
...
@@ -13,6 +13,7 @@ namespace Performance.Services
...
@@ -13,6 +13,7 @@ namespace Performance.Services
{
{
public
class
ConfigService
:
IAutoInjection
public
class
ConfigService
:
IAutoInjection
{
{
#
region
private
PerforCofdirectorRepository
_directorRepository
;
private
PerforCofdirectorRepository
_directorRepository
;
private
PerforCofdrugpropRepository
_drugpropRepository
;
private
PerforCofdrugpropRepository
_drugpropRepository
;
private
PerforCofincomeRepository
_incomeRepository
;
private
PerforCofincomeRepository
_incomeRepository
;
...
@@ -22,7 +23,8 @@ public class ConfigService : IAutoInjection
...
@@ -22,7 +23,8 @@ public class ConfigService : IAutoInjection
private
PerforPerallotRepository
perforPerAllotRepository
;
private
PerforPerallotRepository
perforPerAllotRepository
;
private
PerforPeragainallotRepository
perforPeragainallotRepository
;
private
PerforPeragainallotRepository
perforPeragainallotRepository
;
private
PerforHospitalRepository
perforHospitalRepository
;
private
PerforHospitalRepository
perforHospitalRepository
;
private
PerforLogdbugRepository
logdbug
;
//private PerforLogdbugRepository logdbug;
private
readonly
LogManageService
logManageService
;
public
ConfigService
(
PerforCofdirectorRepository
cofdirectorRepository
,
public
ConfigService
(
PerforCofdirectorRepository
cofdirectorRepository
,
PerforCofdrugpropRepository
cofdrugpropRepository
,
PerforCofdrugpropRepository
cofdrugpropRepository
,
PerforCofincomeRepository
cofincomeRepository
,
PerforCofincomeRepository
cofincomeRepository
,
...
@@ -32,7 +34,8 @@ public class ConfigService : IAutoInjection
...
@@ -32,7 +34,8 @@ public class ConfigService : IAutoInjection
PerforPerallotRepository
perforPerAllotRepository
,
PerforPerallotRepository
perforPerAllotRepository
,
PerforPeragainallotRepository
perforPeragainallotRepository
,
PerforPeragainallotRepository
perforPeragainallotRepository
,
PerforHospitalRepository
perforHospitalRepository
,
PerforHospitalRepository
perforHospitalRepository
,
PerforLogdbugRepository
logdbug
)
//PerforLogdbugRepository logdbug
LogManageService
logManageService
)
{
{
this
.
_directorRepository
=
cofdirectorRepository
;
this
.
_directorRepository
=
cofdirectorRepository
;
this
.
_drugpropRepository
=
cofdrugpropRepository
;
this
.
_drugpropRepository
=
cofdrugpropRepository
;
...
@@ -43,8 +46,10 @@ public class ConfigService : IAutoInjection
...
@@ -43,8 +46,10 @@ public class ConfigService : IAutoInjection
this
.
perforPerAllotRepository
=
perforPerAllotRepository
;
this
.
perforPerAllotRepository
=
perforPerAllotRepository
;
this
.
perforPeragainallotRepository
=
perforPeragainallotRepository
;
this
.
perforPeragainallotRepository
=
perforPeragainallotRepository
;
this
.
perforHospitalRepository
=
perforHospitalRepository
;
this
.
perforHospitalRepository
=
perforHospitalRepository
;
this
.
logdbug
=
logdbug
;
//this.logdbug = logdbug;
this
.
logManageService
=
logManageService
;
}
}
#
endregion
#
region
cof_director
规模
/
效率绩效配置
#
region
cof_director
规模
/
效率绩效配置
/// <summary>
/// <summary>
...
@@ -343,16 +348,6 @@ public bool WorkDelete(WorkyearRequest request)
...
@@ -343,16 +348,6 @@ public bool WorkDelete(WorkyearRequest request)
}
}
#
endregion
#
endregion
/// <summary>
/// 清楚无效数据
/// </summary>
/// <param name="allotId"></param>
public
void
Clear
(
int
allotId
)
{
var
count
=
_directorRepository
.
DeleteData
(
allotId
);
logdbug
.
Add
(
allotId
,
"清理无效数据"
,
$"受影响行数:
{
count
}
"
);
}
#
region
Copy
#
region
Copy
/// <summary>
/// <summary>
/// 复制报表基础配置
/// 复制报表基础配置
...
@@ -486,6 +481,17 @@ public bool AgainDelete(CofAgainRequest request)
...
@@ -486,6 +481,17 @@ public bool AgainDelete(CofAgainRequest request)
}
}
#
endregion
#
endregion
#
region
清楚无效数据
Clear
/// <summary>
/// 清楚无效数据
/// </summary>
/// <param name="allotId"></param>
public
void
Clear
(
int
allotId
)
{
var
count
=
_directorRepository
.
DeleteData
(
allotId
);
//logdbug.Add(allotId, "清理无效数据", $"受影响行数:{count}");
logManageService
.
WriteMsg
(
"清理无效数据"
,
$"清理无效数据,受影响行数:
{
count
}
"
,
0
,
""
,
true
);
}
/// <summary>
/// <summary>
/// 清除二次绩效中无效数据
/// 清除二次绩效中无效数据
...
@@ -494,7 +500,9 @@ public bool AgainDelete(CofAgainRequest request)
...
@@ -494,7 +500,9 @@ public bool AgainDelete(CofAgainRequest request)
public
void
ClearAgain
(
int
againId
)
public
void
ClearAgain
(
int
againId
)
{
{
var
count
=
_directorRepository
.
DelAgain
(
againId
);
var
count
=
_directorRepository
.
DelAgain
(
againId
);
logdbug
.
Add
(
againId
,
"清除二次绩效中无效数据"
,
$"受影响行数:
{
count
}
"
);
//logdbug.Add(againId, "清除二次绩效中无效数据", $"受影响行数:{count}");
logManageService
.
WriteMsg
(
"清理无效数据"
,
$"清除二次绩效中无效数据,受影响行数:
{
count
}
"
,
0
,
""
,
true
);
}
}
#
endregion
}
}
}
}
performance/Performance.Services/Hubs/AllotLogHub.cs
View file @
db51957b
...
@@ -19,6 +19,11 @@ public override Task OnDisconnectedAsync(Exception exception)
...
@@ -19,6 +19,11 @@ public override Task OnDisconnectedAsync(Exception exception)
var
groupName
=
"aaaa"
;
var
groupName
=
"aaaa"
;
//2 删除数据库中用户分组数据
//2 删除数据库中用户分组数据
if
(
RedisHelper
.
HExists
(
"MyGroup"
,
groupName
))
{
var
connectionId
=
Context
.
ConnectionId
;
RedisHelper
.
HDel
(
"MyGroup"
,
groupName
);
}
//3 分组中删除用户
//3 分组中删除用户
Groups
.
RemoveFromGroupAsync
(
Context
.
ConnectionId
,
groupName
);
Groups
.
RemoveFromGroupAsync
(
Context
.
ConnectionId
,
groupName
);
...
@@ -27,10 +32,16 @@ public override Task OnDisconnectedAsync(Exception exception)
...
@@ -27,10 +32,16 @@ public override Task OnDisconnectedAsync(Exception exception)
public
async
Task
AddGroup
(
string
token
,
string
groupName
)
public
async
Task
AddGroup
(
string
token
,
string
groupName
)
{
{
//1 向数据库中插入用户及分组信息
if
(!
RedisHelper
.
HExists
(
"MyGroup"
,
groupName
))
{
//1 向数据库中插入用户及分组信息
var
connectionId
=
Context
.
ConnectionId
;
RedisHelper
.
HSet
(
"MyGroup"
,
groupName
,
connectionId
);
//2 将用户插入分组
await
Groups
.
AddToGroupAsync
(
Context
.
ConnectionId
,
groupName
);
//2 将用户插入分组
await
Groups
.
AddToGroupAsync
(
Context
.
ConnectionId
,
groupName
);
}
}
}
}
}
}
}
performance/Performance.Services/LogManageService.cs
0 → 100644
View file @
db51957b
using
Microsoft.AspNetCore.Mvc.ViewFeatures
;
using
Microsoft.AspNetCore.SignalR
;
using
Performance.Repository
;
using
System
;
using
System.Collections.Generic
;
using
System.Text
;
namespace
Performance.Services
{
public
class
LogManageService
:
IAutoInjection
{
private
readonly
IHubContext
<
AllotLogHub
>
hubContext
;
private
PerforLogdbugRepository
logdbug
;
public
LogManageService
(
IHubContext
<
AllotLogHub
>
hubContext
,
PerforLogdbugRepository
logdbug
)
{
this
.
hubContext
=
hubContext
;
this
.
logdbug
=
logdbug
;
}
/// <summary>
///
/// </summary>
/// <param name="tag">标签</param>
/// <param name="message">内容</param>
/// <param name="allotId">绩效Id</param>
/// <param name="method">方法名称</param>
public
void
WriteMsg
(
string
tag
,
string
message
,
int
allotId
,
string
method
,
bool
isDebug
=
false
)
{
hubContext
.
Clients
.
Group
(
allotId
.
ToString
()).
SendAsync
(
method
,
tag
,
message
);
if
(
isDebug
)
{
logdbug
.
Add
(
allotId
,
tag
,
message
);
}
}
}
}
performance/Performance.Services/NewExtractService.cs
View file @
db51957b
using
Dapper
;
using
Dapper
;
using
Microsoft.AspNetCore.Hosting
;
using
Microsoft.AspNetCore.Hosting
;
using
Microsoft.AspNetCore.SignalR
;
using
Microsoft.Extensions.Logging
;
using
Microsoft.Extensions.Logging
;
using
Microsoft.Extensions.Options
;
using
Microsoft.Extensions.Options
;
using
NPOI.HSSF.UserModel
;
using
NPOI.HSSF.UserModel
;
...
@@ -43,9 +44,11 @@ public class NewExtractService : IAutoInjection
...
@@ -43,9 +44,11 @@ public class NewExtractService : IAutoInjection
private
readonly
PerforImaccountbasicRepository
perforImaccountbasicRepository
;
private
readonly
PerforImaccountbasicRepository
perforImaccountbasicRepository
;
private
readonly
PerforImspecialunitRepository
perforImspecialunitRepository
;
private
readonly
PerforImspecialunitRepository
perforImspecialunitRepository
;
private
readonly
PerforImdataRepository
perforImdataRepository
;
private
readonly
PerforImdataRepository
perforImdataRepository
;
private
readonly
LogManageService
logManageService
;
private
IWorkbook
workbook
=
null
;
private
IWorkbook
workbook
=
null
;
private
ICellStyle
style
;
private
ICellStyle
style
;
private
int
AllotId
;
public
NewExtractService
(
ILogger
<
ExtractService
>
logger
,
public
NewExtractService
(
ILogger
<
ExtractService
>
logger
,
IHostingEnvironment
environment
,
IHostingEnvironment
environment
,
...
@@ -62,7 +65,8 @@ public class NewExtractService : IAutoInjection
...
@@ -62,7 +65,8 @@ public class NewExtractService : IAutoInjection
PerforImemployeeRepository
perforImemployeeRepository
,
PerforImemployeeRepository
perforImemployeeRepository
,
PerforImaccountbasicRepository
perforImaccountbasicRepository
,
PerforImaccountbasicRepository
perforImaccountbasicRepository
,
PerforImspecialunitRepository
perforImspecialunitRepository
,
PerforImspecialunitRepository
perforImspecialunitRepository
,
PerforImdataRepository
perforImdataRepository
)
PerforImdataRepository
perforImdataRepository
,
LogManageService
logManageService
)
{
{
this
.
logger
=
logger
;
this
.
logger
=
logger
;
this
.
environment
=
environment
;
this
.
environment
=
environment
;
...
@@ -80,6 +84,7 @@ public class NewExtractService : IAutoInjection
...
@@ -80,6 +84,7 @@ public class NewExtractService : IAutoInjection
this
.
perforImaccountbasicRepository
=
perforImaccountbasicRepository
;
this
.
perforImaccountbasicRepository
=
perforImaccountbasicRepository
;
this
.
perforImspecialunitRepository
=
perforImspecialunitRepository
;
this
.
perforImspecialunitRepository
=
perforImspecialunitRepository
;
this
.
perforImdataRepository
=
perforImdataRepository
;
this
.
perforImdataRepository
=
perforImdataRepository
;
this
.
logManageService
=
logManageService
;
}
}
#
endregion
#
endregion
...
@@ -87,6 +92,8 @@ public class NewExtractService : IAutoInjection
...
@@ -87,6 +92,8 @@ public class NewExtractService : IAutoInjection
public
string
ExtractData
(
int
allotId
,
string
email
,
int
hospitalId
)
public
string
ExtractData
(
int
allotId
,
string
email
,
int
hospitalId
)
{
{
AllotId
=
allotId
;
// 获取绩效信息
// 获取绩效信息
var
allot
=
perforPerallotRepository
.
GetEntity
(
t
=>
t
.
ID
==
allotId
);
var
allot
=
perforPerallotRepository
.
GetEntity
(
t
=>
t
.
ID
==
allotId
);
// 获取医院信息
// 获取医院信息
...
@@ -157,12 +164,14 @@ public string ExtractData(int allotId, string email, int hospitalId)
...
@@ -157,12 +164,14 @@ public string ExtractData(int allotId, string email, int hospitalId)
{
{
workbook
.
Write
(
file
);
workbook
.
Write
(
file
);
}
}
logManageService
.
WriteMsg
(
"提取绩效数据"
,
$"
{
hospital
.
HosName
}
HIS数据提取成功,文件路径:
{
newPath
}
。"
,
allotId
,
"ReceiveMessage"
);
LogHelper
.
Information
(
$"
{
hospital
.
HosName
}
HIS数据提取成功,文件路径:
{
newPath
}
。"
,
"提取绩效数据"
);
LogHelper
.
Information
(
$"
{
hospital
.
HosName
}
HIS数据提取成功,文件路径:
{
newPath
}
。"
,
"提取绩效数据"
);
SendEmail
(
email
,
newPath
,
$"
{
hospital
.
HosName
}
HIS数据提取成功"
,
$"
{
hospital
.
HosName
}
在
{
DateTime
.
Now
.
ToString
(
"yyyy-MM-dd HH:mm:ss"
)}
成功提取。"
);
SendEmail
(
email
,
newPath
,
$"
{
hospital
.
HosName
}
HIS数据提取成功"
,
$"
{
hospital
.
HosName
}
在
{
DateTime
.
Now
.
ToString
(
"yyyy-MM-dd HH:mm:ss"
)}
成功提取。"
);
return
newPath
;
return
newPath
;
}
}
catch
(
Exception
ex
)
catch
(
Exception
ex
)
{
{
logManageService
.
WriteMsg
(
"提取数据异常"
,
$"数据写入出现异常
{
ex
.
ToString
()}
"
,
allotId
,
"ReceiveMessage"
);
LogHelper
.
Error
(
$"数据写入出现异常
{
ex
.
ToString
()}
"
,
"提取绩效数据"
,
"异常"
);
LogHelper
.
Error
(
$"数据写入出现异常
{
ex
.
ToString
()}
"
,
"提取绩效数据"
,
"异常"
);
SendEmail
(
email
,
""
,
$"
{
hospital
.
HosName
}
HIS数据提取失败"
,
$"
{
hospital
.
HosName
}
提取数据过程中出现异常情况,我们将尽快解决问题。给您带来的不便我们深感歉意!"
);
SendEmail
(
email
,
""
,
$"
{
hospital
.
HosName
}
HIS数据提取失败"
,
$"
{
hospital
.
HosName
}
提取数据过程中出现异常情况,我们将尽快解决问题。给您带来的不便我们深感歉意!"
);
throw
ex
;
throw
ex
;
...
@@ -219,6 +228,7 @@ private void WriteOtherIncome(ISheet sheet, int hospitalId, IPerSheetDataRead sh
...
@@ -219,6 +228,7 @@ private void WriteOtherIncome(ISheet sheet, int hospitalId, IPerSheetDataRead sh
int
cellStartIndex
=
sheetRead
.
Point
.
HeaderFirstCellNum
.
Value
+
4
;
int
cellStartIndex
=
sheetRead
.
Point
.
HeaderFirstCellNum
.
Value
+
4
;
logManageService
.
WriteMsg
(
"提取绩效数据"
,
$"写入列头信息 --
{
module
.
ModuleName
}
"
,
AllotId
,
"ReceiveMessage"
);
LogHelper
.
Information
(
$"写入列头信息 --
{
module
.
ModuleName
}
"
,
"提取绩效数据"
);
LogHelper
.
Information
(
$"写入列头信息 --
{
module
.
ModuleName
}
"
,
"提取绩效数据"
);
//写入列头信息
//写入列头信息
foreach
(
var
item
in
itemList
)
foreach
(
var
item
in
itemList
)
...
@@ -255,6 +265,7 @@ private void WriteIncome(ISheet sheet, int hospitalId, List<AccountUnitEntity> u
...
@@ -255,6 +265,7 @@ private void WriteIncome(ISheet sheet, int hospitalId, List<AccountUnitEntity> u
var
technicianFactor
=
sheet
.
GetRow
(
sheetRead
.
Point
.
AccountingUnit
.
First
(
t
=>
t
.
UnitType
==
"医技组"
).
FactorRow
.
Value
);
var
technicianFactor
=
sheet
.
GetRow
(
sheetRead
.
Point
.
AccountingUnit
.
First
(
t
=>
t
.
UnitType
==
"医技组"
).
FactorRow
.
Value
);
var
head
=
GetOrCreate
(
sheet
,
sheetRead
.
Point
.
HeaderFirstRowNum
.
Value
);
var
head
=
GetOrCreate
(
sheet
,
sheetRead
.
Point
.
HeaderFirstRowNum
.
Value
);
logManageService
.
WriteMsg
(
"提取绩效数据"
,
$"写入列头信息 --
{
module
.
ModuleName
}
"
,
AllotId
,
"ReceiveMessage"
);
LogHelper
.
Information
(
$"写入列头信息 --
{
module
.
ModuleName
}
"
,
"提取绩效数据"
);
LogHelper
.
Information
(
$"写入列头信息 --
{
module
.
ModuleName
}
"
,
"提取绩效数据"
);
//写入列头信息
//写入列头信息
int
cellStartIndex
=
sheetRead
.
Point
.
HeaderFirstCellNum
.
Value
+
4
;
int
cellStartIndex
=
sheetRead
.
Point
.
HeaderFirstCellNum
.
Value
+
4
;
...
@@ -284,12 +295,14 @@ private void WriteIncome(ISheet sheet, int hospitalId, List<AccountUnitEntity> u
...
@@ -284,12 +295,14 @@ private void WriteIncome(ISheet sheet, int hospitalId, List<AccountUnitEntity> u
List
<
ExtractDto
>
allExtract
=
new
List
<
ExtractDto
>();
List
<
ExtractDto
>
allExtract
=
new
List
<
ExtractDto
>();
foreach
(
var
item
in
extractList
)
foreach
(
var
item
in
extractList
)
{
{
LogHelper
.
Information
(
$"执行SQL脚本获取数据 --
{
module
.
ModuleName
}
,"
,
"提取绩效数据"
);
logManageService
.
WriteMsg
(
"提取绩效数据"
,
$"执行SQL脚本获取数据 --
{
module
.
ModuleName
}
"
,
AllotId
,
"ReceiveMessage"
);
LogHelper
.
Information
(
$"执行SQL脚本获取数据 --
{
module
.
ModuleName
}
"
,
"提取绩效数据"
);
var
result
=
QueryDatabase
(
hospitalConfigList
,
item
,
allot
);
var
result
=
QueryDatabase
(
hospitalConfigList
,
item
,
allot
);
if
(
result
!=
null
)
if
(
result
!=
null
)
allExtract
.
AddRange
(
result
);
allExtract
.
AddRange
(
result
);
}
}
logManageService
.
WriteMsg
(
"提取绩效数据"
,
$"填充数据 --
{
module
.
ModuleName
}
"
,
AllotId
,
"ReceiveMessage"
);
LogHelper
.
Information
(
$"填充数据 --
{
module
.
ModuleName
}
"
,
"提取绩效数据"
);
LogHelper
.
Information
(
$"填充数据 --
{
module
.
ModuleName
}
"
,
"提取绩效数据"
);
//写入数据
//写入数据
var
rowIndex
=
sheetRead
.
Point
.
HeaderFirstRowNum
.
Value
+
1
;
var
rowIndex
=
sheetRead
.
Point
.
HeaderFirstRowNum
.
Value
+
1
;
...
@@ -378,6 +391,7 @@ private void WriteWorkload(ISheet sheet, int hospitalId, List<AccountUnitEntity>
...
@@ -378,6 +391,7 @@ private void WriteWorkload(ISheet sheet, int hospitalId, List<AccountUnitEntity>
var
head
=
GetOrCreate
(
sheet
,
sheetRead
.
Point
.
HeaderFirstRowNum
.
Value
+
0
);
var
head
=
GetOrCreate
(
sheet
,
sheetRead
.
Point
.
HeaderFirstRowNum
.
Value
+
0
);
var
factor
=
GetOrCreate
(
sheet
,
sheetRead
.
Point
.
HeaderFirstRowNum
.
Value
+
1
);
var
factor
=
GetOrCreate
(
sheet
,
sheetRead
.
Point
.
HeaderFirstRowNum
.
Value
+
1
);
logManageService
.
WriteMsg
(
"提取绩效数据"
,
$"写入列头信息 --
{
module
.
ModuleName
}
"
,
AllotId
,
"ReceiveMessage"
);
LogHelper
.
Information
(
$"写入列头信息 --
{
module
.
ModuleName
}
"
,
"提取绩效数据"
);
LogHelper
.
Information
(
$"写入列头信息 --
{
module
.
ModuleName
}
"
,
"提取绩效数据"
);
//写入列头信息
//写入列头信息
int
cellStartIndex
=
sheetRead
.
Point
.
HeaderFirstCellNum
.
Value
+
2
;
int
cellStartIndex
=
sheetRead
.
Point
.
HeaderFirstCellNum
.
Value
+
2
;
...
@@ -404,6 +418,7 @@ private void WriteWorkload(ISheet sheet, int hospitalId, List<AccountUnitEntity>
...
@@ -404,6 +418,7 @@ private void WriteWorkload(ISheet sheet, int hospitalId, List<AccountUnitEntity>
if
(
category
==
null
||
category
.
Count
()
==
0
)
continue
;
if
(
category
==
null
||
category
.
Count
()
==
0
)
continue
;
foreach
(
var
moditem
in
category
)
foreach
(
var
moditem
in
category
)
{
{
logManageService
.
WriteMsg
(
"提取绩效数据"
,
$"执行SQL脚本获取数据 --
{
module
.
ModuleName
}
"
,
AllotId
,
"ReceiveMessage"
);
LogHelper
.
Information
(
$"执行SQL脚本获取数据 --
{
module
.
ModuleName
}
,"
,
"提取绩效数据"
);
LogHelper
.
Information
(
$"执行SQL脚本获取数据 --
{
module
.
ModuleName
}
,"
,
"提取绩效数据"
);
var
result
=
QueryDatabase
(
hospitalConfigList
,
item
,
allot
,
moditem
.
ItemName
);
var
result
=
QueryDatabase
(
hospitalConfigList
,
item
,
allot
,
moditem
.
ItemName
);
if
(
result
!=
null
)
if
(
result
!=
null
)
...
@@ -418,6 +433,7 @@ private void WriteWorkload(ISheet sheet, int hospitalId, List<AccountUnitEntity>
...
@@ -418,6 +433,7 @@ private void WriteWorkload(ISheet sheet, int hospitalId, List<AccountUnitEntity>
specialHead
=
itemList
.
Select
(
t
=>
t
.
ItemName
).
Intersect
(
extractHead
.
Distinct
())?.
ToList
();
specialHead
=
itemList
.
Select
(
t
=>
t
.
ItemName
).
Intersect
(
extractHead
.
Distinct
())?.
ToList
();
}
}
logManageService
.
WriteMsg
(
"提取绩效数据"
,
$"填充数据 --
{
module
.
ModuleName
}
"
,
AllotId
,
"ReceiveMessage"
);
LogHelper
.
Information
(
$"填充数据 --
{
module
.
ModuleName
}
"
,
"提取绩效数据"
);
LogHelper
.
Information
(
$"填充数据 --
{
module
.
ModuleName
}
"
,
"提取绩效数据"
);
//写入数据
//写入数据
var
rowIndex
=
sheetRead
.
Point
.
HeaderFirstRowNum
.
Value
+
2
;
var
rowIndex
=
sheetRead
.
Point
.
HeaderFirstRowNum
.
Value
+
2
;
...
@@ -463,6 +479,7 @@ private List<ExtractDto> QueryDatabase(List<sys_hospitalconfig> hospitalConfigLi
...
@@ -463,6 +479,7 @@ private List<ExtractDto> QueryDatabase(List<sys_hospitalconfig> hospitalConfigLi
{
{
executeScript
=
Regex
.
Replace
(
executeScript
,
item
.
Key
,
item
.
Value
,
RegexOptions
.
IgnoreCase
);
executeScript
=
Regex
.
Replace
(
executeScript
,
item
.
Key
,
item
.
Value
,
RegexOptions
.
IgnoreCase
);
}
}
//logManageService.WriteMsg("提取绩效数据", $"SQL脚本:{executeScript}", AllotId, "ReceiveMessage");
LogHelper
.
Information
(
$"SQL脚本
{
executeScript
}
,"
,
"提取绩效数据"
);
LogHelper
.
Information
(
$"SQL脚本
{
executeScript
}
,"
,
"提取绩效数据"
);
var
result
=
connection
.
Query
<
ExtractDto
>(
executeScript
,
commandTimeout
:
20000
);
var
result
=
connection
.
Query
<
ExtractDto
>(
executeScript
,
commandTimeout
:
20000
);
if
(
result
!=
null
&&
result
.
Count
()
>
0
)
if
(
result
!=
null
&&
result
.
Count
()
>
0
)
...
@@ -493,6 +510,7 @@ private void WriteExpend(ISheet sheet, int hospitalId, IPerSheetDataRead sheetRe
...
@@ -493,6 +510,7 @@ private void WriteExpend(ISheet sheet, int hospitalId, IPerSheetDataRead sheetRe
int
cellStartIndex
=
sheetRead
.
Point
.
HeaderFirstCellNum
.
Value
+
4
;
int
cellStartIndex
=
sheetRead
.
Point
.
HeaderFirstCellNum
.
Value
+
4
;
logManageService
.
WriteMsg
(
"提取绩效数据"
,
$"写入列头信息 --
{
module
.
ModuleName
}
"
,
AllotId
,
"ReceiveMessage"
);
LogHelper
.
Information
(
$"写入列头信息 --
{
module
.
ModuleName
}
"
,
"提取绩效数据"
);
LogHelper
.
Information
(
$"写入列头信息 --
{
module
.
ModuleName
}
"
,
"提取绩效数据"
);
//写入列头信息
//写入列头信息
foreach
(
var
item
in
itemList
)
foreach
(
var
item
in
itemList
)
...
@@ -530,7 +548,6 @@ private void WriteExpend(ISheet sheet, int hospitalId, IPerSheetDataRead sheetRe
...
@@ -530,7 +548,6 @@ private void WriteExpend(ISheet sheet, int hospitalId, IPerSheetDataRead sheetRe
private
void
WriteEmployee
(
ISheet
sheet
,
int
allotLastId
,
IPerSheetDataRead
sheetRead
)
private
void
WriteEmployee
(
ISheet
sheet
,
int
allotLastId
,
IPerSheetDataRead
sheetRead
)
{
{
LogHelper
.
Information
(
$"填充数据 -- 人员信息"
,
"提取绩效数据"
);
var
dictionary
=
new
Dictionary
<
string
,
Func
<
im_employee
,
object
>>
var
dictionary
=
new
Dictionary
<
string
,
Func
<
im_employee
,
object
>>
{
{
{
"核算单元"
,
(
t
)
=>
t
.
AccountingUnit
},
{
"核算单元"
,
(
t
)
=>
t
.
AccountingUnit
},
...
@@ -548,6 +565,8 @@ private void WriteEmployee(ISheet sheet, int allotLastId, IPerSheetDataRead shee
...
@@ -548,6 +565,8 @@ private void WriteEmployee(ISheet sheet, int allotLastId, IPerSheetDataRead shee
{
"调节系数"
,
(
t
)
=>
t
.
Adjust
},
{
"调节系数"
,
(
t
)
=>
t
.
Adjust
},
};
};
logManageService
.
WriteMsg
(
"提取绩效数据"
,
$"填充数据 -- 人员信息"
,
AllotId
,
"ReceiveMessage"
);
LogHelper
.
Information
(
$"填充数据 -- 人员信息"
,
"提取绩效数据"
);
var
dataList
=
perforImemployeeRepository
.
GetEntities
(
t
=>
t
.
AllotID
==
allotLastId
);
var
dataList
=
perforImemployeeRepository
.
GetEntities
(
t
=>
t
.
AllotID
==
allotLastId
);
for
(
int
i
=
0
;
i
<
dataList
.
Count
;
i
++)
for
(
int
i
=
0
;
i
<
dataList
.
Count
;
i
++)
{
{
...
@@ -570,7 +589,6 @@ private void WriteEmployee(ISheet sheet, int allotLastId, IPerSheetDataRead shee
...
@@ -570,7 +589,6 @@ private void WriteEmployee(ISheet sheet, int allotLastId, IPerSheetDataRead shee
private
void
WriteSpecialUnit
(
ISheet
sheet
,
int
hospitalId
,
per_allot
allotLast
,
IPerSheetDataRead
sheetRead
)
private
void
WriteSpecialUnit
(
ISheet
sheet
,
int
hospitalId
,
per_allot
allotLast
,
IPerSheetDataRead
sheetRead
)
{
{
LogHelper
.
Information
(
$"填充数据 -- 特殊核算单元绩效测算表"
,
"提取绩效数据"
);
var
dictionary
=
new
Dictionary
<
string
,
Func
<
mod_special
,
List
<
im_specialunit
>,
object
>>
var
dictionary
=
new
Dictionary
<
string
,
Func
<
mod_special
,
List
<
im_specialunit
>,
object
>>
{
{
{
"科室"
,
(
special
,
lastAllot
)
=>
special
.
Department
},
{
"科室"
,
(
special
,
lastAllot
)
=>
special
.
Department
},
...
@@ -605,6 +623,8 @@ private void WriteSpecialUnit(ISheet sheet, int hospitalId, per_allot allotLast,
...
@@ -605,6 +623,8 @@ private void WriteSpecialUnit(ISheet sheet, int hospitalId, per_allot allotLast,
int
mergedBegin
=
sheetRead
.
Point
.
DataFirstRowNum
.
Value
;
int
mergedBegin
=
sheetRead
.
Point
.
DataFirstRowNum
.
Value
;
int
mergedEnd
=
sheetRead
.
Point
.
DataFirstRowNum
.
Value
;
int
mergedEnd
=
sheetRead
.
Point
.
DataFirstRowNum
.
Value
;
logManageService
.
WriteMsg
(
"提取绩效数据"
,
$"填充数据 -- 特殊核算单元绩效测算表"
,
AllotId
,
"ReceiveMessage"
);
LogHelper
.
Information
(
$"填充数据 -- 特殊核算单元绩效测算表"
,
"提取绩效数据"
);
for
(
int
i
=
0
;
i
<
modDataList
.
Count
;
i
++)
for
(
int
i
=
0
;
i
<
modDataList
.
Count
;
i
++)
{
{
var
headIndex
=
sheetRead
.
Point
.
HeaderFirstRowNum
;
var
headIndex
=
sheetRead
.
Point
.
HeaderFirstRowNum
;
...
@@ -650,7 +670,6 @@ private void WriteSpecialUnit(ISheet sheet, int hospitalId, per_allot allotLast,
...
@@ -650,7 +670,6 @@ private void WriteSpecialUnit(ISheet sheet, int hospitalId, per_allot allotLast,
private
void
WriteAccountBasic
(
ISheet
sheet
,
int
allotLastId
,
IPerSheetDataRead
sheetRead
)
private
void
WriteAccountBasic
(
ISheet
sheet
,
int
allotLastId
,
IPerSheetDataRead
sheetRead
)
{
{
LogHelper
.
Information
(
$"填充数据 -- 临床科室医护绩效测算表"
,
"提取绩效数据"
);
var
dictionary
=
new
Dictionary
<
string
,
Func
<
im_accountbasic
,
object
>>
var
dictionary
=
new
Dictionary
<
string
,
Func
<
im_accountbasic
,
object
>>
{
{
{
"核算单元类型"
,
(
t
)
=>
t
.
UnitType
},
{
"核算单元类型"
,
(
t
)
=>
t
.
UnitType
},
...
@@ -672,6 +691,8 @@ private void WriteAccountBasic(ISheet sheet, int allotLastId, IPerSheetDataRead
...
@@ -672,6 +691,8 @@ private void WriteAccountBasic(ISheet sheet, int allotLastId, IPerSheetDataRead
{
"调节系数"
,
(
t
)
=>
t
.
DoctorAdjustFactor
},
{
"调节系数"
,
(
t
)
=>
t
.
DoctorAdjustFactor
},
};
};
logManageService
.
WriteMsg
(
"提取绩效数据"
,
$"填充数据 -- 临床科室医护绩效测算表"
,
AllotId
,
"ReceiveMessage"
);
LogHelper
.
Information
(
$"填充数据 -- 临床科室医护绩效测算表"
,
"提取绩效数据"
);
var
dataList
=
perforImaccountbasicRepository
.
GetEntities
(
t
=>
t
.
AllotID
==
allotLastId
);
var
dataList
=
perforImaccountbasicRepository
.
GetEntities
(
t
=>
t
.
AllotID
==
allotLastId
);
for
(
int
i
=
0
;
i
<
dataList
.
Count
;
i
++)
for
(
int
i
=
0
;
i
<
dataList
.
Count
;
i
++)
{
{
...
...
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