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
07fb0ab9
Commit
07fb0ab9
authored
Apr 19, 2023
by
ruyun.zhang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
考勤上报
parent
ff8b0c58
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
2035 additions
and
131 deletions
+2035
-131
performance/Performance.Api/Controllers/AttendanceController.cs
+193
-20
performance/Performance.Api/wwwroot/Performance.Api.xml
+89
-18
performance/Performance.Api/wwwroot/Performance.DtoModels.xml
+150
-0
performance/Performance.Api/wwwroot/Performance.EntityModels.xml
+80
-0
performance/Performance.DtoModels/Enum.cs
+10
-0
performance/Performance.DtoModels/Request/AttendanceDept.cs
+128
-0
performance/Performance.DtoModels/Response/AttendanceDeptAuditList.cs
+61
-0
performance/Performance.DtoModels/TColumn.cs
+24
-0
performance/Performance.EntityModels/Context/PerformanceDbContext.cs
+1
-0
performance/Performance.EntityModels/Entity/per_attendance_dept.cs
+122
-0
performance/Performance.EntityModels/Other/AccountUnit.cs
+8
-0
performance/Performance.Infrastructure/Extensions/Extensions.ExcelWorksheet.cs
+332
-0
performance/Performance.Infrastructure/Extensions/Extensions.String.cs
+47
-40
performance/Performance.Repository/PerforPeremployeeRepository.cs
+8
-0
performance/Performance.Repository/Repository/PerforPerAttendanceDeptRepository.cs
+20
-0
performance/Performance.Services/AttendanceService.cs
+762
-53
No files found.
performance/Performance.Api/Controllers/AttendanceController.cs
View file @
07fb0ab9
...
@@ -11,6 +11,10 @@
...
@@ -11,6 +11,10 @@
using
Newtonsoft.Json
;
using
Newtonsoft.Json
;
using
System.Threading.Tasks
;
using
System.Threading.Tasks
;
using
Performance.DtoModels.Response
;
using
Performance.DtoModels.Response
;
using
Performance.DtoModels.Request
;
using
static
Performance
.
Services
.
ExtractExcelService
.
WriteDataHelper
;
using
System.Linq
;
using
Performance.Infrastructure
;
namespace
Performance.Api.Controllers
namespace
Performance.Api.Controllers
{
{
...
@@ -40,7 +44,7 @@ public class AttendanceController : ControllerBase
...
@@ -40,7 +44,7 @@ public class AttendanceController : ControllerBase
///// <summary>
///// <summary>
///// 查询绩效考勤记录
///// 查询绩效考勤记录
///// </summary>
///// </summary>
///// <param name="allotId"></param>
///// <param name="allotId">
绩效月ID
</param>
///// <returns></returns>
///// <returns></returns>
//[HttpGet("GetAttendance/{allotId}")]
//[HttpGet("GetAttendance/{allotId}")]
//public ApiResponse<List<AttendanceStatistics>> GetAttendance(int allotId)
//public ApiResponse<List<AttendanceStatistics>> GetAttendance(int allotId)
...
@@ -57,7 +61,7 @@ public class AttendanceController : ControllerBase
...
@@ -57,7 +61,7 @@ public class AttendanceController : ControllerBase
/// <summary>
/// <summary>
/// 查询绩效调动记录
/// 查询绩效调动记录
/// </summary>
/// </summary>
/// <param name="allotId"></param>
/// <param name="allotId">
绩效月ID
</param>
/// <returns></returns>
/// <returns></returns>
[
HttpGet
(
"CallIn/{allotId}"
)]
[
HttpGet
(
"CallIn/{allotId}"
)]
public
ApiResponse
<
List
<
view_attendance
>>
GetCallIn
(
int
allotId
)
public
ApiResponse
<
List
<
view_attendance
>>
GetCallIn
(
int
allotId
)
...
@@ -81,7 +85,7 @@ public ApiResponse GetBatchCallInHandsonTable(int allotId)
...
@@ -81,7 +85,7 @@ public ApiResponse GetBatchCallInHandsonTable(int allotId)
/// <summary>
/// <summary>
/// 批量插入调动记录
/// 批量插入调动记录
/// </summary>
/// </summary>
/// <param name="allotId"></param>
/// <param name="allotId">
绩效月ID
</param>
/// <param name="hospitalId"></param>
/// <param name="hospitalId"></param>
/// <param name="request"></param>
/// <param name="request"></param>
/// <returns></returns>
/// <returns></returns>
...
@@ -100,7 +104,7 @@ public ApiResponse BatchCallIn(int allotId, int hospitalId, SaveCollectData requ
...
@@ -100,7 +104,7 @@ public ApiResponse BatchCallIn(int allotId, int hospitalId, SaveCollectData requ
/// <summary>
/// <summary>
/// 考勤-调动记录表(添加)
/// 考勤-调动记录表(添加)
/// </summary>
/// </summary>
/// <param name="allotId"></param>
/// <param name="allotId">
绩效月ID
</param>
/// <param name="request"></param>
/// <param name="request"></param>
/// <returns></returns>
/// <returns></returns>
[
HttpPost
(
"CallIn/Add"
)]
[
HttpPost
(
"CallIn/Add"
)]
...
@@ -111,7 +115,7 @@ public ApiResponse AttendanceAdd(int allotId, AttendanceData request)
...
@@ -111,7 +115,7 @@ public ApiResponse AttendanceAdd(int allotId, AttendanceData request)
/// <summary>
/// <summary>
/// 考勤-调动记录表(修改)
/// 考勤-调动记录表(修改)
/// </summary>
/// </summary>
/// <param name="allotId"></param>
/// <param name="allotId">
绩效月ID
</param>
/// <param name="request"></param>
/// <param name="request"></param>
/// <returns></returns>
/// <returns></returns>
[
HttpPost
(
"CallIn/Update"
)]
[
HttpPost
(
"CallIn/Update"
)]
...
@@ -134,7 +138,7 @@ public ApiResponse AttendanceDelete(int attendanceId)
...
@@ -134,7 +138,7 @@ public ApiResponse AttendanceDelete(int attendanceId)
/// <summary>
/// <summary>
/// 考勤-调动记录表(全部删除)
/// 考勤-调动记录表(全部删除)
/// </summary>
/// </summary>
/// <param name="allotId"></param>
/// <param name="allotId">
绩效月ID
</param>
/// <returns></returns>
/// <returns></returns>
[
HttpPost
(
"CallIn/ClearAll"
)]
[
HttpPost
(
"CallIn/ClearAll"
)]
public
ApiResponse
AttendanceClearAll
(
int
allotId
)
public
ApiResponse
AttendanceClearAll
(
int
allotId
)
...
@@ -147,7 +151,7 @@ public ApiResponse AttendanceClearAll(int allotId)
...
@@ -147,7 +151,7 @@ public ApiResponse AttendanceClearAll(int allotId)
/// <summary>
/// <summary>
/// 查询绩效考勤类型
/// 查询绩效考勤类型
/// </summary>
/// </summary>
/// <param name="allotId"></param>
/// <param name="allotId">
绩效月ID
</param>
/// <returns></returns>
/// <returns></returns>
[
HttpGet
(
"Type/{allotId},{hospitalId}"
)]
[
HttpGet
(
"Type/{allotId},{hospitalId}"
)]
public
ApiResponse
<
List
<
per_attendance_type
>>
GetAttendanceType
(
int
allotId
)
public
ApiResponse
<
List
<
per_attendance_type
>>
GetAttendanceType
(
int
allotId
)
...
@@ -157,7 +161,7 @@ public ApiResponse<List<per_attendance_type>> GetAttendanceType(int allotId)
...
@@ -157,7 +161,7 @@ public ApiResponse<List<per_attendance_type>> GetAttendanceType(int allotId)
/// <summary>
/// <summary>
/// 新增或修改考勤类型
/// 新增或修改考勤类型
/// </summary>
/// </summary>
/// <param name="allotId"></param>
/// <param name="allotId">
绩效月ID
</param>
/// <param name="attendanceType"></param>
/// <param name="attendanceType"></param>
/// <returns></returns>
/// <returns></returns>
[
HttpPost
(
"Type/Edit/{allotId},{hospitalId}"
)]
[
HttpPost
(
"Type/Edit/{allotId},{hospitalId}"
)]
...
@@ -195,7 +199,7 @@ public ApiResponse GetAttendanceVacationHandsonTable(int allotId)
...
@@ -195,7 +199,7 @@ public ApiResponse GetAttendanceVacationHandsonTable(int allotId)
/// <summary>
/// <summary>
/// 查询考勤记录
/// 查询考勤记录
/// </summary>
/// </summary>
/// <param name="allotId"></param>
/// <param name="allotId">
绩效月ID
</param>
/// <param name="hospitalId"></param>
/// <param name="hospitalId"></param>
/// <returns></returns>
/// <returns></returns>
[
HttpGet
(
"Vacation/{allotId},{hospitalId}"
)]
[
HttpGet
(
"Vacation/{allotId},{hospitalId}"
)]
...
@@ -207,7 +211,7 @@ public ApiResponse<List<RecordAttendcance>> GetAttendanceVacation(int allotId, i
...
@@ -207,7 +211,7 @@ public ApiResponse<List<RecordAttendcance>> GetAttendanceVacation(int allotId, i
/// <summary>
/// <summary>
/// 批量插入考勤记录,插入前需要删除所有后重新插入
/// 批量插入考勤记录,插入前需要删除所有后重新插入
/// </summary>
/// </summary>
/// <param name="allotId"></param>
/// <param name="allotId">
绩效月ID
</param>
/// <param name="hospitalId"></param>
/// <param name="hospitalId"></param>
/// <param name="request"></param>
/// <param name="request"></param>
/// <returns></returns>
/// <returns></returns>
...
@@ -232,7 +236,7 @@ public ApiResponse AttendanceBatch(int allotId, int hospitalId, SaveCollectData
...
@@ -232,7 +236,7 @@ public ApiResponse AttendanceBatch(int allotId, int hospitalId, SaveCollectData
/// <summary>
/// <summary>
/// 考勤-考勤记录表(添加)
/// 考勤-考勤记录表(添加)
/// </summary>
/// </summary>
/// <param name="allotId"></param>
/// <param name="allotId">
绩效月ID
</param>
/// <param name="request"></param>
/// <param name="request"></param>
/// <returns></returns>
/// <returns></returns>
[
HttpPost
(
"Vacation/Add"
)]
[
HttpPost
(
"Vacation/Add"
)]
...
@@ -243,7 +247,7 @@ public ApiResponse AttendanceVacationAdd(int allotId, AttendanceVacationData req
...
@@ -243,7 +247,7 @@ public ApiResponse AttendanceVacationAdd(int allotId, AttendanceVacationData req
/// <summary>
/// <summary>
/// 考勤-考勤记录表(修改)
/// 考勤-考勤记录表(修改)
/// </summary>
/// </summary>
/// <param name="allotId"></param>
/// <param name="allotId">
绩效月ID
</param>
/// <param name="request"></param>
/// <param name="request"></param>
/// <returns></returns>
/// <returns></returns>
[
HttpPost
(
"Vacation/Update"
)]
[
HttpPost
(
"Vacation/Update"
)]
...
@@ -266,7 +270,7 @@ public ApiResponse AttendanceVacationDelete(int attendanceId)
...
@@ -266,7 +270,7 @@ public ApiResponse AttendanceVacationDelete(int attendanceId)
/// <summary>
/// <summary>
/// 考勤-考勤记录表(全部删除)
/// 考勤-考勤记录表(全部删除)
/// </summary>
/// </summary>
/// <param name="allotId"></param>
/// <param name="allotId">
绩效月ID
</param>
/// <returns></returns>
/// <returns></returns>
[
HttpPost
(
"Vacation/ClearAll"
)]
[
HttpPost
(
"Vacation/ClearAll"
)]
public
ApiResponse
AttendanceVacationClearAll
(
int
allotId
)
public
ApiResponse
AttendanceVacationClearAll
(
int
allotId
)
...
@@ -278,7 +282,7 @@ public ApiResponse AttendanceVacationClearAll(int allotId)
...
@@ -278,7 +282,7 @@ public ApiResponse AttendanceVacationClearAll(int allotId)
/// <summary>
/// <summary>
/// 考勤结果统计
/// 考勤结果统计
/// </summary>
/// </summary>
/// <param name="allotId"></param>
/// <param name="allotId">
绩效月ID
</param>
/// <returns></returns>
/// <returns></returns>
[
HttpGet
(
"statistics/{allotId}"
)]
[
HttpGet
(
"statistics/{allotId}"
)]
public
ApiResponse
<
List
<
AttendanceStatistics
>>
GetAttendanceStatistics
(
int
allotId
)
public
ApiResponse
<
List
<
AttendanceStatistics
>>
GetAttendanceStatistics
(
int
allotId
)
...
@@ -293,7 +297,7 @@ public ApiResponse<List<AttendanceStatistics>> GetAttendanceStatistics(int allot
...
@@ -293,7 +297,7 @@ public ApiResponse<List<AttendanceStatistics>> GetAttendanceStatistics(int allot
///// <summary>
///// <summary>
///// 初始考勤记录下载
///// 初始考勤记录下载
///// </summary>
///// </summary>
///// <param name="allotId"></param>
///// <param name="allotId">
绩效月ID
</param>
///// <returns></returns>
///// <returns></returns>
//[HttpPost]
//[HttpPost]
//[Route("download/attendance/{allotId}")]
//[Route("download/attendance/{allotId}")]
...
@@ -334,7 +338,7 @@ public ApiResponse<List<AttendanceStatistics>> GetAttendanceStatistics(int allot
...
@@ -334,7 +338,7 @@ public ApiResponse<List<AttendanceStatistics>> GetAttendanceStatistics(int allot
/// <summary>
/// <summary>
/// 考勤记录下载
/// 考勤记录下载
/// </summary>
/// </summary>
/// <param name="allotId"></param>
/// <param name="allotId">
绩效月ID
</param>
/// <returns></returns>
/// <returns></returns>
[
HttpPost
]
[
HttpPost
]
[
Route
(
"download/vacation/{allotId}"
)]
[
Route
(
"download/vacation/{allotId}"
)]
...
@@ -372,7 +376,7 @@ public IActionResult DownloadVacation(int allotId)
...
@@ -372,7 +376,7 @@ public IActionResult DownloadVacation(int allotId)
/// <summary>
/// <summary>
/// 调动记录下载
/// 调动记录下载
/// </summary>
/// </summary>
/// <param name="allotId"></param>
/// <param name="allotId">
绩效月ID
</param>
/// <returns></returns>
/// <returns></returns>
[
HttpPost
]
[
HttpPost
]
[
Route
(
"download/callin/{allotId}"
)]
[
Route
(
"download/callin/{allotId}"
)]
...
@@ -408,7 +412,7 @@ public IActionResult DownloadCallIn(int allotId)
...
@@ -408,7 +412,7 @@ public IActionResult DownloadCallIn(int allotId)
/// <summary>
/// <summary>
/// 生成最终考勤结果下载
/// 生成最终考勤结果下载
/// </summary>
/// </summary>
/// <param name="allotId"></param>
/// <param name="allotId">
绩效月ID
</param>
/// <returns></returns>
/// <returns></returns>
[
HttpPost
]
[
HttpPost
]
[
Route
(
"download/statistics/{allotId}"
)]
[
Route
(
"download/statistics/{allotId}"
)]
...
@@ -463,7 +467,7 @@ public IActionResult DownloadStatistics(int allotId)
...
@@ -463,7 +467,7 @@ public IActionResult DownloadStatistics(int allotId)
/// <summary>
/// <summary>
/// 科室确认详情(已下发结果展示列表)下载
/// 科室确认详情(已下发结果展示列表)下载
/// </summary>
/// </summary>
/// <param name="allotId"></param>
/// <param name="allotId">
绩效月ID
</param>
/// <param name="unitType">人员类别</param>
/// <param name="unitType">人员类别</param>
/// <param name="accountingUnit">核算单元</param>
/// <param name="accountingUnit">核算单元</param>
/// <returns></returns>
/// <returns></returns>
...
@@ -559,7 +563,7 @@ public ApiResponse<List<PerAttendanceIssueDto>> PreConfirmationDisplay(int allot
...
@@ -559,7 +563,7 @@ public ApiResponse<List<PerAttendanceIssueDto>> PreConfirmationDisplay(int allot
/// <summary>
/// <summary>
/// 最终考勤结果下发
/// 最终考勤结果下发
/// </summary>
/// </summary>
/// <param name="allotId"></param>
/// <param name="allotId">
绩效月ID
</param>
/// <returns></returns>
/// <returns></returns>
[
HttpPost
]
[
HttpPost
]
[
Route
(
"issue/confirm"
)]
[
Route
(
"issue/confirm"
)]
...
@@ -584,5 +588,173 @@ public ApiResponse ChooseStatistics(AttendanceIssueChoose attendanceIssueChoose)
...
@@ -584,5 +588,173 @@ public ApiResponse ChooseStatistics(AttendanceIssueChoose attendanceIssueChoose)
return
_attendanceService
.
ChooseStatistics
(
attendanceIssueChoose
,
userid
,
realName
);
return
_attendanceService
.
ChooseStatistics
(
attendanceIssueChoose
,
userid
,
realName
);
}
}
#
endregion
#
endregion
#
region
考勤上报
/// <summary>
/// 科室上报审核列表
/// </summary>
/// <param name="allotId">绩效月ID</param>
/// <param name="unitType">核算组别</param>
/// <param name="accountingUnit">核算单元</param>
/// <param name="state"></param>
/// <returns></returns>
[
HttpPost
]
[
Route
(
"dept/audit/list"
)]
public
ApiResponse
<
List
<
AttendanceDeptAuditList
>>
DeptAuditList
(
int
allotId
,
string
unitType
,
string
accountingUnit
,
int
?
state
=
-
1
)
{
return
_attendanceService
.
DeptAuditList
(
allotId
,
unitType
,
accountingUnit
,
state
??
-
1
);
}
/// <summary>
/// 科室考勤上报录入加载
/// </summary>
/// <param name="allotId">绩效月ID</param>
/// <returns></returns>
[
HttpPost
]
[
Route
(
"dept/load"
)]
public
ApiResponse
DeptLoad
(
int
allotId
)
{
var
userid
=
claim
.
GetUserId
();
var
realName
=
claim
.
GetUserClaim
(
JwtClaimTypes
.
RealName
);
return
_attendanceService
.
DeptLoad
(
allotId
,
userid
,
realName
);
}
/// <summary>
/// 科室考勤上报录入保存
/// </summary>
/// <param name="allotId">绩效月ID</param>
/// <param name="unitType">核算组别</param>
/// <param name="datas"></param>
/// <returns></returns>
[
HttpPost
]
[
Route
(
"dept/save"
)]
public
ApiResponse
DeptSave
(
int
allotId
,
string
unitType
,
[
FromBody
]
List
<
AttendanceDept
>
datas
)
{
var
userid
=
claim
.
GetUserId
();
var
realName
=
claim
.
GetUserClaim
(
JwtClaimTypes
.
RealName
);
if
(!
Enum
.
TryParse
(
unitType
,
out
UnitType
unitType1
))
throw
new
PerformanceException
(
"核算组别错误"
);
return
_attendanceService
.
DeptSave
(
allotId
,
datas
,
unitType
,
userid
,
realName
);
}
/// <summary>
/// 科室考勤上报录入提交
/// </summary>
/// <param name="allotId">绩效月ID</param>
/// <param name="unitType">核算组别</param>
/// <param name="datas"></param>
/// <returns></returns>
[
HttpPost
]
[
Route
(
"dept/submit"
)]
public
ApiResponse
DeptSubmit
(
int
allotId
,
string
unitType
,
[
FromBody
]
List
<
AttendanceDept
>
datas
)
{
var
userid
=
claim
.
GetUserId
();
var
realName
=
claim
.
GetUserClaim
(
JwtClaimTypes
.
RealName
);
var
saveRes
=
_attendanceService
.
DeptSave
(
allotId
,
datas
,
unitType
,
userid
,
realName
);
if
(
saveRes
.
State
!=
ResponseType
.
OK
)
return
saveRes
;
return
_attendanceService
.
DeptSubmit
(
allotId
,
unitType
,
userid
,
realName
);
}
/// <summary>
/// 科室考勤上报录入撤回
/// </summary>
/// <param name="allotId">绩效月ID</param>
/// <param name="unitType">核算组别</param>
/// <returns></returns>
[
HttpPost
]
[
Route
(
"dept/rollback"
)]
public
ApiResponse
DeptRollback
(
int
allotId
,
string
unitType
)
{
var
userid
=
claim
.
GetUserId
();
var
realName
=
claim
.
GetUserClaim
(
JwtClaimTypes
.
RealName
);
return
_attendanceService
.
DeptRollback
(
allotId
,
unitType
,
userid
,
realName
);
}
/// <summary>
/// 科室考勤上报结果审核
/// </summary>
/// <param name="allotId">绩效月ID</param>
/// <param name="unitType">核算组别</param>
/// <param name="audit"></param>
/// <returns></returns>
[
HttpPost
]
[
Route
(
"dept/audit"
)]
public
ApiResponse
DeptAudit
(
int
allotId
,
string
unitType
,
[
FromBody
]
AttendanceDeptAudit
audit
)
{
if
(
audit
==
null
)
throw
new
PerformanceException
(
"审核参数错误"
);
var
states
=
new
int
[]
{
(
int
)
Attendance
.
Report
.
通过
,
(
int
)
Attendance
.
Report
.
驳回
,
};
if
(!
states
.
Contains
(
audit
.
State
))
throw
new
PerformanceException
(
"暂不支持当前审核模式"
);
var
userid
=
claim
.
GetUserId
();
var
realName
=
claim
.
GetUserClaim
(
JwtClaimTypes
.
RealName
);
return
_attendanceService
.
DeptAudit
(
allotId
,
unitType
,
audit
.
State
,
audit
.
Remark
,
userid
,
realName
);
}
/// <summary>
/// 科室考勤上报结果详情
/// </summary>
/// <param name="allotId">绩效月ID</param>
/// <param name="unitType">核算组别</param>
/// <param name="accountingUnit">核算单元</param>
/// <returns></returns>
[
HttpPost
]
[
Route
(
"dept/detail"
)]
public
ApiResponse
<
AttendanceDeptDetail
>
DeptDetail
(
int
allotId
,
string
unitType
,
string
accountingUnit
)
{
return
_attendanceService
.
DeptDetail
(
allotId
,
unitType
,
accountingUnit
);
}
/// <summary>
/// 科室考勤上报结果详情下载
/// </summary>
/// <param name="allotId">绩效月ID</param>
/// <param name="unitType">核算组别</param>
/// <param name="accountingUnit">核算单元</param>
/// <param name="fileName"></param>
/// <returns></returns>
[
HttpPost
]
[
Route
(
"dept/detail/download"
)]
public
IActionResult
DeptDetailDownload
(
int
allotId
,
string
unitType
,
string
accountingUnit
,
string
?
fileName
)
{
fileName
=
string
.
IsNullOrWhiteSpace
(
fileName
)
?
"考勤上报审核结果"
:
Path
.
GetFileNameWithoutExtension
(
fileName
);
var
dpath
=
Path
.
Combine
(
AppDomain
.
CurrentDomain
.
BaseDirectory
,
"Files"
);
if
(!
Directory
.
Exists
(
dpath
))
Directory
.
CreateDirectory
(
dpath
);
string
filepath
=
Path
.
Combine
(
dpath
,
$"
{
fileName
}{
DateTime
.
Now
:
yyyy
年
MM
月
dd
日
}
.xlsx"
);
var
res
=
_attendanceService
.
DeptDetail
(
allotId
,
unitType
,
accountingUnit
);
var
config
=
new
ExcelDownloadRequest
()
{
Name
=
"考勤上报审核结果"
};
if
(
res
.
State
==
ResponseType
.
OK
)
{
var
items
=
JsonHelper
.
Deserialize
<
List
<
Dictionary
<
string
,
object
>>>(
JsonHelper
.
Serialize
(
res
.
Data
.
Data
));
config
.
Rows
=
items
;
var
columns
=
res
.
Data
.
Columns
.
Select
(
w
=>
new
EColumn
(
w
.
Title
,
w
.
Field
));
config
.
Columns
=
columns
;
}
UtilExtensions
.
Export
(
filepath
,
config
);
var
memoryStream
=
new
MemoryStream
();
using
(
var
stream
=
new
FileStream
(
filepath
,
FileMode
.
Open
))
{
stream
.
CopyToAsync
(
memoryStream
).
Wait
();
}
memoryStream
.
Seek
(
0
,
SeekOrigin
.
Begin
);
var
provider
=
new
FileExtensionContentTypeProvider
();
FileInfo
fileInfo
=
new
FileInfo
(
filepath
);
var
memi
=
provider
.
Mappings
[
".xlsx"
];
return
File
(
memoryStream
,
memi
,
Path
.
GetFileName
(
fileInfo
.
Name
));
}
#
endregion
}
}
}
}
\ No newline at end of file
performance/Performance.Api/wwwroot/Performance.Api.xml
View file @
07fb0ab9
...
@@ -306,7 +306,7 @@
...
@@ -306,7 +306,7 @@
<summary>
<summary>
查询绩效调动记录
查询绩效调动记录
</summary>
</summary>
<param
name=
"allotId"
></param>
<param
name=
"allotId"
>
绩效月ID
</param>
<returns></returns>
<returns></returns>
</member>
</member>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.GetBatchCallInHandsonTable(System.Int32)"
>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.GetBatchCallInHandsonTable(System.Int32)"
>
...
@@ -319,7 +319,7 @@
...
@@ -319,7 +319,7 @@
<summary>
<summary>
批量插入调动记录
批量插入调动记录
</summary>
</summary>
<param
name=
"allotId"
></param>
<param
name=
"allotId"
>
绩效月ID
</param>
<param
name=
"hospitalId"
></param>
<param
name=
"hospitalId"
></param>
<param
name=
"request"
></param>
<param
name=
"request"
></param>
<returns></returns>
<returns></returns>
...
@@ -328,7 +328,7 @@
...
@@ -328,7 +328,7 @@
<summary>
<summary>
考勤-调动记录表(添加)
考勤-调动记录表(添加)
</summary>
</summary>
<param
name=
"allotId"
></param>
<param
name=
"allotId"
>
绩效月ID
</param>
<param
name=
"request"
></param>
<param
name=
"request"
></param>
<returns></returns>
<returns></returns>
</member>
</member>
...
@@ -336,7 +336,7 @@
...
@@ -336,7 +336,7 @@
<summary>
<summary>
考勤-调动记录表(修改)
考勤-调动记录表(修改)
</summary>
</summary>
<param
name=
"allotId"
></param>
<param
name=
"allotId"
>
绩效月ID
</param>
<param
name=
"request"
></param>
<param
name=
"request"
></param>
<returns></returns>
<returns></returns>
</member>
</member>
...
@@ -351,21 +351,21 @@
...
@@ -351,21 +351,21 @@
<summary>
<summary>
考勤-调动记录表(全部删除)
考勤-调动记录表(全部删除)
</summary>
</summary>
<param
name=
"allotId"
></param>
<param
name=
"allotId"
>
绩效月ID
</param>
<returns></returns>
<returns></returns>
</member>
</member>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.GetAttendanceType(System.Int32)"
>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.GetAttendanceType(System.Int32)"
>
<summary>
<summary>
查询绩效考勤类型
查询绩效考勤类型
</summary>
</summary>
<param
name=
"allotId"
></param>
<param
name=
"allotId"
>
绩效月ID
</param>
<returns></returns>
<returns></returns>
</member>
</member>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.InsertAttendanceType(System.Int32,Performance.EntityModels.Other.AttendanceType)"
>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.InsertAttendanceType(System.Int32,Performance.EntityModels.Other.AttendanceType)"
>
<summary>
<summary>
新增或修改考勤类型
新增或修改考勤类型
</summary>
</summary>
<param
name=
"allotId"
></param>
<param
name=
"allotId"
>
绩效月ID
</param>
<param
name=
"attendanceType"
></param>
<param
name=
"attendanceType"
></param>
<returns></returns>
<returns></returns>
</member>
</member>
...
@@ -386,7 +386,7 @@
...
@@ -386,7 +386,7 @@
<summary>
<summary>
查询考勤记录
查询考勤记录
</summary>
</summary>
<param
name=
"allotId"
></param>
<param
name=
"allotId"
>
绩效月ID
</param>
<param
name=
"hospitalId"
></param>
<param
name=
"hospitalId"
></param>
<returns></returns>
<returns></returns>
</member>
</member>
...
@@ -394,7 +394,7 @@
...
@@ -394,7 +394,7 @@
<summary>
<summary>
批量插入考勤记录,插入前需要删除所有后重新插入
批量插入考勤记录,插入前需要删除所有后重新插入
</summary>
</summary>
<param
name=
"allotId"
></param>
<param
name=
"allotId"
>
绩效月ID
</param>
<param
name=
"hospitalId"
></param>
<param
name=
"hospitalId"
></param>
<param
name=
"request"
></param>
<param
name=
"request"
></param>
<returns></returns>
<returns></returns>
...
@@ -403,7 +403,7 @@
...
@@ -403,7 +403,7 @@
<summary>
<summary>
考勤-考勤记录表(添加)
考勤-考勤记录表(添加)
</summary>
</summary>
<param
name=
"allotId"
></param>
<param
name=
"allotId"
>
绩效月ID
</param>
<param
name=
"request"
></param>
<param
name=
"request"
></param>
<returns></returns>
<returns></returns>
</member>
</member>
...
@@ -411,7 +411,7 @@
...
@@ -411,7 +411,7 @@
<summary>
<summary>
考勤-考勤记录表(修改)
考勤-考勤记录表(修改)
</summary>
</summary>
<param
name=
"allotId"
></param>
<param
name=
"allotId"
>
绩效月ID
</param>
<param
name=
"request"
></param>
<param
name=
"request"
></param>
<returns></returns>
<returns></returns>
</member>
</member>
...
@@ -426,42 +426,42 @@
...
@@ -426,42 +426,42 @@
<summary>
<summary>
考勤-考勤记录表(全部删除)
考勤-考勤记录表(全部删除)
</summary>
</summary>
<param
name=
"allotId"
></param>
<param
name=
"allotId"
>
绩效月ID
</param>
<returns></returns>
<returns></returns>
</member>
</member>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.GetAttendanceStatistics(System.Int32)"
>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.GetAttendanceStatistics(System.Int32)"
>
<summary>
<summary>
考勤结果统计
考勤结果统计
</summary>
</summary>
<param
name=
"allotId"
></param>
<param
name=
"allotId"
>
绩效月ID
</param>
<returns></returns>
<returns></returns>
</member>
</member>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.DownloadVacation(System.Int32)"
>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.DownloadVacation(System.Int32)"
>
<summary>
<summary>
考勤记录下载
考勤记录下载
</summary>
</summary>
<param
name=
"allotId"
></param>
<param
name=
"allotId"
>
绩效月ID
</param>
<returns></returns>
<returns></returns>
</member>
</member>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.DownloadCallIn(System.Int32)"
>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.DownloadCallIn(System.Int32)"
>
<summary>
<summary>
调动记录下载
调动记录下载
</summary>
</summary>
<param
name=
"allotId"
></param>
<param
name=
"allotId"
>
绩效月ID
</param>
<returns></returns>
<returns></returns>
</member>
</member>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.DownloadStatistics(System.Int32)"
>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.DownloadStatistics(System.Int32)"
>
<summary>
<summary>
生成最终考勤结果下载
生成最终考勤结果下载
</summary>
</summary>
<param
name=
"allotId"
></param>
<param
name=
"allotId"
>
绩效月ID
</param>
<returns></returns>
<returns></returns>
</member>
</member>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.DownloadAuditDetail(System.Int32,System.String,System.String,System.String)"
>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.DownloadAuditDetail(System.Int32,System.String,System.String,System.String)"
>
<summary>
<summary>
科室确认详情(已下发结果展示列表)下载
科室确认详情(已下发结果展示列表)下载
</summary>
</summary>
<param
name=
"allotId"
></param>
<param
name=
"allotId"
>
绩效月ID
</param>
<param
name=
"unitType"
>
人员类别
</param>
<param
name=
"unitType"
>
人员类别
</param>
<param
name=
"accountingUnit"
>
核算单元
</param>
<param
name=
"accountingUnit"
>
核算单元
</param>
<returns></returns>
<returns></returns>
...
@@ -500,7 +500,7 @@
...
@@ -500,7 +500,7 @@
<summary>
<summary>
最终考勤结果下发
最终考勤结果下发
</summary>
</summary>
<param
name=
"allotId"
></param>
<param
name=
"allotId"
>
绩效月ID
</param>
<returns></returns>
<returns></returns>
</member>
</member>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.ChooseStatistics(Performance.DtoModels.Response.AttendanceIssueChoose)"
>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.ChooseStatistics(Performance.DtoModels.Response.AttendanceIssueChoose)"
>
...
@@ -510,6 +510,77 @@
...
@@ -510,6 +510,77 @@
<param
name=
"attendanceIssueChoose"
></param>
<param
name=
"attendanceIssueChoose"
></param>
<returns></returns>
<returns></returns>
</member>
</member>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.DeptAuditList(System.Int32,System.String,System.String,System.Nullable{System.Int32})"
>
<summary>
科室上报审核列表
</summary>
<param
name=
"allotId"
>
绩效月ID
</param>
<param
name=
"unitType"
>
核算组别
</param>
<param
name=
"accountingUnit"
>
核算单元
</param>
<param
name=
"state"
></param>
<returns></returns>
</member>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.DeptLoad(System.Int32)"
>
<summary>
科室考勤上报录入加载
</summary>
<param
name=
"allotId"
>
绩效月ID
</param>
<returns></returns>
</member>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.DeptSave(System.Int32,System.String,System.Collections.Generic.List{Performance.DtoModels.Request.AttendanceDept})"
>
<summary>
科室考勤上报录入保存
</summary>
<param
name=
"allotId"
>
绩效月ID
</param>
<param
name=
"unitType"
>
核算组别
</param>
<param
name=
"datas"
></param>
<returns></returns>
</member>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.DeptSubmit(System.Int32,System.String,System.Collections.Generic.List{Performance.DtoModels.Request.AttendanceDept})"
>
<summary>
科室考勤上报录入提交
</summary>
<param
name=
"allotId"
>
绩效月ID
</param>
<param
name=
"unitType"
>
核算组别
</param>
<param
name=
"datas"
></param>
<returns></returns>
</member>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.DeptRollback(System.Int32,System.String)"
>
<summary>
科室考勤上报录入撤回
</summary>
<param
name=
"allotId"
>
绩效月ID
</param>
<param
name=
"unitType"
>
核算组别
</param>
<returns></returns>
</member>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.DeptAudit(System.Int32,System.String,Performance.DtoModels.Request.AttendanceDeptAudit)"
>
<summary>
科室考勤上报结果审核
</summary>
<param
name=
"allotId"
>
绩效月ID
</param>
<param
name=
"unitType"
>
核算组别
</param>
<param
name=
"audit"
></param>
<returns></returns>
</member>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.DeptDetail(System.Int32,System.String,System.String)"
>
<summary>
科室考勤上报结果详情
</summary>
<param
name=
"allotId"
>
绩效月ID
</param>
<param
name=
"unitType"
>
核算组别
</param>
<param
name=
"accountingUnit"
>
核算单元
</param>
<returns></returns>
</member>
<member
name=
"M:Performance.Api.Controllers.AttendanceController.DeptDetailDownload(System.Int32,System.String,System.String,System.String)"
>
<summary>
科室考勤上报结果详情下载
</summary>
<param
name=
"allotId"
>
绩效月ID
</param>
<param
name=
"unitType"
>
核算组别
</param>
<param
name=
"accountingUnit"
>
核算单元
</param>
<param
name=
"fileName"
></param>
<returns></returns>
</member>
<member
name=
"M:Performance.Api.Controllers.BudgetController.Query(Performance.DtoModels.Request.BudgetRequest)"
>
<member
name=
"M:Performance.Api.Controllers.BudgetController.Query(Performance.DtoModels.Request.BudgetRequest)"
>
<summary>
<summary>
预算管理查询(包含金额、占比)
预算管理查询(包含金额、占比)
...
...
performance/Performance.Api/wwwroot/Performance.DtoModels.xml
View file @
07fb0ab9
...
@@ -177,6 +177,11 @@
...
@@ -177,6 +177,11 @@
<member
name=
"F:Performance.DtoModels.DataFormat.日期YYYYMMDD"
>
<member
name=
"F:Performance.DtoModels.DataFormat.日期YYYYMMDD"
>
<summary>
日期
</summary>
<summary>
日期
</summary>
</member>
</member>
<member
name=
"T:Performance.DtoModels.Attendance.Report"
>
<summary>
考勤上报
</summary>
</member>
<member
name=
"P:Performance.DtoModels.HistoryData.Year"
>
<member
name=
"P:Performance.DtoModels.HistoryData.Year"
>
<summary>
<summary>
年
年
...
@@ -2095,6 +2100,86 @@
...
@@ -2095,6 +2100,86 @@
<member
name=
"P:Performance.DtoModels.AprAmountMarkRequest.TypeInDepartments"
>
<member
name=
"P:Performance.DtoModels.AprAmountMarkRequest.TypeInDepartments"
>
<summary>
需要审计的科室,支持多个科室一起审计
</summary>
<summary>
需要审计的科室,支持多个科室一起审计
</summary>
</member>
</member>
<member
name=
"P:Performance.DtoModels.Request.AttendanceDeptAudit.State"
>
<summary>
状态(通过 = 3,驳回 = 4)
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Request.AttendanceDeptAudit.Remark"
>
<summary>
说明
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Request.AttendanceDept.PersonnelNumber"
>
<summary>
工号
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Request.AttendanceDept.PersonnelName"
>
<summary>
姓名
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Request.AttendanceDept.PermanentStaff"
>
<summary>
人员系数
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Request.AttendanceDept.Day01"
>
<summary>
01日
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Request.AttendanceDeptMore.AllotId"
>
<summary>
绩效Id
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Request.AttendanceDeptMore.Code"
>
<summary>
核算单元编码
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Request.AttendanceDeptMore.UnitType"
>
<summary>
人员类别
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Request.AttendanceDeptMore.AccountingUnit"
>
<summary>
核算单元
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Request.AttendanceDeptMore.State"
>
<summary>
状态(未提交 = 1,提交 = 2,通过 = 3,驳回 = 4)
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Request.AttendanceDeptMore.SubmitUser"
>
<summary>
提交用户
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Request.AttendanceDeptMore.SubmitTime"
>
<summary>
提交时间
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Request.AttendanceDeptMore.AuditUser"
>
<summary>
审核用户
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Request.AttendanceDeptMore.AuditTime"
>
<summary>
审核时间
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Request.AttendanceDeptMore.Remarks"
>
<summary>
备注
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Request.BatchRequest.Batch"
>
<member
name=
"P:Performance.DtoModels.Request.BatchRequest.Batch"
>
<summary>
<summary>
批次号
批次号
...
@@ -3103,6 +3188,71 @@
...
@@ -3103,6 +3188,71 @@
调入时间
调入时间
</summary>
</summary>
</member>
</member>
<member
name=
"P:Performance.DtoModels.Response.AttendanceDeptAuditList.Code"
>
<summary>
编码
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Response.AttendanceDeptAuditList.UnitType"
>
<summary>
核算组别
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Response.AttendanceDeptAuditList.AccountingUnit"
>
<summary>
核算单元
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Response.AttendanceDeptAuditList.Count"
>
<summary>
总下发数
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Response.AttendanceDeptAuditList.ConfirmCount"
>
<summary>
确认数
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Response.AttendanceDeptAuditList.FinishCount"
>
<summary>
通过数
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Response.AttendanceDeptAuditList.RejectCount"
>
<summary>
驳回数
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Response.AttendanceDeptAuditList.State"
>
<summary>
状态(未提交 = 1,提交 = 2,通过 = 3,驳回 = 4)
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Response.AttendanceDeptAuditList.SubmitUser"
>
<summary>
提交人
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Response.AttendanceDeptAuditList.SubmitTime"
>
<summary>
提交时间
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Response.AttendanceDeptAuditList.AuditUser"
>
<summary>
审核人
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Response.AttendanceDeptAuditList.AuditTime"
>
<summary>
审核时间
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Response.AttendanceDeptAuditList.Remarks"
>
<summary>
状态描述
</summary>
</member>
<member
name=
"P:Performance.DtoModels.Response.AttendanceIssueChoose.AllotId"
>
<member
name=
"P:Performance.DtoModels.Response.AttendanceIssueChoose.AllotId"
>
<summary>
<summary>
绩效Id
绩效Id
...
...
performance/Performance.Api/wwwroot/Performance.EntityModels.xml
View file @
07fb0ab9
...
@@ -6123,6 +6123,86 @@
...
@@ -6123,6 +6123,86 @@
人员系数
人员系数
</summary>
</summary>
</member>
</member>
<member
name=
"P:Performance.EntityModels.Entity.per_attendance_dept.Id"
>
<summary>
自增主键
</summary>
</member>
<member
name=
"P:Performance.EntityModels.Entity.per_attendance_dept.HospitalId"
>
<summary>
医院Id,可空
</summary>
</member>
<member
name=
"P:Performance.EntityModels.Entity.per_attendance_dept.AllotId"
>
<summary>
绩效Id
</summary>
</member>
<member
name=
"P:Performance.EntityModels.Entity.per_attendance_dept.PersonnelNumber"
>
<summary>
工号
</summary>
</member>
<member
name=
"P:Performance.EntityModels.Entity.per_attendance_dept.PersonnelName"
>
<summary>
姓名
</summary>
</member>
<member
name=
"P:Performance.EntityModels.Entity.per_attendance_dept.PermanentStaff"
>
<summary>
人员系数
</summary>
</member>
<member
name=
"P:Performance.EntityModels.Entity.per_attendance_dept.Code"
>
<summary>
核算单元编码
</summary>
</member>
<member
name=
"P:Performance.EntityModels.Entity.per_attendance_dept.UnitType"
>
<summary>
人员类别
</summary>
</member>
<member
name=
"P:Performance.EntityModels.Entity.per_attendance_dept.AccountingUnit"
>
<summary>
核算单元
</summary>
</member>
<member
name=
"P:Performance.EntityModels.Entity.per_attendance_dept.State"
>
<summary>
状态(未提交 = 0,提交 = 1,通过 = 2,驳回 = 3)
</summary>
</member>
<member
name=
"P:Performance.EntityModels.Entity.per_attendance_dept.SubmitUser"
>
<summary>
提交用户
</summary>
</member>
<member
name=
"P:Performance.EntityModels.Entity.per_attendance_dept.SubmitTime"
>
<summary>
提交时间
</summary>
</member>
<member
name=
"P:Performance.EntityModels.Entity.per_attendance_dept.AuditUser"
>
<summary>
审核用户
</summary>
</member>
<member
name=
"P:Performance.EntityModels.Entity.per_attendance_dept.AuditTime"
>
<summary>
审核时间
</summary>
</member>
<member
name=
"P:Performance.EntityModels.Entity.per_attendance_dept.Remarks"
>
<summary>
备注
</summary>
</member>
<member
name=
"P:Performance.EntityModels.Entity.per_attendance_dept.Day01"
>
<summary>
01日
</summary>
</member>
<member
name=
"P:Performance.EntityModels.Entity.per_attendance_issue.HospitalId"
>
<member
name=
"P:Performance.EntityModels.Entity.per_attendance_issue.HospitalId"
>
<summary>
<summary>
医院Id
医院Id
...
...
performance/Performance.DtoModels/Enum.cs
View file @
07fb0ab9
...
@@ -124,6 +124,16 @@ public enum State
...
@@ -124,6 +124,16 @@ public enum State
确认
=
2
,
确认
=
2
,
驳回
=
3
,
驳回
=
3
,
}
}
/// <summary>
/// 考勤上报
/// </summary>
public
enum
Report
{
未提交
=
1
,
提交
=
2
,
通过
=
3
,
驳回
=
4
,
}
public
enum
OperationType
public
enum
OperationType
{
{
全部
=
0
,
全部
=
0
,
...
...
performance/Performance.DtoModels/Request/AttendanceDept.cs
0 → 100644
View file @
07fb0ab9
using
System
;
using
System.Collections.Generic
;
namespace
Performance.DtoModels.Request
{
public
class
AttendanceDeptAudit
{
/// <summary>
/// 状态(通过 = 3,驳回 = 4)
/// </summary>
public
int
State
{
get
;
set
;
}
/// <summary>
/// 说明
/// </summary>
public
string
Remark
{
get
;
set
;
}
}
public
class
AttendanceDept
{
/// <summary>
/// 工号
/// </summary>
public
string
PersonnelNumber
{
get
;
set
;
}
/// <summary>
/// 姓名
/// </summary>
public
string
PersonnelName
{
get
;
set
;
}
/// <summary>
/// 人员系数
/// </summary>
public
decimal
?
PermanentStaff
{
get
;
set
;
}
/// <summary>
/// 01日
/// </summary>
public
string
Day01
{
get
;
set
;
}
public
string
Day02
{
get
;
set
;
}
public
string
Day03
{
get
;
set
;
}
public
string
Day04
{
get
;
set
;
}
public
string
Day05
{
get
;
set
;
}
public
string
Day06
{
get
;
set
;
}
public
string
Day07
{
get
;
set
;
}
public
string
Day08
{
get
;
set
;
}
public
string
Day09
{
get
;
set
;
}
public
string
Day10
{
get
;
set
;
}
public
string
Day11
{
get
;
set
;
}
public
string
Day12
{
get
;
set
;
}
public
string
Day13
{
get
;
set
;
}
public
string
Day14
{
get
;
set
;
}
public
string
Day15
{
get
;
set
;
}
public
string
Day16
{
get
;
set
;
}
public
string
Day17
{
get
;
set
;
}
public
string
Day18
{
get
;
set
;
}
public
string
Day19
{
get
;
set
;
}
public
string
Day20
{
get
;
set
;
}
public
string
Day21
{
get
;
set
;
}
public
string
Day22
{
get
;
set
;
}
public
string
Day23
{
get
;
set
;
}
public
string
Day24
{
get
;
set
;
}
public
string
Day25
{
get
;
set
;
}
public
string
Day26
{
get
;
set
;
}
public
string
Day27
{
get
;
set
;
}
public
string
Day28
{
get
;
set
;
}
public
string
Day29
{
get
;
set
;
}
public
string
Day30
{
get
;
set
;
}
public
string
Day31
{
get
;
set
;
}
}
public
class
AttendanceDeptMore
:
AttendanceDept
{
/// <summary>
/// 绩效Id
/// </summary>
public
int
AllotId
{
get
;
set
;
}
/// <summary>
/// 核算单元编码
/// </summary>
public
string
Code
{
get
;
set
;
}
/// <summary>
/// 人员类别
/// </summary>
public
string
UnitType
{
get
;
set
;
}
/// <summary>
/// 核算单元
/// </summary>
public
string
AccountingUnit
{
get
;
set
;
}
/// <summary>
/// 状态(未提交 = 1,提交 = 2,通过 = 3,驳回 = 4)
/// </summary>
public
int
State
{
get
;
set
;
}
/// <summary>
/// 提交用户
/// </summary>
public
string
SubmitUser
{
get
;
set
;
}
/// <summary>
/// 提交时间
/// </summary>
public
DateTime
?
SubmitTime
{
get
;
set
;
}
/// <summary>
/// 审核用户
/// </summary>
public
string
AuditUser
{
get
;
set
;
}
/// <summary>
/// 审核时间
/// </summary>
public
DateTime
?
AuditTime
{
get
;
set
;
}
/// <summary>
/// 备注
/// </summary>
public
string
Remarks
{
get
;
set
;
}
}
public
class
AttendanceDeptDetail
{
public
List
<
TColumn
>
Columns
{
get
;
set
;
}
public
List
<
AttendanceDeptMore
>
Data
{
get
;
set
;
}
}
}
performance/Performance.DtoModels/Response/AttendanceDeptAuditList.cs
0 → 100644
View file @
07fb0ab9
using
System
;
namespace
Performance.DtoModels.Response
{
public
class
AttendanceDeptAuditList
{
/// <summary>
/// 编码
/// </summary>
public
string
Code
{
get
;
set
;
}
/// <summary>
/// 核算组别
/// </summary>
public
string
UnitType
{
get
;
set
;
}
/// <summary>
/// 核算单元
/// </summary>
public
string
AccountingUnit
{
get
;
set
;
}
/// <summary>
/// 总下发数
/// </summary>
public
int
Count
{
get
;
set
;
}
/// <summary>
/// 确认数
/// </summary>
public
int
ConfirmCount
{
get
;
set
;
}
/// <summary>
/// 通过数
/// </summary>
public
int
FinishCount
{
get
;
set
;
}
/// <summary>
/// 驳回数
/// </summary>
public
int
RejectCount
{
get
;
set
;
}
/// <summary>
/// 状态(未提交 = 1,提交 = 2,通过 = 3,驳回 = 4)
/// </summary>
public
int
State
{
get
;
set
;
}
/// <summary>
/// 提交人
/// </summary>
public
string
SubmitUser
{
get
;
set
;
}
/// <summary>
/// 提交时间
/// </summary>
public
DateTime
?
SubmitTime
{
get
;
set
;
}
/// <summary>
/// 审核人
/// </summary>
public
string
AuditUser
{
get
;
set
;
}
/// <summary>
/// 审核时间
/// </summary>
public
DateTime
?
AuditTime
{
get
;
set
;
}
/// <summary>
/// 状态描述
/// </summary>
public
string
Remarks
{
get
;
set
;
}
}
}
performance/Performance.DtoModels/TColumn.cs
0 → 100644
View file @
07fb0ab9
namespace
Performance.DtoModels
{
public
class
TColumn
{
public
TColumn
()
{
}
public
TColumn
(
string
field
,
string
title
,
int
width
=
80
,
string
@fixed
=
""
,
bool
sortable
=
false
)
{
Field
=
field
;
Title
=
title
;
Width
=
width
;
Fixed
=
@fixed
;
Sortable
=
sortable
;
}
public
string
Field
{
get
;
set
;
}
public
string
Title
{
get
;
set
;
}
public
int
Width
{
get
;
set
;
}
public
string
Fixed
{
get
;
set
;
}
public
bool
Sortable
{
get
;
set
;
}
}
}
performance/Performance.EntityModels/Context/PerformanceDbContext.cs
View file @
07fb0ab9
...
@@ -254,6 +254,7 @@ public PerformanceDbContext(DbContextOptions<PerformanceDbContext> options)
...
@@ -254,6 +254,7 @@ public PerformanceDbContext(DbContextOptions<PerformanceDbContext> options)
public
virtual
DbSet
<
sys_user_role
>
sys_user_role
{
get
;
set
;
}
public
virtual
DbSet
<
sys_user_role
>
sys_user_role
{
get
;
set
;
}
public
virtual
DbSet
<
sys_version
>
sys_version
{
get
;
set
;
}
public
virtual
DbSet
<
sys_version
>
sys_version
{
get
;
set
;
}
public
virtual
DbSet
<
per_attendance
>
per_attendance
{
get
;
set
;
}
public
virtual
DbSet
<
per_attendance
>
per_attendance
{
get
;
set
;
}
public
virtual
DbSet
<
per_attendance_dept
>
per_attendance_dept
{
get
;
set
;
}
public
virtual
DbSet
<
per_attendance_issue
>
per_attendance_issue
{
get
;
set
;
}
public
virtual
DbSet
<
per_attendance_issue
>
per_attendance_issue
{
get
;
set
;
}
public
virtual
DbSet
<
per_attendance_type
>
per_attendance_type
{
get
;
set
;
}
public
virtual
DbSet
<
per_attendance_type
>
per_attendance_type
{
get
;
set
;
}
public
virtual
DbSet
<
per_attendance_vacation
>
per_attendance_vacation
{
get
;
set
;
}
public
virtual
DbSet
<
per_attendance_vacation
>
per_attendance_vacation
{
get
;
set
;
}
...
...
performance/Performance.EntityModels/Entity/per_attendance_dept.cs
0 → 100644
View file @
07fb0ab9
using
System
;
using
System.ComponentModel.DataAnnotations
;
using
System.ComponentModel.DataAnnotations.Schema
;
namespace
Performance.EntityModels.Entity
{
[
Table
(
"per_attendance_dept"
)]
public
class
per_attendance_dept
{
/// <summary>
/// 自增主键
/// </summary>
[
Key
]
public
int
Id
{
get
;
set
;
}
/// <summary>
/// 医院Id,可空
/// </summary>
public
int
?
HospitalId
{
get
;
set
;
}
/// <summary>
/// 绩效Id
/// </summary>
public
int
AllotId
{
get
;
set
;
}
/// <summary>
/// 工号
/// </summary>
public
string
PersonnelNumber
{
get
;
set
;
}
/// <summary>
/// 姓名
/// </summary>
public
string
PersonnelName
{
get
;
set
;
}
/// <summary>
/// 人员系数
/// </summary>
public
decimal
?
PermanentStaff
{
get
;
set
;
}
/// <summary>
/// 核算单元编码
/// </summary>
public
string
Code
{
get
;
set
;
}
/// <summary>
/// 人员类别
/// </summary>
public
string
UnitType
{
get
;
set
;
}
/// <summary>
/// 核算单元
/// </summary>
public
string
AccountingUnit
{
get
;
set
;
}
/// <summary>
/// 状态(未提交 = 0,提交 = 1,通过 = 2,驳回 = 3)
/// </summary>
public
int
State
{
get
;
set
;
}
/// <summary>
/// 提交用户
/// </summary>
public
string
SubmitUser
{
get
;
set
;
}
/// <summary>
/// 提交时间
/// </summary>
public
DateTime
?
SubmitTime
{
get
;
set
;
}
/// <summary>
/// 审核用户
/// </summary>
public
string
AuditUser
{
get
;
set
;
}
/// <summary>
/// 审核时间
/// </summary>
public
DateTime
?
AuditTime
{
get
;
set
;
}
/// <summary>
/// 备注
/// </summary>
public
string
Remarks
{
get
;
set
;
}
/// <summary>
/// 01日
/// </summary>
public
int
?
Day01
{
get
;
set
;
}
public
int
?
Day02
{
get
;
set
;
}
public
int
?
Day03
{
get
;
set
;
}
public
int
?
Day04
{
get
;
set
;
}
public
int
?
Day05
{
get
;
set
;
}
public
int
?
Day06
{
get
;
set
;
}
public
int
?
Day07
{
get
;
set
;
}
public
int
?
Day08
{
get
;
set
;
}
public
int
?
Day09
{
get
;
set
;
}
public
int
?
Day10
{
get
;
set
;
}
public
int
?
Day11
{
get
;
set
;
}
public
int
?
Day12
{
get
;
set
;
}
public
int
?
Day13
{
get
;
set
;
}
public
int
?
Day14
{
get
;
set
;
}
public
int
?
Day15
{
get
;
set
;
}
public
int
?
Day16
{
get
;
set
;
}
public
int
?
Day17
{
get
;
set
;
}
public
int
?
Day18
{
get
;
set
;
}
public
int
?
Day19
{
get
;
set
;
}
public
int
?
Day20
{
get
;
set
;
}
public
int
?
Day21
{
get
;
set
;
}
public
int
?
Day22
{
get
;
set
;
}
public
int
?
Day23
{
get
;
set
;
}
public
int
?
Day24
{
get
;
set
;
}
public
int
?
Day25
{
get
;
set
;
}
public
int
?
Day26
{
get
;
set
;
}
public
int
?
Day27
{
get
;
set
;
}
public
int
?
Day28
{
get
;
set
;
}
public
int
?
Day29
{
get
;
set
;
}
public
int
?
Day30
{
get
;
set
;
}
public
int
?
Day31
{
get
;
set
;
}
}
}
\ No newline at end of file
performance/Performance.EntityModels/Other/AccountUnit.cs
0 → 100644
View file @
07fb0ab9
namespace
Performance.EntityModels
{
public
class
AccountUnit
{
public
string
AccountingUnit
{
get
;
set
;
}
public
string
UnitType
{
get
;
set
;
}
}
}
performance/Performance.Infrastructure/Extensions/Extensions.ExcelWorksheet.cs
0 → 100644
View file @
07fb0ab9
using
System
;
using
System.Collections.Generic
;
using
System.Data
;
using
System.IO
;
using
System.Linq
;
using
OfficeOpenXml
;
using
OfficeOpenXml.Style
;
using
Performance.Infrastructure
;
public
interface
IChildren
<
T
>
{
IEnumerable
<
T
>
Children
{
get
;
set
;
}
}
public
class
EColumn
:
IChildren
<
EColumn
>
{
public
EColumn
(
string
label
,
string
name
,
decimal
sort
=
0
m
,
IEnumerable
<
EColumn
>?
children
=
null
,
string
comment
=
""
)
{
Label
=
label
;
Name
=
name
;
Sort
=
sort
;
Comment
=
comment
;
Children
=
children
??
new
HashSet
<
EColumn
>();
}
public
string
Label
{
get
;
set
;
}
public
string
Name
{
get
;
set
;
}
public
string
Comment
{
get
;
set
;
}
public
decimal
Sort
{
get
;
set
;
}
public
IEnumerable
<
EColumn
>
Children
{
get
;
set
;
}
}
public
class
ExcelDownloadRequest
{
/// <summary>
/// 工作表名
/// </summary>
public
string
Name
{
get
;
set
;
}
/// <summary>
/// 数据
/// </summary>
public
List
<
Dictionary
<
string
,
object
>>
Rows
{
get
;
set
;
}
/// <summary>
/// 列头
/// </summary>
public
IEnumerable
<
EColumn
>
Columns
{
get
;
set
;
}
/// <summary>
/// 不需要导出的列
/// </summary>
public
string
[]
IgnoreColumns
{
get
;
set
;
}
=
new
string
[
0
];
}
public
static
partial
class
UtilExtensions
{
public
static
DataTable
Read
(
this
ExcelPackage
package
,
string
name
,
int
startRow
=
1
,
int
startCol
=
1
)
{
if
(
package
is
null
)
throw
new
ArgumentNullException
(
nameof
(
package
));
if
(!
package
.
Workbook
.
Worksheets
.
Any
(
w
=>
w
.
Name
==
name
))
return
package
.
Read
(
0
);
var
worksheet
=
package
.
Workbook
.
Worksheets
[
name
];
return
Read
(
worksheet
,
startRow
,
startCol
);
}
public
static
DataTable
Read
(
this
ExcelPackage
package
,
int
index
,
int
startRow
=
1
,
int
startCol
=
1
)
{
if
(
package
is
null
)
throw
new
ArgumentNullException
(
nameof
(
package
));
if
(
package
.
Workbook
.
Worksheets
.
Count
<=
index
)
throw
new
IndexOutOfRangeException
(
nameof
(
index
));
var
worksheet
=
package
.
Workbook
.
Worksheets
[
index
];
return
Read
(
worksheet
,
startRow
,
startCol
);
}
public
static
bool
TryRead
(
this
ExcelWorksheet
ws
,
out
DataTable
table
,
int
startRow
=
1
,
int
startCol
=
1
)
{
table
=
new
DataTable
();
try
{
table
=
Read
(
ws
,
startRow
,
startCol
);
return
true
;
}
catch
{
}
return
false
;
}
public
static
DataTable
Read
(
this
ExcelWorksheet
ws
,
int
startRow
=
1
,
int
startCol
=
1
)
{
var
table
=
new
DataTable
();
foreach
(
var
firstRowCell
in
ws
.
Cells
[
startRow
,
startCol
,
1
,
ws
.
Dimension
.
End
.
Column
])
{
var
name
=
!
string
.
IsNullOrEmpty
(
firstRowCell
.
Text
)
?
firstRowCell
.
Text
:
string
.
Format
(
"EColumn {0}"
,
firstRowCell
.
Start
.
Column
);
if
(!
string
.
IsNullOrEmpty
(
name
)
&&
table
.
Columns
.
Contains
(
name
))
throw
new
Exception
(
"重复列名"
+
name
);
table
.
Columns
.
Add
(
name
);
}
for
(
var
rowNum
=
startRow
+
1
;
rowNum
<=
ws
.
Dimension
.
End
.
Row
;
rowNum
++)
{
var
wsRow
=
ws
.
Cells
[
rowNum
,
1
,
rowNum
,
ws
.
Dimension
.
End
.
Column
];
var
row
=
table
.
NewRow
();
foreach
(
var
cell
in
wsRow
)
{
if
(
table
.
Columns
.
Count
>=
cell
.
Start
.
Column
)
row
[
cell
.
Start
.
Column
-
1
]
=
cell
.
Value
?.
ToString
()?.
Trim
()?.
Clean
()
??
""
;
}
table
.
Rows
.
Add
(
row
);
}
return
table
;
}
/// <summary>
/// 修改列头
/// </summary>
/// <param name="updateHead">修改列头名称</param>
/// <returns></returns>
public
static
List
<
string
>
UpdateHeads
(
this
DataTable
dt
,
Dictionary
<
string
,
string
>
updateHead
)
{
List
<
string
>
heads
=
new
List
<
string
>();
for
(
int
i
=
0
;
i
<
dt
.
Columns
.
Count
;
i
++)
{
if
(
updateHead
.
ContainsKey
(
dt
.
Columns
[
i
].
ColumnName
))
dt
.
Columns
[
i
].
ColumnName
=
updateHead
[
dt
.
Columns
[
i
].
ColumnName
];
heads
.
Add
(
dt
.
Columns
[
i
].
ColumnName
);
}
return
heads
;
}
/// <summary>
/// 数据表转键值对集合
/// 把DataTable转成 List集合, 存每一行
/// 集合中放的是键值对字典,存每一列 ,键/值相同
/// </summary>
/// <param name="dt">数据表</param>
/// <returns>哈希表数组</returns>
public
static
List
<
Dictionary
<
string
,
object
>>
ToListDictionary
(
this
DataTable
dt
)
{
List
<
Dictionary
<
string
,
object
>>
list
=
new
List
<
Dictionary
<
string
,
object
>>();
foreach
(
DataRow
dr
in
dt
.
Rows
)
{
Dictionary
<
string
,
object
>
dic
=
new
Dictionary
<
string
,
object
>();
foreach
(
DataColumn
dc
in
dt
.
Columns
)
{
dic
.
Add
(
dc
.
ColumnName
,
dr
[
dc
.
ColumnName
]);
}
list
.
Add
(
dic
);
}
return
list
;
}
public
static
bool
Export
(
string
filepath
,
params
ExcelDownloadRequest
[]
contents
)
{
return
Export
(
contents
.
ToList
(),
filepath
);
}
/// <summary>
/// 导出Excel
/// </summary>
/// <param name="data"></param>
/// <param name="filepath">路径</param>
/// <returns></returns>
public
static
bool
Export
(
List
<
ExcelDownloadRequest
>
data
,
string
filepath
)
{
FileHelper
.
CreateFile
(
filepath
);
using
(
Stream
newStream
=
new
FileStream
(
filepath
,
FileMode
.
Create
))
{
using
(
ExcelPackage
package
=
new
ExcelPackage
(
newStream
))
{
foreach
(
var
item
in
data
)
{
if
(
package
.
Workbook
.
Worksheets
.
Any
(
t
=>
t
.
Name
==
item
.
Name
))
package
.
Workbook
.
Worksheets
.
Delete
(
item
.
Name
);
var
worksheet
=
package
.
Workbook
.
Worksheets
.
Add
(
item
.
Name
);
CreateWorksheet
(
worksheet
,
item
);
}
package
.
Save
();
return
true
;
}
}
}
/// <summary>
/// 导出Excel
/// </summary>
/// <param name="worksheet"></param>
/// <param name="excelDownloadRequest"></param>
public
static
void
CreateWorksheet
(
ExcelWorksheet
worksheet
,
ExcelDownloadRequest
excelDownloadRequest
)
{
excelDownloadRequest
.
Rows
=
excelDownloadRequest
.
Rows
??
new
List
<
Dictionary
<
string
,
object
>>
{
};
//获取列头最大行
List
<
int
>
all
=
new
List
<
int
>();
GetTreeCount
(
excelDownloadRequest
.
Columns
,
all
);
int
headRow
=
all
.
Max
();
//获取列头
var
headList
=
GetHeads
(
excelDownloadRequest
.
Columns
.
OrderBy
(
t
=>
t
.
Sort
),
excelDownloadRequest
.
IgnoreColumns
);
//生成列头
GenerateHeads
(
worksheet
,
excelDownloadRequest
.
Columns
,
excelDownloadRequest
.
IgnoreColumns
,
headRow
);
for
(
int
col
=
0
;
col
<
headList
.
Count
;
col
++)
{
for
(
int
row
=
0
;
row
<
excelDownloadRequest
.
Rows
.
Count
;
row
++)
{
var
temp
=
excelDownloadRequest
.
Rows
.
ElementAt
(
row
);
if
(
temp
.
ContainsKey
(
headList
[
col
].
Name
))
worksheet
.
Cells
[
row
+
headRow
+
1
,
col
+
1
].
Value
=
temp
[
headList
[
col
].
Name
]
??
""
;
}
}
#
region
样式设置
for
(
int
row
=
worksheet
.
Dimension
.
Start
.
Row
;
row
<=
worksheet
.
Dimension
.
End
.
Row
;
row
++)
{
worksheet
.
Row
(
row
).
Height
=
20
;
for
(
int
col
=
worksheet
.
Dimension
.
Start
.
Column
;
col
<=
worksheet
.
Dimension
.
End
.
Column
;
col
++)
{
worksheet
.
Cells
[
row
,
col
].
Style
.
VerticalAlignment
=
ExcelVerticalAlignment
.
Center
;
worksheet
.
Cells
[
row
,
col
].
Style
.
HorizontalAlignment
=
ExcelHorizontalAlignment
.
Center
;
worksheet
.
Cells
[
row
,
col
].
Style
.
Border
.
BorderAround
(
ExcelBorderStyle
.
Thin
);
}
}
worksheet
.
View
.
FreezePanes
(
headRow
+
1
,
1
);
worksheet
.
Cells
.
AutoFitColumns
();
for
(
int
col
=
worksheet
.
Dimension
.
Start
.
Column
;
col
<=
worksheet
.
Dimension
.
End
.
Column
;
col
++)
{
worksheet
.
Column
(
col
).
Width
=
worksheet
.
Column
(
col
).
Width
>
20
?
20
:
worksheet
.
Column
(
col
).
Width
;
}
#
endregion
}
/// <summary>
/// 获得列头
/// </summary>
/// <param name="columns"></param>
/// <param name="ignoreColumns"></param>
/// <returns></returns>
private
static
List
<
EColumn
>
GetHeads
(
IEnumerable
<
EColumn
>
columns
,
string
[]
ignoreColumns
)
{
List
<
EColumn
>
heads
=
new
List
<
EColumn
>();
foreach
(
var
item
in
columns
.
OrderBy
(
w
=>
w
.
Sort
))
{
if
(!
ignoreColumns
.
Contains
(
item
.
Name
)
&&
!
ignoreColumns
.
Contains
(
item
.
Label
))
{
if
(
item
.
Children
?.
Any
()
!=
true
)
heads
.
Add
(
item
);
else
heads
.
AddRange
(
GetHeads
(
item
.
Children
,
ignoreColumns
));
}
}
return
heads
;
}
/// <summary>
/// 生成excel列头
/// </summary>
/// <param name="worksheet"></param>
/// <param name="columns"></param>
/// <param name="ignoreColumns"></param>
/// <param name="headRow"></param>
/// <param name="row"></param>
/// <param name="col"></param>
private
static
void
GenerateHeads
(
ExcelWorksheet
worksheet
,
IEnumerable
<
EColumn
>
columns
,
string
[]
ignoreColumns
,
int
headRow
,
int
row
=
1
,
int
col
=
1
)
{
int
colIndex
=
col
;
foreach
(
var
item
in
columns
.
OrderBy
(
w
=>
w
.
Sort
))
{
if
(!
ignoreColumns
.
Contains
(
item
.
Label
)
&&
!
ignoreColumns
.
Contains
(
item
.
Name
))
{
int
children
=
GetMinChildCount
(
item
.
Children
,
0
);
worksheet
.
Cells
[
row
,
colIndex
].
Value
=
string
.
IsNullOrEmpty
(
item
.
Label
)
?
item
.
Name
:
item
.
Label
;
if
(!
string
.
IsNullOrWhiteSpace
(
item
.
Comment
))
worksheet
.
Cells
[
row
,
colIndex
].
AddComment
(
item
.
Comment
,
"SYSTEM"
);
worksheet
.
Cells
[
row
,
colIndex
].
Style
.
Font
.
Bold
=
true
;
if
(
children
!=
0
)
{
worksheet
.
Cells
[
row
,
colIndex
,
row
,
colIndex
+
children
-
1
].
Merge
=
true
;
GenerateHeads
(
worksheet
,
item
.
Children
,
ignoreColumns
,
headRow
,
row
+
1
,
colIndex
);
colIndex
+=
children
;
}
else
{
worksheet
.
Cells
[
row
,
colIndex
,
headRow
,
colIndex
].
Merge
=
true
;
colIndex
++;
}
}
}
}
/// <summary>
/// 获取树最大深度
/// </summary>
/// <param name="columns"></param>
/// <param name="all"></param>
/// <param name="level"></param>
private
static
void
GetTreeCount
(
IEnumerable
<
EColumn
>
columns
,
List
<
int
>
all
,
int
level
=
1
)
{
foreach
(
var
item
in
columns
)
{
if
(
item
.
Children
?.
Any
()
==
true
)
{
GetTreeCount
(
item
.
Children
,
all
,
level
+
1
);
}
else
all
.
Add
(
level
);
}
}
/// <summary>
/// 获得最小的子集数量
/// </summary>
/// <param name="columns"></param>
/// <param name="count"></param>
/// <returns></returns>
private
static
int
GetMinChildCount
(
IEnumerable
<
EColumn
>
columns
,
int
count
)
{
foreach
(
var
col
in
columns
)
{
if
(
col
.
Children
?.
Any
()
!=
true
)
count
++;
else
count
=
GetMinChildCount
(
col
.
Children
,
count
);
}
return
count
;
}
}
\ No newline at end of file
performance/Performance.Infrastructure/Extensions/Extensions.String.cs
View file @
07fb0ab9
...
@@ -2,51 +2,58 @@
...
@@ -2,51 +2,58 @@
using
System.Collections.Generic
;
using
System.Collections.Generic
;
using
System.Text
;
using
System.Text
;
namespace
Performance.Infrastructure
public
static
partial
class
UtilExtensions
{
{
public
static
partial
class
UtilExtensions
public
static
string
RemoveLineBreak
(
this
string
text
)
{
return
text
.
Replace
(
"\n"
,
""
);
}
public
static
string
RemoveEnter
(
this
string
text
)
{
{
public
static
string
RemoveLineBreak
(
this
string
text
)
return
text
.
Replace
(
"\r"
,
""
);
{
}
return
text
.
Replace
(
"\n"
,
""
);
public
static
string
RemoveSpace
(
this
string
text
)
}
{
return
text
.
Replace
(
" "
,
""
);
}
public
static
string
RemoveEnter
(
this
string
text
)
public
static
string
Clean
(
this
string
text
)
{
{
return
text
.
Replace
(
"\r"
,
""
);
return
text
.
Trim
().
RemoveEnter
().
RemoveLineBreak
().
RemoveSpace
(
);
}
}
/// <summary>
/// <summary>
/// 分隔 移除空项
/// 分隔 移除空项
/// </summary>
/// </summary>
/// <param name="text"></param>
/// <param name="text"></param>
/// <param name="separator"></param>
/// <param name="separator"></param>
/// <returns></returns>
/// <returns></returns>
public
static
string
[]
SplitRemoveEmpty
(
this
string
text
,
params
string
[]
separator
)
public
static
string
[]
SplitRemoveEmpty
(
this
string
text
,
params
string
[]
separator
)
{
{
return
text
.
Split
(
separator
,
StringSplitOptions
.
RemoveEmptyEntries
);
return
text
.
Split
(
separator
,
StringSplitOptions
.
RemoveEmptyEntries
);
}
}
/// <summary>
/// <summary>
/// 确定此字符串实例的开头是否与指定的匹配 忽略字母的大小写
/// 确定此字符串实例的开头是否与指定的匹配 忽略字母的大小写
/// </summary>
/// </summary>
/// <param name="text"></param>
/// <param name="text"></param>
/// <param name="value"></param>
/// <param name="value"></param>
/// <returns></returns>
/// <returns></returns>
public
static
bool
StartsWithIgnoreCase
(
this
string
text
,
string
value
)
public
static
bool
StartsWithIgnoreCase
(
this
string
text
,
string
value
)
{
{
return
text
.
StartsWith
(
value
,
StringComparison
.
OrdinalIgnoreCase
);
return
text
.
StartsWith
(
value
,
StringComparison
.
OrdinalIgnoreCase
);
}
}
/// <summary>
/// <summary>
/// 确定此字符串是否与指定的字符串对象具有相同的值 忽略字母的大小写
/// 确定此字符串是否与指定的字符串对象具有相同的值 忽略字母的大小写
/// </summary>
/// </summary>
/// <param name="text"></param>
/// <param name="text"></param>
/// <param name="value"></param>
/// <param name="value"></param>
/// <returns></returns>
/// <returns></returns>
public
static
bool
EqualsIgnoreCase
(
this
string
text
,
string
value
)
public
static
bool
EqualsIgnoreCase
(
this
string
text
,
string
value
)
{
{
return
text
.
Equals
(
value
,
StringComparison
.
OrdinalIgnoreCase
);
return
text
.
Equals
(
value
,
StringComparison
.
OrdinalIgnoreCase
);
}
}
}
}
}
performance/Performance.Repository/PerforPeremployeeRepository.cs
View file @
07fb0ab9
...
@@ -29,6 +29,14 @@ public new PageList<per_employee> GetEntitiesForPaging(int pageNumber, int pageS
...
@@ -29,6 +29,14 @@ public new PageList<per_employee> GetEntitiesForPaging(int pageNumber, int pageS
return
PageList
<
per_employee
>.
Create
(
queryableAuthors
,
pageNumber
,
pageSize
);
return
PageList
<
per_employee
>.
Create
(
queryableAuthors
,
pageNumber
,
pageSize
);
}
}
public
new
List
<
AccountUnit
>
GetEmployeeUnit
(
Expression
<
Func
<
per_employee
,
bool
>>
exp
)
{
return
context
.
Set
<
per_employee
>()
.
Where
(
exp
)
.
Select
(
w
=>
new
AccountUnit
{
UnitType
=
w
.
UnitType
,
AccountingUnit
=
w
.
AccountingUnit
})
.
Distinct
()
.
ToList
();
}
//public Comparison GetComparison(ComparisonPagingRequest request)
//public Comparison GetComparison(ComparisonPagingRequest request)
//{
//{
...
...
performance/Performance.Repository/Repository/PerforPerAttendanceDeptRepository.cs
0 → 100644
View file @
07fb0ab9
using
Performance.EntityModels
;
using
Performance.EntityModels.Entity
;
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Text
;
using
System.Threading.Tasks
;
namespace
Performance.Repository.Repository
{
public
partial
class
PerforPerAttendanceDeptRepository
:
PerforRepository
<
per_attendance_dept
>
{
/// <summary>
/// per_attendance Repository
/// </summary>
public
PerforPerAttendanceDeptRepository
(
PerformanceDbContext
context
)
:
base
(
context
)
{
}
}
}
performance/Performance.Services/AttendanceService.cs
View file @
07fb0ab9
...
@@ -4,11 +4,18 @@
...
@@ -4,11 +4,18 @@
using
MassTransit.Internals.Extensions
;
using
MassTransit.Internals.Extensions
;
using
Microsoft.AspNetCore.Routing
;
using
Microsoft.AspNetCore.Routing
;
using
Microsoft.Extensions.Logging
;
using
Microsoft.Extensions.Logging
;
using
MySqlX.XDevAPI.Common
;
using
Newtonsoft.Json
;
using
Newtonsoft.Json
;
using
NPOI.SS.UserModel
;
using
OfficeOpenXml
;
using
OfficeOpenXml
;
using
OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime
;
using
OfficeOpenXml.Style
;
using
OfficeOpenXml.Style
;
using
Org.BouncyCastle.Utilities
;
using
Performance.DtoModels
;
using
Performance.DtoModels
;
using
Performance.DtoModels.Request
;
using
Performance.DtoModels.Response
;
using
Performance.DtoModels.Response
;
using
Performance.DtoModels.Second
;
using
Performance.EntityModels
;
using
Performance.EntityModels.Entity
;
using
Performance.EntityModels.Entity
;
using
Performance.EntityModels.Other
;
using
Performance.EntityModels.Other
;
using
Performance.Infrastructure
;
using
Performance.Infrastructure
;
...
@@ -16,9 +23,16 @@
...
@@ -16,9 +23,16 @@
using
Performance.Repository.Repository
;
using
Performance.Repository.Repository
;
using
System
;
using
System
;
using
System.Collections.Generic
;
using
System.Collections.Generic
;
using
System.Configuration
;
using
System.Dynamic
;
using
System.Dynamic
;
using
System.Globalization
;
using
System.IO
;
using
System.IO
;
using
System.Linq
;
using
System.Linq
;
using
System.Linq.Expressions
;
using
System.Reflection.Metadata.Ecma335
;
using
System.Reflection.PortableExecutable
;
using
Z.EntityFramework.Plus
;
using
static
Performance
.
Services
.
ExtractExcelService
.
WriteDataHelper
;
namespace
Performance.Services
namespace
Performance.Services
{
{
...
@@ -36,6 +50,7 @@ public class AttendanceService : IAutoInjection
...
@@ -36,6 +50,7 @@ public class AttendanceService : IAutoInjection
private
readonly
PerforPerdeptdicRepository
perdeptdicRepository
;
private
readonly
PerforPerdeptdicRepository
perdeptdicRepository
;
private
readonly
PerforPeremployeeRepository
perforPeremployeeRepository
;
private
readonly
PerforPeremployeeRepository
perforPeremployeeRepository
;
private
readonly
PerforCofaccountingRepository
cofaccountingRepository
;
private
readonly
PerforCofaccountingRepository
cofaccountingRepository
;
private
readonly
PerforPerAttendanceDeptRepository
_attendanceDeptRepository
;
private
readonly
RoleService
roleService
;
private
readonly
RoleService
roleService
;
private
readonly
UserService
userService
;
private
readonly
UserService
userService
;
public
AttendanceService
(
public
AttendanceService
(
...
@@ -51,6 +66,7 @@ public class AttendanceService : IAutoInjection
...
@@ -51,6 +66,7 @@ public class AttendanceService : IAutoInjection
PerforPerdeptdicRepository
perdeptdicRepository
,
PerforPerdeptdicRepository
perdeptdicRepository
,
PerforPeremployeeRepository
perforPeremployeeRepository
,
PerforPeremployeeRepository
perforPeremployeeRepository
,
PerforCofaccountingRepository
cofaccountingRepository
,
PerforCofaccountingRepository
cofaccountingRepository
,
PerforPerAttendanceDeptRepository
attendanceDeptRepository
,
RoleService
roleService
,
RoleService
roleService
,
UserService
userService
UserService
userService
)
)
...
@@ -67,6 +83,7 @@ UserService userService
...
@@ -67,6 +83,7 @@ UserService userService
this
.
perdeptdicRepository
=
perdeptdicRepository
;
this
.
perdeptdicRepository
=
perdeptdicRepository
;
this
.
perforPeremployeeRepository
=
perforPeremployeeRepository
;
this
.
perforPeremployeeRepository
=
perforPeremployeeRepository
;
this
.
cofaccountingRepository
=
cofaccountingRepository
;
this
.
cofaccountingRepository
=
cofaccountingRepository
;
_attendanceDeptRepository
=
attendanceDeptRepository
;
this
.
roleService
=
roleService
;
this
.
roleService
=
roleService
;
this
.
userService
=
userService
;
this
.
userService
=
userService
;
}
}
...
@@ -434,6 +451,66 @@ public ApiResponse AttendanceClearAll(int allotId)
...
@@ -434,6 +451,66 @@ public ApiResponse AttendanceClearAll(int allotId)
perforPerAttendanceRepository
.
RemoveRange
(
data
.
ToArray
());
perforPerAttendanceRepository
.
RemoveRange
(
data
.
ToArray
());
return
new
ApiResponse
(
ResponseType
.
OK
);
return
new
ApiResponse
(
ResponseType
.
OK
);
}
}
private
List
<
Dictionary
<
string
,
string
>>
CreateDataRow
(
SaveCollectData
request
,
Dictionary
<
string
,
string
>
config
)
{
List
<
Dictionary
<
string
,
string
>>
allData
=
new
List
<
Dictionary
<
string
,
string
>>();
for
(
int
r
=
0
;
r
<
request
.
Data
.
Length
;
r
++)
{
// 创建固定数据列
Dictionary
<
string
,
string
>
baseData
=
CreateBaseData
(
request
,
config
,
r
);
allData
.
Add
(
baseData
);
}
return
allData
;
}
private
Dictionary
<
string
,
string
>
CreateBaseData
(
SaveCollectData
request
,
Dictionary
<
string
,
string
>
config
,
int
rownumber
)
{
Dictionary
<
string
,
string
>
result
=
new
Dictionary
<
string
,
string
>();
for
(
int
c
=
0
;
c
<
request
.
ColHeaders
.
Length
;
c
++)
{
var
header
=
request
.
ColHeaders
[
c
];
var
first
=
config
.
FirstOrDefault
(
w
=>
w
.
Value
==
header
);
if
(!
default
(
KeyValuePair
<
string
,
string
>).
Equals
(
first
)
&&
!
result
.
ContainsKey
(
header
)
&&
request
.
Data
[
rownumber
].
Length
>
c
)
{
result
.
Add
(
first
.
Key
,
request
.
Data
[
rownumber
][
c
]);
}
}
return
result
;
}
public
static
List
<(
string
,
string
,
Func
<
per_attendance
,
object
>)>
Person
{
get
;
}
=
new
List
<(
string
,
string
,
Func
<
per_attendance
,
object
>)>
{
(
nameof
(
per_attendance
.
PersonnelName
),
"人员姓名"
,
t
=>
t
.
PersonnelName
),
(
nameof
(
per_attendance
.
PersonnelNumber
),
"员工工号"
,
t
=>
t
.
PersonnelNumber
),
(
nameof
(
per_attendance
.
CallInAccountingUnit
),
"调入核算单元"
,
t
=>
t
.
CallInAccountingUnit
),
(
nameof
(
per_attendance
.
CallInUnitType
),
"调入组别"
,
t
=>
t
.
CallInUnitType
),
(
nameof
(
per_attendance
.
CallInDate
),
"调入时间"
,
t
=>
t
.
CallInDate
),
(
nameof
(
per_attendance
.
PermanentStaff
),
"人员系数"
,
t
=>
t
.
PermanentStaff
),
};
public
static
List
<(
string
,
string
,
Func
<
view_attendance
,
object
>)>
Person2
{
get
;
}
=
new
List
<(
string
,
string
,
Func
<
view_attendance
,
object
>)>
{
(
nameof
(
view_attendance
.
PersonnelName
),
"人员姓名"
,
t
=>
t
.
PersonnelName
),
(
nameof
(
view_attendance
.
PersonnelNumber
),
"员工工号"
,
t
=>
t
.
PersonnelNumber
),
(
nameof
(
view_attendance
.
AccountingUnit
),
"调入核算单元"
,
t
=>
t
.
AccountingUnit
),
(
nameof
(
view_attendance
.
UnitType
),
"调入组别"
,
t
=>
t
.
UnitType
),
(
nameof
(
view_attendance
.
AttendanceDate
),
"调入时间"
,
t
=>
t
.
AttendanceDate
),
(
nameof
(
per_attendance
.
PermanentStaff
),
"人员系数"
,
t
=>
t
.
PermanentStaff
),
};
public
static
List
<(
string
,
string
,
Func
<
RecordAttendcance
,
object
>)>
Vacation
{
get
;
}
=
new
List
<(
string
,
string
,
Func
<
RecordAttendcance
,
object
>)>
{
(
nameof
(
RecordAttendcance
.
PersonnelName
),
"人员姓名"
,
t
=>
t
.
PersonnelName
),
(
nameof
(
RecordAttendcance
.
PersonnelNumber
),
"员工工号"
,
t
=>
t
.
PersonnelNumber
),
(
nameof
(
RecordAttendcance
.
AttendanceName
),
"考勤类型"
,
t
=>
t
.
AttendanceName
),
(
nameof
(
RecordAttendcance
.
BegDate
),
"开始时间"
,
t
=>
t
.
BegDate
),
(
nameof
(
RecordAttendcance
.
EndDate
),
"结束时间"
,
t
=>
t
.
EndDate
),
};
#
endregion
#
endregion
#
region
考勤类型
#
region
考勤类型
...
@@ -916,6 +993,7 @@ public ApiResponse<List<AttendanceStatistics>> GetAttendanceStatistics(int allot
...
@@ -916,6 +993,7 @@ public ApiResponse<List<AttendanceStatistics>> GetAttendanceStatistics(int allot
}
}
return
new
ApiResponse
<
List
<
AttendanceStatistics
>>(
ResponseType
.
OK
,
""
,
statistics
);
return
new
ApiResponse
<
List
<
AttendanceStatistics
>>(
ResponseType
.
OK
,
""
,
statistics
);
}
}
#
region
考勤下发
#
region
考勤下发
// 科室确认列表
// 科室确认列表
public
ApiResponse
<
List
<
AttendanceAuditList
>>
AuditList
(
int
allotId
,
string
unitType
,
string
accountingUnit
,
Attendance
.
State
state
)
public
ApiResponse
<
List
<
AttendanceAuditList
>>
AuditList
(
int
allotId
,
string
unitType
,
string
accountingUnit
,
Attendance
.
State
state
)
...
@@ -1223,51 +1301,710 @@ public ApiResponse ChooseStatistics(AttendanceIssueChoose attendanceIssueChoose,
...
@@ -1223,51 +1301,710 @@ public ApiResponse ChooseStatistics(AttendanceIssueChoose attendanceIssueChoose,
}
}
#
endregion
#
endregion
#
region
考勤上报
/// <summary>
/// 考勤上报审核列表
/// </summary>
/// <param name="allotId"></param>
/// <param name="unitType"></param>
/// <param name="accountingUnit"></param>
/// <returns></returns>
public
ApiResponse
<
List
<
AttendanceDeptAuditList
>>
DeptAuditList
(
int
allotId
,
string
unitType
,
string
accountingUnit
,
int
?
state
=
-
1
)
{
var
attendanceDepts
=
_attendanceDeptRepository
.
GetEntities
((
w
)
=>
w
.
AllotId
==
allotId
);
var
stateOrders
=
new
int
[]
{
(
int
)
Attendance
.
Report
.
未提交
,
(
int
)
Attendance
.
Report
.
提交
,
(
int
)
Attendance
.
Report
.
驳回
,
(
int
)
Attendance
.
Report
.
通过
};
var
items
=
attendanceDepts
.
GroupBy
(
w
=>
new
{
w
.
Code
,
w
.
UnitType
,
w
.
AccountingUnit
})
.
Select
(
w
=>
new
AttendanceDeptAuditList
{
Code
=
w
.
Key
.
Code
,
UnitType
=
w
.
Key
.
UnitType
,
AccountingUnit
=
w
.
Key
.
AccountingUnit
,
Count
=
w
.
Count
(),
ConfirmCount
=
w
.
Count
(
p
=>
p
.
State
==
(
int
)
Attendance
.
Report
.
提交
),
FinishCount
=
w
.
Count
(
p
=>
p
.
State
==
(
int
)
Attendance
.
Report
.
通过
),
RejectCount
=
w
.
Count
(
p
=>
p
.
State
==
(
int
)
Attendance
.
Report
.
驳回
),
SubmitUser
=
w
.
OrderByDescending
(
o
=>
o
.
SubmitUser
).
Select
(
s
=>
s
.
SubmitUser
).
FirstOrDefault
(),
SubmitTime
=
w
.
OrderByDescending
(
o
=>
o
.
SubmitTime
).
Select
(
s
=>
s
.
SubmitTime
).
FirstOrDefault
(),
AuditUser
=
w
.
OrderByDescending
(
o
=>
o
.
AuditUser
).
Select
(
s
=>
s
.
AuditUser
).
FirstOrDefault
(),
AuditTime
=
w
.
OrderByDescending
(
o
=>
o
.
AuditTime
).
Select
(
s
=>
s
.
AuditTime
).
FirstOrDefault
(),
Remarks
=
string
.
Join
(
";"
,
w
.
Select
(
p
=>
p
.
Remarks
).
Where
(
s
=>
!
string
.
IsNullOrEmpty
(
s
)).
Distinct
()),
}).
ToList
();
var
cofaccounting
=
cofaccountingRepository
.
GetEntities
(
g
=>
g
.
AllotId
==
allotId
);
var
unitTyps
=
perforPeremployeeRepository
.
GetEmployeeUnit
(
w
=>
w
.
AllotId
==
allotId
);
foreach
(
var
unit
in
unitTyps
)
{
if
(!
items
.
Any
(
w
=>
w
.
UnitType
==
unit
.
UnitType
&&
w
.
AccountingUnit
==
unit
.
AccountingUnit
))
{
items
.
Add
(
new
AttendanceDeptAuditList
{
Code
=
cofaccounting
.
FirstOrDefault
(
w
=>
w
.
UnitType
==
unit
.
UnitType
&&
w
.
AccountingUnit
==
unit
.
AccountingUnit
)?.
Code
??
""
,
UnitType
=
unit
.
UnitType
,
AccountingUnit
=
unit
.
AccountingUnit
,
});
}
}
// 拆分请假时间段为每个日期
foreach
(
var
item
in
items
)
private
List
<
DateTime
>
SplitEveryDay
(
DateTime
begin
,
DateTime
end
)
{
item
.
State
=
(
int
)
Attendance
.
Report
.
未提交
;
if
(
item
.
RejectCount
>
0
)
item
.
State
=
(
int
)
Attendance
.
Report
.
驳回
;
else
if
(
item
.
Count
>
0
&&
item
.
FinishCount
==
item
.
Count
)
item
.
State
=
(
int
)
Attendance
.
Report
.
通过
;
else
if
(
item
.
Count
>
0
&&
item
.
ConfirmCount
==
item
.
Count
)
item
.
State
=
(
int
)
Attendance
.
Report
.
提交
;
}
Expression
<
Func
<
AttendanceDeptAuditList
,
bool
>>
deptExpression
=
(
w
)
=>
true
;
if
(!
string
.
IsNullOrEmpty
(
unitType
))
items
=
items
.
Where
(
w
=>
w
.
UnitType
.
Contains
(
unitType
)).
ToList
();
if
(!
string
.
IsNullOrEmpty
(
accountingUnit
))
items
=
items
.
Where
(
w
=>
w
.
AccountingUnit
.
Contains
(
accountingUnit
)).
ToList
();
items
=
items
.
OrderBy
(
w
=>
Array
.
IndexOf
(
stateOrders
,
w
.
State
))
.
ThenBy
(
w
=>
w
.
Code
)
.
ThenBy
(
w
=>
w
.
UnitType
)
.
ToList
();
if
(
Enum
.
IsDefined
(
typeof
(
Attendance
.
Report
),
state
))
items
=
items
.
Where
(
w
=>
w
.
State
==
(
int
)
state
).
ToList
();
return
new
ApiResponse
<
List
<
AttendanceDeptAuditList
>>(
ResponseType
.
OK
,
items
);
}
/// <summary>
/// 科室考勤上报录入加载
/// </summary>
/// <param name="allotId"></param>
/// <param name="userid"></param>
/// <param name="userName"></param>
/// <returns></returns>
/// <exception cref="PerformanceException"></exception>
/// <exception cref="NotImplementedException"></exception>
public
ApiResponse
DeptLoad
(
int
allotId
,
int
userid
,
string
userName
)
{
{
List
<
DateTime
>
dates
=
new
List
<
DateTime
>();
var
allot
=
perforPerallotRepository
.
GetEntity
(
w
=>
w
.
ID
==
allotId
);
for
(
int
i
=
0
;
i
<=
(
end
-
begin
).
TotalDays
;
i
++)
if
(
allot
==
null
)
throw
new
PerformanceException
(
"当前绩效记录不存在"
);
var
begMonthDate
=
allot
.
Month
>=
1
&&
allot
.
Month
<=
12
?
new
DateTime
(
allot
.
Year
,
allot
.
Month
,
1
)
:
new
DateTime
(
allot
.
Year
,
12
,
1
);
var
endMonthDate
=
begMonthDate
.
AddMonths
(
1
).
AddDays
(-
1
);
//当角色对应时过滤
var
userInfo
=
_userRepository
.
GetUser
(
userid
);
if
(
userInfo
?.
User
==
null
)
throw
new
NotImplementedException
(
"当前用户不存在"
);
if
(
userInfo
?.
URole
==
null
)
throw
new
NotImplementedException
(
"当前用户暂未分配角色"
);
var
queryUnitTypes
=
UnitTypeUtil
.
GetMaps
(
userInfo
?.
URole
.
Type
??
0
);
var
queryAccountingUnit
=
userInfo
.
User
.
Department
;
Expression
<
Func
<
per_attendance_dept
,
bool
>>
deptExpression
=
(
w
)
=>
w
.
AllotId
==
allotId
;
if
(
queryUnitTypes
?.
Any
()
==
true
)
deptExpression
=
deptExpression
.
And
(
w
=>
queryUnitTypes
.
Contains
(
w
.
UnitType
));
if
(!
string
.
IsNullOrEmpty
(
queryAccountingUnit
))
deptExpression
=
deptExpression
.
And
(
w
=>
queryAccountingUnit
.
Equals
(
w
.
AccountingUnit
));
var
attendances
=
_attendanceDeptRepository
.
GetEntities
(
deptExpression
)
??
new
List
<
per_attendance_dept
>();
HandsonTableBase
handson
=
new
HandsonTableBase
();
handson
.
ColHeaders
.
AddRange
(
new
string
[]
{
"工号"
,
"姓名"
,
"人员系数"
});
handson
.
Columns
.
AddRange
(
new
HandsonColumn
[]
{
{
dates
.
Add
(
begin
.
AddDays
(
i
));
new
HandsonColumn
(
nameof
(
per_attendance_dept
.
PersonnelNumber
).
ToLower
()),
new
HandsonColumn
(
nameof
(
per_attendance_dept
.
PersonnelName
).
ToLower
()),
new
HandsonColumn
(
nameof
(
per_attendance_dept
.
PermanentStaff
).
ToLower
(),
format
:
DataFormat
.
小数
),
});
var
types
=
perfoPperAttendanceTypeRepository
.
GetEntities
(
t
=>
t
.
AllotId
==
allotId
)
??
new
List
<
per_attendance_type
>();
for
(
DateTime
i
=
begMonthDate
;
i
<=
endMonthDate
;
i
=
i
.
AddDays
(
1
))
{
var
title
=
CultureInfo
.
CurrentCulture
.
DateTimeFormat
.
GetDayName
(
i
.
DayOfWeek
).
Replace
(
"星期"
,
""
);
var
beaDay
=
i
.
Day
.
ToString
().
PadLeft
(
2
,
'0'
);
handson
.
ColHeaders
.
Add
(
$"
{
beaDay
}
(
{
title
}
)"
);
var
source
=
types
.
Select
(
w
=>
w
.
AttendanceName
).
ToArray
();
handson
.
Columns
.
Add
(
new
HandsonColumn
(
$"Day
{
beaDay
}
"
.
ToLower
())
{
Type
=
"autocomplete"
,
Strict
=
true
,
Source
=
source
});
}
}
return
dates
;
List
<
Dictionary
<
string
,
object
>>
datas
=
new
List
<
Dictionary
<
string
,
object
>>();
if
(
attendances
.
Any
())
{
foreach
(
var
item
in
attendances
)
{
Dictionary
<
string
,
object
>
row
=
new
Dictionary
<
string
,
object
>();
var
dict
=
JsonHelper
.
Deserialize
<
Dictionary
<
string
,
object
>>(
JsonHelper
.
Serialize
(
item
));
foreach
(
var
column
in
handson
.
Columns
)
{
dict
.
TryGetValue
(
column
.
Data
,
out
object
value
);
row
.
AddOrUpdate
(
column
.
Data
,
value
);
}
datas
.
Add
(
row
);
}
}
else
{
Expression
<
Func
<
per_employee
,
bool
>>
empExpression
=
(
w
)
=>
w
.
AllotId
==
allotId
;
if
(
queryUnitTypes
?.
Any
()
==
true
)
empExpression
=
empExpression
.
And
(
w
=>
queryUnitTypes
.
Contains
(
w
.
UnitType
));
if
(!
string
.
IsNullOrEmpty
(
queryAccountingUnit
))
empExpression
=
empExpression
.
And
(
w
=>
queryAccountingUnit
.
Equals
(
w
.
AccountingUnit
));
var
employees
=
perforPeremployeeRepository
.
GetEntities
(
empExpression
);
foreach
(
var
item
in
employees
)
{
Dictionary
<
string
,
object
>
row
=
new
Dictionary
<
string
,
object
>
{
{
nameof
(
per_attendance_dept
.
PersonnelNumber
).
ToLower
(),
item
.
PersonnelNumber
},
{
nameof
(
per_attendance_dept
.
PersonnelName
).
ToLower
(),
item
.
DoctorName
},
{
nameof
(
per_attendance_dept
.
PermanentStaff
).
ToLower
(),
item
.
PermanentStaff
}
};
foreach
(
var
column
in
handson
.
Columns
)
{
if
(!
row
.
ContainsKey
(
column
.
Data
))
{
row
.
AddOrUpdate
(
column
.
Data
,
null
);
}
}
datas
.
Add
(
row
);
}
}
handson
.
Data
=
datas
;
return
new
ApiResponse
(
ResponseType
.
OK
,
""
,
handson
);
//return new SecondDetailDto { Head = head, Body = handson, Dic = dic };
}
}
/// <summary>
/// 科室考勤上报录入保存
/// </summary>
/// <param name="allotId"></param>
/// <param name="datas"></param>
/// <param name="unitType"></param>
/// <param name="userid"></param>
/// <param name="userName"></param>
/// <returns></returns>
/// <exception cref="PerformanceException"></exception>
/// <exception cref="NotImplementedException"></exception>
public
ApiResponse
DeptSave
(
int
allotId
,
List
<
AttendanceDept
>
datas
,
string
unitType
,
int
userid
,
string
userName
)
{
var
allot
=
perforPerallotRepository
.
GetEntity
(
w
=>
w
.
ID
==
allotId
);
if
(
allot
==
null
)
throw
new
PerformanceException
(
"当前绩效记录不存在"
);
var
begMonthDate
=
allot
.
Month
>=
1
&&
allot
.
Month
<=
12
?
new
DateTime
(
allot
.
Year
,
allot
.
Month
,
1
)
:
new
DateTime
(
allot
.
Year
,
12
,
1
);
var
endMonthDate
=
begMonthDate
.
AddMonths
(
1
).
AddDays
(-
1
);
private
List
<
Dictionary
<
string
,
string
>>
CreateDataRow
(
SaveCollectData
request
,
Dictionary
<
string
,
string
>
config
)
//当角色对应时过滤
var
userInfo
=
_userRepository
.
GetUser
(
userid
);
if
(
userInfo
?.
User
==
null
)
throw
new
NotImplementedException
(
"当前用户不存在"
);
if
(
userInfo
?.
URole
==
null
)
throw
new
NotImplementedException
(
"当前用户暂未分配角色"
);
var
queryUnitTypes
=
UnitTypeUtil
.
GetMaps
(
userInfo
?.
URole
.
Type
??
0
);
string
queryAccountingUnit
=
userInfo
.
User
.
Department
;
if
(!
queryUnitTypes
.
Contains
(
unitType
))
throw
new
PerformanceException
(
"当前用户角色与“核算组别”不匹配"
);
var
types
=
perfoPperAttendanceTypeRepository
.
GetEntities
(
t
=>
t
.
AllotId
==
allotId
)
??
new
List
<
per_attendance_type
>();
var
cofaccounting
=
cofaccountingRepository
.
GetEntities
(
g
=>
g
.
AllotId
==
allotId
);
var
employees
=
perforPeremployeeRepository
.
GetEntities
(
g
=>
g
.
AllotId
==
allotId
);
var
attendances
=
_attendanceDeptRepository
.
GetEntities
((
w
)
=>
w
.
AllotId
==
allotId
&&
queryUnitTypes
.
Contains
(
w
.
UnitType
)
&&
queryAccountingUnit
.
Equals
(
w
.
AccountingUnit
));
List
<
per_attendance_dept
>
newAttendanceDepts
=
new
List
<
per_attendance_dept
>();
List
<
per_attendance_dept
>
updAttendanceDepts
=
new
List
<
per_attendance_dept
>();
List
<
int
>
validAttendanceId
=
new
List
<
int
>();
List
<
Dictionary
<
string
,
string
>>
error
=
new
List
<
Dictionary
<
string
,
string
>>();
foreach
(
var
item
in
datas
.
Select
((
row
,
ind
)
=>
(
row
,
ind
)))
{
var
row
=
item
.
row
;
if
(
string
.
IsNullOrEmpty
(
row
.
PersonnelNumber
)
||
string
.
IsNullOrEmpty
(
row
.
PersonnelNumber
))
{
error
.
Add
(
new
Dictionary
<
string
,
string
>
{
{
"行号"
,
$"第
{
item
.
ind
+
1
}
行"
},
{
"工号"
,
row
.
PersonnelNumber
??
""
},
{
"姓名"
,
row
.
PersonnelName
??
""
},
{
"人员系数"
,
row
.
PermanentStaff
?.
ToString
()
??
""
},
{
"考勤类型"
,
""
},
{
"错误原因"
,
$"“员工号/姓名”尚未填写"
},
});
continue
;
}
if
(
datas
.
Count
(
w
=>
w
.
PersonnelNumber
.
Trim
().
Equals
(
row
.
PersonnelNumber
.
Trim
(),
StringComparison
.
OrdinalIgnoreCase
))
>
1
)
{
error
.
Add
(
new
Dictionary
<
string
,
string
>
{
{
"行号"
,
$"第
{
item
.
ind
+
1
}
行"
},
{
"工号"
,
row
.
PersonnelNumber
??
""
},
{
"姓名"
,
row
.
PersonnelName
??
""
},
{
"人员系数"
,
row
.
PermanentStaff
?.
ToString
()
??
""
},
{
"考勤类型"
,
""
},
{
"错误原因"
,
$"“员工号”多次填写请删除其他保留一条"
},
});
continue
;
}
var
emp
=
employees
.
FirstOrDefault
(
w
=>
w
.
PersonnelNumber
==
row
.
PersonnelNumber
);
if
(
emp
==
null
||
emp
.
DoctorName
!=
row
.
PersonnelName
)
{
error
.
Add
(
new
Dictionary
<
string
,
string
>
{
{
"行号"
,
$"第
{
item
.
ind
+
1
}
行"
},
{
"工号"
,
row
.
PersonnelNumber
??
""
},
{
"姓名"
,
row
.
PersonnelName
??
""
},
{
"人员系数"
,
row
.
PermanentStaff
?.
ToString
()
??
""
},
{
"考勤类型"
,
""
},
{
"错误原因"
,
$"“员工号/姓名”无法与“人员字典”对应"
},
});
continue
;
}
if
(
row
.
PermanentStaff
==
null
)
{
error
.
Add
(
new
Dictionary
<
string
,
string
>
{
{
"行号"
,
$"第
{
item
.
ind
+
1
}
行"
},
{
"工号"
,
row
.
PersonnelNumber
??
""
},
{
"姓名"
,
row
.
PersonnelName
??
""
},
{
"人员系数"
,
row
.
PermanentStaff
?.
ToString
()
??
""
},
{
"考勤类型"
,
""
},
{
"错误原因"
,
$"“人员系数”尚未填写"
},
});
continue
;
}
Func
<
string
,
int
?>
getAattendanceType
=
(
name
)
=>
types
.
FirstOrDefault
(
w
=>
w
.
AttendanceName
==
name
)?.
Id
;
var
days
=
new
[]
{
new
{
Date
=
begMonthDate
.
AddDays
(
00
),
TypeId
=
getAattendanceType
(
row
.
Day01
),
OrgTypeName
=
row
.
Day01
},
new
{
Date
=
begMonthDate
.
AddDays
(
01
),
TypeId
=
getAattendanceType
(
row
.
Day02
),
OrgTypeName
=
row
.
Day02
},
new
{
Date
=
begMonthDate
.
AddDays
(
02
),
TypeId
=
getAattendanceType
(
row
.
Day03
),
OrgTypeName
=
row
.
Day03
},
new
{
Date
=
begMonthDate
.
AddDays
(
03
),
TypeId
=
getAattendanceType
(
row
.
Day04
),
OrgTypeName
=
row
.
Day04
},
new
{
Date
=
begMonthDate
.
AddDays
(
04
),
TypeId
=
getAattendanceType
(
row
.
Day05
),
OrgTypeName
=
row
.
Day05
},
new
{
Date
=
begMonthDate
.
AddDays
(
05
),
TypeId
=
getAattendanceType
(
row
.
Day06
),
OrgTypeName
=
row
.
Day06
},
new
{
Date
=
begMonthDate
.
AddDays
(
06
),
TypeId
=
getAattendanceType
(
row
.
Day07
),
OrgTypeName
=
row
.
Day07
},
new
{
Date
=
begMonthDate
.
AddDays
(
07
),
TypeId
=
getAattendanceType
(
row
.
Day08
),
OrgTypeName
=
row
.
Day08
},
new
{
Date
=
begMonthDate
.
AddDays
(
08
),
TypeId
=
getAattendanceType
(
row
.
Day09
),
OrgTypeName
=
row
.
Day09
},
new
{
Date
=
begMonthDate
.
AddDays
(
09
),
TypeId
=
getAattendanceType
(
row
.
Day10
),
OrgTypeName
=
row
.
Day10
},
new
{
Date
=
begMonthDate
.
AddDays
(
10
),
TypeId
=
getAattendanceType
(
row
.
Day11
),
OrgTypeName
=
row
.
Day11
},
new
{
Date
=
begMonthDate
.
AddDays
(
11
),
TypeId
=
getAattendanceType
(
row
.
Day12
),
OrgTypeName
=
row
.
Day12
},
new
{
Date
=
begMonthDate
.
AddDays
(
12
),
TypeId
=
getAattendanceType
(
row
.
Day13
),
OrgTypeName
=
row
.
Day13
},
new
{
Date
=
begMonthDate
.
AddDays
(
13
),
TypeId
=
getAattendanceType
(
row
.
Day14
),
OrgTypeName
=
row
.
Day14
},
new
{
Date
=
begMonthDate
.
AddDays
(
14
),
TypeId
=
getAattendanceType
(
row
.
Day15
),
OrgTypeName
=
row
.
Day15
},
new
{
Date
=
begMonthDate
.
AddDays
(
15
),
TypeId
=
getAattendanceType
(
row
.
Day16
),
OrgTypeName
=
row
.
Day16
},
new
{
Date
=
begMonthDate
.
AddDays
(
16
),
TypeId
=
getAattendanceType
(
row
.
Day17
),
OrgTypeName
=
row
.
Day17
},
new
{
Date
=
begMonthDate
.
AddDays
(
17
),
TypeId
=
getAattendanceType
(
row
.
Day18
),
OrgTypeName
=
row
.
Day18
},
new
{
Date
=
begMonthDate
.
AddDays
(
18
),
TypeId
=
getAattendanceType
(
row
.
Day19
),
OrgTypeName
=
row
.
Day19
},
new
{
Date
=
begMonthDate
.
AddDays
(
19
),
TypeId
=
getAattendanceType
(
row
.
Day20
),
OrgTypeName
=
row
.
Day20
},
new
{
Date
=
begMonthDate
.
AddDays
(
20
),
TypeId
=
getAattendanceType
(
row
.
Day21
),
OrgTypeName
=
row
.
Day21
},
new
{
Date
=
begMonthDate
.
AddDays
(
21
),
TypeId
=
getAattendanceType
(
row
.
Day22
),
OrgTypeName
=
row
.
Day22
},
new
{
Date
=
begMonthDate
.
AddDays
(
22
),
TypeId
=
getAattendanceType
(
row
.
Day23
),
OrgTypeName
=
row
.
Day23
},
new
{
Date
=
begMonthDate
.
AddDays
(
23
),
TypeId
=
getAattendanceType
(
row
.
Day24
),
OrgTypeName
=
row
.
Day24
},
new
{
Date
=
begMonthDate
.
AddDays
(
24
),
TypeId
=
getAattendanceType
(
row
.
Day25
),
OrgTypeName
=
row
.
Day25
},
new
{
Date
=
begMonthDate
.
AddDays
(
25
),
TypeId
=
getAattendanceType
(
row
.
Day26
),
OrgTypeName
=
row
.
Day26
},
new
{
Date
=
begMonthDate
.
AddDays
(
26
),
TypeId
=
getAattendanceType
(
row
.
Day27
),
OrgTypeName
=
row
.
Day27
},
new
{
Date
=
begMonthDate
.
AddDays
(
27
),
TypeId
=
getAattendanceType
(
row
.
Day28
),
OrgTypeName
=
row
.
Day28
},
new
{
Date
=
begMonthDate
.
AddDays
(
28
),
TypeId
=
getAattendanceType
(
row
.
Day29
),
OrgTypeName
=
row
.
Day29
},
new
{
Date
=
begMonthDate
.
AddDays
(
29
),
TypeId
=
getAattendanceType
(
row
.
Day30
),
OrgTypeName
=
row
.
Day30
},
new
{
Date
=
begMonthDate
.
AddDays
(
30
),
TypeId
=
getAattendanceType
(
row
.
Day31
),
OrgTypeName
=
row
.
Day31
},
};
foreach
(
var
d
in
days
)
{
if
(!
string
.
IsNullOrEmpty
(
d
.
OrgTypeName
)
&&
!
d
.
TypeId
.
HasValue
)
{
var
title
=
CultureInfo
.
CurrentCulture
.
DateTimeFormat
.
GetDayName
(
d
.
Date
.
DayOfWeek
).
Replace
(
"星期"
,
""
);
var
beaDay
=
d
.
Date
.
Day
.
ToString
().
PadLeft
(
2
,
'0'
);
error
.
Add
(
new
Dictionary
<
string
,
string
>
{
{
"行号"
,
$"第
{
item
.
ind
+
1
}
行"
},
{
"工号"
,
row
.
PersonnelNumber
??
""
},
{
"姓名"
,
row
.
PersonnelName
??
""
},
{
"人员系数"
,
row
.
PermanentStaff
?.
ToString
()
??
""
},
{
"考勤类型"
,
d
.
OrgTypeName
},
{
"错误原因"
,
$"“
{
beaDay
}
(
{
title
}
)”考勤类型“
{
d
.
OrgTypeName
}
”不存在"
},
});
}
}
var
accounting
=
cofaccounting
.
FirstOrDefault
(
p
=>
p
.
UnitType
==
unitType
&&
p
.
AccountingUnit
==
queryAccountingUnit
);
var
attendance
=
attendances
.
FirstOrDefault
(
w
=>
w
.
PersonnelNumber
==
row
.
PersonnelNumber
&&
w
.
UnitType
==
unitType
.
ToString
()
&&
w
.
AccountingUnit
==
queryAccountingUnit
);
if
(
attendance
==
null
)
{
attendance
=
new
per_attendance_dept
{
HospitalId
=
allot
.
HospitalId
,
AllotId
=
allotId
,
Code
=
accounting
?.
Code
??
""
,
UnitType
=
unitType
,
AccountingUnit
=
queryAccountingUnit
,
};
attendance
.
PersonnelNumber
=
row
.
PersonnelNumber
;
attendance
.
PersonnelName
=
row
.
PersonnelName
;
attendance
.
PermanentStaff
=
row
.
PermanentStaff
??
emp
?.
PermanentStaff
;
attendance
.
Day01
=
getAattendanceType
(
row
.
Day01
);
attendance
.
Day02
=
getAattendanceType
(
row
.
Day02
);
attendance
.
Day03
=
getAattendanceType
(
row
.
Day03
);
attendance
.
Day04
=
getAattendanceType
(
row
.
Day04
);
attendance
.
Day05
=
getAattendanceType
(
row
.
Day05
);
attendance
.
Day06
=
getAattendanceType
(
row
.
Day06
);
attendance
.
Day07
=
getAattendanceType
(
row
.
Day07
);
attendance
.
Day08
=
getAattendanceType
(
row
.
Day08
);
attendance
.
Day09
=
getAattendanceType
(
row
.
Day09
);
attendance
.
Day10
=
getAattendanceType
(
row
.
Day10
);
attendance
.
Day11
=
getAattendanceType
(
row
.
Day11
);
attendance
.
Day12
=
getAattendanceType
(
row
.
Day12
);
attendance
.
Day13
=
getAattendanceType
(
row
.
Day13
);
attendance
.
Day14
=
getAattendanceType
(
row
.
Day14
);
attendance
.
Day15
=
getAattendanceType
(
row
.
Day15
);
attendance
.
Day16
=
getAattendanceType
(
row
.
Day16
);
attendance
.
Day17
=
getAattendanceType
(
row
.
Day17
);
attendance
.
Day18
=
getAattendanceType
(
row
.
Day18
);
attendance
.
Day19
=
getAattendanceType
(
row
.
Day19
);
attendance
.
Day20
=
getAattendanceType
(
row
.
Day20
);
attendance
.
Day21
=
getAattendanceType
(
row
.
Day21
);
attendance
.
Day22
=
getAattendanceType
(
row
.
Day22
);
attendance
.
Day23
=
getAattendanceType
(
row
.
Day23
);
attendance
.
Day24
=
getAattendanceType
(
row
.
Day24
);
attendance
.
Day25
=
getAattendanceType
(
row
.
Day25
);
attendance
.
Day26
=
getAattendanceType
(
row
.
Day26
);
attendance
.
Day27
=
getAattendanceType
(
row
.
Day27
);
attendance
.
Day28
=
getAattendanceType
(
row
.
Day28
);
attendance
.
Day29
=
getAattendanceType
(
row
.
Day29
);
attendance
.
Day30
=
getAattendanceType
(
row
.
Day30
);
attendance
.
Day31
=
getAattendanceType
(
row
.
Day31
);
newAttendanceDepts
.
Add
(
attendance
);
}
else
{
attendance
.
PersonnelNumber
=
row
.
PersonnelNumber
;
attendance
.
PersonnelName
=
row
.
PersonnelName
;
attendance
.
PermanentStaff
=
row
.
PermanentStaff
??
emp
?.
PermanentStaff
;
attendance
.
Day01
=
getAattendanceType
(
row
.
Day01
);
attendance
.
Day02
=
getAattendanceType
(
row
.
Day02
);
attendance
.
Day03
=
getAattendanceType
(
row
.
Day03
);
attendance
.
Day04
=
getAattendanceType
(
row
.
Day04
);
attendance
.
Day05
=
getAattendanceType
(
row
.
Day05
);
attendance
.
Day06
=
getAattendanceType
(
row
.
Day06
);
attendance
.
Day07
=
getAattendanceType
(
row
.
Day07
);
attendance
.
Day08
=
getAattendanceType
(
row
.
Day08
);
attendance
.
Day09
=
getAattendanceType
(
row
.
Day09
);
attendance
.
Day10
=
getAattendanceType
(
row
.
Day10
);
attendance
.
Day11
=
getAattendanceType
(
row
.
Day11
);
attendance
.
Day12
=
getAattendanceType
(
row
.
Day12
);
attendance
.
Day13
=
getAattendanceType
(
row
.
Day13
);
attendance
.
Day14
=
getAattendanceType
(
row
.
Day14
);
attendance
.
Day15
=
getAattendanceType
(
row
.
Day15
);
attendance
.
Day16
=
getAattendanceType
(
row
.
Day16
);
attendance
.
Day17
=
getAattendanceType
(
row
.
Day17
);
attendance
.
Day18
=
getAattendanceType
(
row
.
Day18
);
attendance
.
Day19
=
getAattendanceType
(
row
.
Day19
);
attendance
.
Day20
=
getAattendanceType
(
row
.
Day20
);
attendance
.
Day21
=
getAattendanceType
(
row
.
Day21
);
attendance
.
Day22
=
getAattendanceType
(
row
.
Day22
);
attendance
.
Day23
=
getAattendanceType
(
row
.
Day23
);
attendance
.
Day24
=
getAattendanceType
(
row
.
Day24
);
attendance
.
Day25
=
getAattendanceType
(
row
.
Day25
);
attendance
.
Day26
=
getAattendanceType
(
row
.
Day26
);
attendance
.
Day27
=
getAattendanceType
(
row
.
Day27
);
attendance
.
Day28
=
getAattendanceType
(
row
.
Day28
);
attendance
.
Day29
=
getAattendanceType
(
row
.
Day29
);
attendance
.
Day30
=
getAattendanceType
(
row
.
Day30
);
attendance
.
Day31
=
getAattendanceType
(
row
.
Day31
);
updAttendanceDepts
.
Add
(
attendance
);
// 记录不需要删除的历史数据
validAttendanceId
.
Add
(
attendance
.
Id
);
}
}
if
(
error
.
Count
>
0
)
return
new
ApiResponse
(
ResponseType
.
WarningTable
,
"验证不通过,当前操作已拒绝"
,
error
);
if
(
newAttendanceDepts
.
Any
())
_attendanceDeptRepository
.
AddRange
(
newAttendanceDepts
.
ToArray
());
if
(
updAttendanceDepts
.
Any
())
_attendanceDeptRepository
.
UpdateRange
(
updAttendanceDepts
.
ToArray
());
var
delAttendanceDepts
=
attendances
.
Where
(
w
=>
!
validAttendanceId
.
Contains
(
w
.
Id
));
if
(
delAttendanceDepts
.
Any
())
_attendanceDeptRepository
.
RemoveRange
(
delAttendanceDepts
.
ToArray
());
return
new
ApiResponse
(
ResponseType
.
OK
,
"保存成功"
);
}
/// <summary>
/// 科室考勤上报录入提交
/// </summary>
/// <param name="allotId"></param>
/// <param name="unitType"></param>
/// <param name="userid"></param>
/// <param name="userName"></param>
/// <returns></returns>
/// <exception cref="PerformanceException"></exception>
/// <exception cref="NotImplementedException"></exception>
public
ApiResponse
DeptSubmit
(
int
allotId
,
string
unitType
,
int
userid
,
string
userName
)
{
{
List
<
Dictionary
<
string
,
string
>>
allData
=
new
List
<
Dictionary
<
string
,
string
>>();
var
allot
=
perforPerallotRepository
.
GetEntity
(
w
=>
w
.
ID
==
allotId
);
if
(
allot
==
null
)
throw
new
PerformanceException
(
"当前绩效记录不存在"
);
for
(
int
r
=
0
;
r
<
request
.
Data
.
Length
;
r
++)
var
begMonthDate
=
allot
.
Month
>=
1
&&
allot
.
Month
<=
12
?
new
DateTime
(
allot
.
Year
,
allot
.
Month
,
1
)
:
new
DateTime
(
allot
.
Year
,
12
,
1
);
var
endMonthDate
=
begMonthDate
.
AddMonths
(
1
).
AddDays
(-
1
);
//当角色对应时过滤
var
userInfo
=
_userRepository
.
GetUser
(
userid
);
if
(
userInfo
?.
User
==
null
)
throw
new
NotImplementedException
(
"当前用户不存在"
);
if
(
userInfo
?.
URole
==
null
)
throw
new
NotImplementedException
(
"当前用户暂未分配角色"
);
var
queryUnitTypes
=
UnitTypeUtil
.
GetMaps
(
userInfo
?.
URole
.
Type
??
0
);
string
queryAccountingUnit
=
userInfo
.
User
.
Department
;
if
(!
queryUnitTypes
.
Contains
(
unitType
))
throw
new
PerformanceException
(
"当前用户角色与“核算组别”不匹配"
);
var
attendances
=
_attendanceDeptRepository
.
GetEntities
((
w
)
=>
w
.
AllotId
==
allotId
&&
queryUnitTypes
.
Contains
(
w
.
UnitType
)
&&
queryAccountingUnit
.
Equals
(
w
.
AccountingUnit
))
??
new
List
<
per_attendance_dept
>();
var
submitTime
=
DateTime
.
Now
;
foreach
(
var
item
in
attendances
)
{
{
// 创建固定数据列
item
.
State
=
(
int
)
Attendance
.
Report
.
提交
;
Dictionary
<
string
,
string
>
baseData
=
CreateBaseData
(
request
,
config
,
r
);
item
.
SubmitTime
=
submitTime
;
allData
.
Add
(
baseData
);
item
.
SubmitUser
=
userName
;
item
.
Remarks
=
null
;
}
if
(
attendances
.
Any
())
_attendanceDeptRepository
.
UpdateRange
(
attendances
.
ToArray
());
return
new
ApiResponse
(
ResponseType
.
OK
,
"提交成功"
);
}
/// <summary>
/// 科室考勤上报录入提交
/// </summary>
/// <param name="allotId"></param>
/// <param name="unitType"></param>
/// <param name="userid"></param>
/// <param name="userName"></param>
/// <returns></returns>
/// <exception cref="PerformanceException"></exception>
/// <exception cref="NotImplementedException"></exception>
public
ApiResponse
DeptRollback
(
int
allotId
,
string
unitType
,
int
userid
,
string
userName
)
{
var
allot
=
perforPerallotRepository
.
GetEntity
(
w
=>
w
.
ID
==
allotId
);
if
(
allot
==
null
)
throw
new
PerformanceException
(
"当前绩效记录不存在"
);
var
begMonthDate
=
allot
.
Month
>=
1
&&
allot
.
Month
<=
12
?
new
DateTime
(
allot
.
Year
,
allot
.
Month
,
1
)
:
new
DateTime
(
allot
.
Year
,
12
,
1
);
var
endMonthDate
=
begMonthDate
.
AddMonths
(
1
).
AddDays
(-
1
);
//当角色对应时过滤
var
userInfo
=
_userRepository
.
GetUser
(
userid
);
if
(
userInfo
?.
User
==
null
)
throw
new
NotImplementedException
(
"当前用户不存在"
);
if
(
userInfo
?.
URole
==
null
)
throw
new
NotImplementedException
(
"当前用户暂未分配角色"
);
var
queryUnitTypes
=
UnitTypeUtil
.
GetMaps
(
userInfo
?.
URole
.
Type
??
0
);
string
queryAccountingUnit
=
userInfo
.
User
.
Department
;
if
(!
queryUnitTypes
.
Contains
(
unitType
))
throw
new
PerformanceException
(
"当前用户角色与“核算组别”不匹配"
);
var
attendances
=
_attendanceDeptRepository
.
GetEntities
((
w
)
=>
w
.
AllotId
==
allotId
&&
queryUnitTypes
.
Contains
(
w
.
UnitType
)
&&
queryAccountingUnit
.
Equals
(
w
.
AccountingUnit
))
??
new
List
<
per_attendance_dept
>();
if
(!
attendances
.
Any
())
return
new
ApiResponse
(
ResponseType
.
OK
,
"暂无数据,无需撤回!"
);
var
stateCount
=
attendances
.
GroupBy
(
w
=>
w
.
State
).
Select
(
w
=>
new
{
w
.
Key
,
StateCount
=
w
.
Count
()
}).
ToList
();
if
(
attendances
.
Count
()
==
attendances
.
Count
(
w
=>
w
.
State
==
(
int
)
Attendance
.
Report
.
通过
))
throw
new
PerformanceException
(
"当前考勤已审核通过,无法撤回!"
);
if
(
attendances
.
Count
()
==
attendances
.
Count
(
w
=>
w
.
State
==
(
int
)
Attendance
.
Report
.
未提交
))
throw
new
PerformanceException
(
"当前考勤尚未提交,无需撤回!"
);
if
(
attendances
.
Count
()
==
attendances
.
Count
(
w
=>
w
.
State
==
(
int
)
Attendance
.
Report
.
驳回
))
throw
new
PerformanceException
(
"当前考勤尚已驳回,无需撤回!"
);
var
submitTime
=
DateTime
.
Now
;
foreach
(
var
item
in
attendances
)
{
item
.
State
=
(
int
)
Attendance
.
Report
.
未提交
;
item
.
SubmitTime
=
null
;
item
.
SubmitUser
=
null
;
item
.
AuditTime
=
null
;
item
.
AuditUser
=
null
;
item
.
Remarks
=
null
;
}
}
return
allData
;
if
(
attendances
.
Any
())
_attendanceDeptRepository
.
UpdateRange
(
attendances
.
ToArray
());
return
new
ApiResponse
(
ResponseType
.
OK
,
"撤回成功"
);
}
}
/// <summary>
/// 科室考勤上报结果审核
/// </summary>
/// <param name="allotId"></param>
/// <param name="unitType"></param>
/// <param name="state"></param>
/// <param name="remark"></param>
/// <param name="userid"></param>
/// <param name="userName"></param>
/// <returns></returns>
/// <exception cref="PerformanceException"></exception>
/// <exception cref="NotImplementedException"></exception>
public
ApiResponse
DeptAudit
(
int
allotId
,
string
unitType
,
int
state
,
string
remark
,
int
userid
,
string
userName
)
{
var
allot
=
perforPerallotRepository
.
GetEntity
(
w
=>
w
.
ID
==
allotId
);
if
(
allot
==
null
)
throw
new
PerformanceException
(
"当前绩效记录不存在"
);
private
Dictionary
<
string
,
string
>
CreateBaseData
(
SaveCollectData
request
,
Dictionary
<
string
,
string
>
config
,
int
rownumber
)
var
begMonthDate
=
allot
.
Month
>=
1
&&
allot
.
Month
<=
12
?
new
DateTime
(
allot
.
Year
,
allot
.
Month
,
1
)
:
new
DateTime
(
allot
.
Year
,
12
,
1
);
var
endMonthDate
=
begMonthDate
.
AddMonths
(
1
).
AddDays
(-
1
);
//当角色对应时过滤
var
userInfo
=
_userRepository
.
GetUser
(
userid
);
if
(
userInfo
?.
User
==
null
)
throw
new
NotImplementedException
(
"当前用户不存在"
);
if
(
userInfo
?.
URole
==
null
)
throw
new
NotImplementedException
(
"当前用户暂未分配角色"
);
var
queryUnitTypes
=
UnitTypeUtil
.
GetMaps
(
userInfo
?.
URole
.
Type
??
0
);
string
queryAccountingUnit
=
userInfo
.
User
.
Department
;
if
(!
queryUnitTypes
.
Contains
(
unitType
))
throw
new
PerformanceException
(
"当前用户角色与“核算组别”不匹配"
);
var
attendances
=
_attendanceDeptRepository
.
GetEntities
((
w
)
=>
w
.
AllotId
==
allotId
&&
queryUnitTypes
.
Contains
(
w
.
UnitType
)
&&
queryAccountingUnit
.
Equals
(
w
.
AccountingUnit
))
??
new
List
<
per_attendance_dept
>();
if
(
attendances
.
Count
()
!=
attendances
.
Count
(
w
=>
w
.
State
==
(
int
)
Attendance
.
Report
.
提交
))
throw
new
PerformanceException
(
"当前考勤尚未提交,请勿审核!"
);
var
optTime
=
DateTime
.
Now
;
foreach
(
var
item
in
attendances
)
{
item
.
State
=
state
;
item
.
AuditTime
=
optTime
;
item
.
AuditUser
=
userName
;
item
.
Remarks
=
remark
;
}
if
(
attendances
.
Any
())
{
_attendanceDeptRepository
.
UpdateRange
(
attendances
.
ToArray
());
}
return
new
ApiResponse
(
ResponseType
.
OK
,
"审核成功"
);
}
/// <summary>
/// 科室考勤上报结果详情
/// </summary>
/// <param name="allotId"></param>
/// <param name="unitType"></param>
/// <param name="accountingUnit"></param>
/// <returns></returns>
public
ApiResponse
<
AttendanceDeptDetail
>
DeptDetail
(
int
allotId
,
string
unitType
,
string
accountingUnit
)
{
{
Dictionary
<
string
,
string
>
result
=
new
Dictionary
<
string
,
string
>();
var
allot
=
perforPerallotRepository
.
GetEntity
(
w
=>
w
.
ID
==
allotId
);
for
(
int
c
=
0
;
c
<
request
.
ColHeaders
.
Length
;
c
++)
if
(
allot
==
null
)
throw
new
PerformanceException
(
"当前绩效记录不存在"
);
var
begMonthDate
=
allot
.
Month
>=
1
&&
allot
.
Month
<=
12
?
new
DateTime
(
allot
.
Year
,
allot
.
Month
,
1
)
:
new
DateTime
(
allot
.
Year
,
12
,
1
);
var
endMonthDate
=
begMonthDate
.
AddMonths
(
1
).
AddDays
(-
1
);
Expression
<
Func
<
per_attendance_dept
,
bool
>>
deptExpression
=
(
w
)
=>
w
.
AllotId
==
allotId
;
if
(!
string
.
IsNullOrEmpty
(
unitType
))
deptExpression
=
deptExpression
.
And
(
w
=>
w
.
UnitType
.
Equals
(
unitType
));
if
(!
string
.
IsNullOrEmpty
(
accountingUnit
))
deptExpression
=
deptExpression
.
And
(
w
=>
w
.
AccountingUnit
.
Equals
(
accountingUnit
));
var
attendances
=
_attendanceDeptRepository
.
GetEntities
(
deptExpression
)
??
new
List
<
per_attendance_dept
>();
AttendanceDeptDetail
detail
=
new
AttendanceDeptDetail
()
{
{
var
header
=
request
.
ColHeaders
[
c
];
Columns
=
new
List
<
TColumn
>(),
var
first
=
config
.
FirstOrDefault
(
w
=>
w
.
Value
==
header
);
Data
=
new
List
<
AttendanceDeptMore
>(),
if
(!
default
(
KeyValuePair
<
string
,
string
>).
Equals
(
first
)
};
&&
!
result
.
ContainsKey
(
header
)
detail
.
Columns
.
Add
(
new
TColumn
(
nameof
(
AttendanceDeptMore
.
PersonnelNumber
).
ToLower
(),
"工号"
,
80
,
"left"
,
true
));
&&
request
.
Data
[
rownumber
].
Length
>
c
)
detail
.
Columns
.
Add
(
new
TColumn
(
nameof
(
AttendanceDeptMore
.
PersonnelName
).
ToLower
(),
"姓名"
,
80
,
"left"
,
true
));
detail
.
Columns
.
Add
(
new
TColumn
(
nameof
(
AttendanceDeptMore
.
PermanentStaff
).
ToLower
(),
"人员系数"
,
80
,
"left"
,
true
));
for
(
DateTime
i
=
begMonthDate
;
i
<=
endMonthDate
;
i
=
i
.
AddDays
(
1
))
{
var
title
=
CultureInfo
.
CurrentCulture
.
DateTimeFormat
.
GetDayName
(
i
.
DayOfWeek
).
Replace
(
"星期"
,
""
);
var
beaDay
=
i
.
Day
.
ToString
().
PadLeft
(
2
,
'0'
);
detail
.
Columns
.
Add
(
new
TColumn
(
$"Day
{
beaDay
}
"
.
ToLower
(),
$"
{
beaDay
}
(
{
title
}
)"
));
}
if
(!
attendances
.
Any
())
return
new
ApiResponse
<
AttendanceDeptDetail
>(
ResponseType
.
OK
,
"操作成功"
,
detail
);
var
cofaccounting
=
cofaccountingRepository
.
GetEntities
(
g
=>
g
.
AllotId
==
allotId
);
var
types
=
perfoPperAttendanceTypeRepository
.
GetEntities
(
t
=>
t
.
AllotId
==
allotId
)
??
new
List
<
per_attendance_type
>();
Func
<
int
?,
string
>
getAattendanceType
=
(
typeId
)
=>
typeId
>
0
?
types
.
FirstOrDefault
(
w
=>
w
.
Id
==
typeId
)?.
AttendanceName
??
"考勤类型缺失"
:
""
;
foreach
(
var
row
in
attendances
)
{
var
accounting
=
cofaccounting
.
FirstOrDefault
(
p
=>
p
.
UnitType
==
unitType
&&
p
.
AccountingUnit
==
accountingUnit
);
var
attendance
=
new
AttendanceDeptMore
{
{
result
.
Add
(
first
.
Key
,
request
.
Data
[
rownumber
][
c
]);
AllotId
=
allotId
,
}
Code
=
accounting
?.
Code
??
""
,
UnitType
=
row
.
UnitType
,
AccountingUnit
=
row
.
AccountingUnit
,
};
attendance
.
PersonnelNumber
=
row
.
PersonnelNumber
;
attendance
.
PersonnelName
=
row
.
PersonnelName
;
attendance
.
PermanentStaff
=
row
.
PermanentStaff
;
attendance
.
Day01
=
getAattendanceType
(
row
.
Day01
);
attendance
.
Day02
=
getAattendanceType
(
row
.
Day02
);
attendance
.
Day03
=
getAattendanceType
(
row
.
Day03
);
attendance
.
Day04
=
getAattendanceType
(
row
.
Day04
);
attendance
.
Day05
=
getAattendanceType
(
row
.
Day05
);
attendance
.
Day06
=
getAattendanceType
(
row
.
Day06
);
attendance
.
Day07
=
getAattendanceType
(
row
.
Day07
);
attendance
.
Day08
=
getAattendanceType
(
row
.
Day08
);
attendance
.
Day09
=
getAattendanceType
(
row
.
Day09
);
attendance
.
Day10
=
getAattendanceType
(
row
.
Day10
);
attendance
.
Day11
=
getAattendanceType
(
row
.
Day11
);
attendance
.
Day12
=
getAattendanceType
(
row
.
Day12
);
attendance
.
Day13
=
getAattendanceType
(
row
.
Day13
);
attendance
.
Day14
=
getAattendanceType
(
row
.
Day14
);
attendance
.
Day15
=
getAattendanceType
(
row
.
Day15
);
attendance
.
Day16
=
getAattendanceType
(
row
.
Day16
);
attendance
.
Day17
=
getAattendanceType
(
row
.
Day17
);
attendance
.
Day18
=
getAattendanceType
(
row
.
Day18
);
attendance
.
Day19
=
getAattendanceType
(
row
.
Day19
);
attendance
.
Day20
=
getAattendanceType
(
row
.
Day20
);
attendance
.
Day21
=
getAattendanceType
(
row
.
Day21
);
attendance
.
Day22
=
getAattendanceType
(
row
.
Day22
);
attendance
.
Day23
=
getAattendanceType
(
row
.
Day23
);
attendance
.
Day24
=
getAattendanceType
(
row
.
Day24
);
attendance
.
Day25
=
getAattendanceType
(
row
.
Day25
);
attendance
.
Day26
=
getAattendanceType
(
row
.
Day26
);
attendance
.
Day27
=
getAattendanceType
(
row
.
Day27
);
attendance
.
Day28
=
getAattendanceType
(
row
.
Day28
);
attendance
.
Day29
=
getAattendanceType
(
row
.
Day29
);
attendance
.
Day30
=
getAattendanceType
(
row
.
Day30
);
attendance
.
Day31
=
getAattendanceType
(
row
.
Day31
);
attendance
.
State
=
row
.
State
;
attendance
.
SubmitUser
=
row
.
SubmitUser
;
attendance
.
SubmitTime
=
row
.
SubmitTime
;
attendance
.
AuditUser
=
row
.
AuditUser
;
attendance
.
AuditTime
=
row
.
AuditTime
;
attendance
.
Remarks
=
row
.
Remarks
;
detail
.
Data
.
Add
(
attendance
);
}
}
return
new
ApiResponse
<
AttendanceDeptDetail
>(
ResponseType
.
OK
,
"操作成功"
,
detail
);
}
return
result
;
#
endregion
#
region
拆分请假时间段为每个日期
// 拆分请假时间段为每个日期
private
List
<
DateTime
>
SplitEveryDay
(
DateTime
begin
,
DateTime
end
)
{
List
<
DateTime
>
dates
=
new
List
<
DateTime
>();
for
(
int
i
=
0
;
i
<=
(
end
-
begin
).
TotalDays
;
i
++)
{
dates
.
Add
(
begin
.
AddDays
(
i
));
}
return
dates
;
}
}
#
endregion
#
region
下载
public
string
ExcelDownload
(
List
<
Dictionary
<
string
,
object
>>
rows
,
string
name
,
int
allotId
,
List
<
ExcelDownloadHeads
>
headList
)
public
string
ExcelDownload
(
List
<
Dictionary
<
string
,
object
>>
rows
,
string
name
,
int
allotId
,
List
<
ExcelDownloadHeads
>
headList
)
{
{
var
perAllot
=
perforPerallotRepository
.
GetEntity
(
t
=>
t
.
ID
==
allotId
);
var
perAllot
=
perforPerallotRepository
.
GetEntity
(
t
=>
t
.
ID
==
allotId
);
...
@@ -1363,35 +2100,7 @@ public string ExcelDownload(List<Dictionary<string, object>> rows, string name,
...
@@ -1363,35 +2100,7 @@ public string ExcelDownload(List<Dictionary<string, object>> rows, string name,
}
}
return
filepath
;
return
filepath
;
}
}
#
endregion
public
static
List
<(
string
,
string
,
Func
<
per_attendance
,
object
>)>
Person
{
get
;
}
=
new
List
<(
string
,
string
,
Func
<
per_attendance
,
object
>)>
{
(
nameof
(
per_attendance
.
PersonnelName
),
"人员姓名"
,
t
=>
t
.
PersonnelName
),
(
nameof
(
per_attendance
.
PersonnelNumber
),
"员工工号"
,
t
=>
t
.
PersonnelNumber
),
(
nameof
(
per_attendance
.
CallInAccountingUnit
),
"调入核算单元"
,
t
=>
t
.
CallInAccountingUnit
),
(
nameof
(
per_attendance
.
CallInUnitType
),
"调入组别"
,
t
=>
t
.
CallInUnitType
),
(
nameof
(
per_attendance
.
CallInDate
),
"调入时间"
,
t
=>
t
.
CallInDate
),
(
nameof
(
per_attendance
.
PermanentStaff
),
"人员系数"
,
t
=>
t
.
PermanentStaff
),
};
public
static
List
<(
string
,
string
,
Func
<
view_attendance
,
object
>)>
Person2
{
get
;
}
=
new
List
<(
string
,
string
,
Func
<
view_attendance
,
object
>)>
{
(
nameof
(
view_attendance
.
PersonnelName
),
"人员姓名"
,
t
=>
t
.
PersonnelName
),
(
nameof
(
view_attendance
.
PersonnelNumber
),
"员工工号"
,
t
=>
t
.
PersonnelNumber
),
(
nameof
(
view_attendance
.
AccountingUnit
),
"调入核算单元"
,
t
=>
t
.
AccountingUnit
),
(
nameof
(
view_attendance
.
UnitType
),
"调入组别"
,
t
=>
t
.
UnitType
),
(
nameof
(
view_attendance
.
AttendanceDate
),
"调入时间"
,
t
=>
t
.
AttendanceDate
),
(
nameof
(
per_attendance
.
PermanentStaff
),
"人员系数"
,
t
=>
t
.
PermanentStaff
),
};
public
static
List
<(
string
,
string
,
Func
<
RecordAttendcance
,
object
>)>
Vacation
{
get
;
}
=
new
List
<(
string
,
string
,
Func
<
RecordAttendcance
,
object
>)>
{
(
nameof
(
RecordAttendcance
.
PersonnelName
),
"人员姓名"
,
t
=>
t
.
PersonnelName
),
(
nameof
(
RecordAttendcance
.
PersonnelNumber
),
"员工工号"
,
t
=>
t
.
PersonnelNumber
),
(
nameof
(
RecordAttendcance
.
AttendanceName
),
"考勤类型"
,
t
=>
t
.
AttendanceName
),
(
nameof
(
RecordAttendcance
.
BegDate
),
"开始时间"
,
t
=>
t
.
BegDate
),
(
nameof
(
RecordAttendcance
.
EndDate
),
"结束时间"
,
t
=>
t
.
EndDate
),
};
}
}
}
}
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