Commit 07fb0ab9 by ruyun.zhang

考勤上报

parent ff8b0c58
...@@ -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:yyyyMMdd}.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
...@@ -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>
预算管理查询(包含金额、占比) 预算管理查询(包含金额、占比)
......
...@@ -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
......
...@@ -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
......
...@@ -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,
......
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; }
}
}
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; }
}
}
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; }
}
}
...@@ -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; }
......
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
namespace Performance.EntityModels
{
public class AccountUnit
{
public string AccountingUnit { get; set; }
public string UnitType { get; set; }
}
}
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 = 0m, 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
...@@ -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);
}
} }
} }
...@@ -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)
//{ //{
......
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)
{
}
}
}
...@@ -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),
};
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment