Commit 748e0d7a by 纪旭 韦

考勤代码调整,考勤记录增加考勤时间冲突判断,考勤统计增加出勤天数

parent 6193a529
......@@ -19,20 +19,20 @@ public static void AddSwaggerConfiguration(this IServiceCollection services)
{
c.SwaggerDoc("v1", new OpenApiInfo { Version = "v1.0", Title = "绩效API接口" });
//var xmlPath = new string[]
//{
// Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", "Performance.Api.xml"),
// Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", "Performance.DtoModels.xml"),
// Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", "Performance.EntityModels.xml"),
//};
var xmlPath = new string[]
{
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", "Performance.Api.xml"),
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", "Performance.DtoModels.xml"),
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", "Performance.EntityModels.xml"),
};
//foreach (var item in xmlPath)
//{
// c.IncludeXmlComments(item, true);
//}
foreach (var item in xmlPath)
{
c.IncludeXmlComments(item, true);
}
var xmlPathsss = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", "Performance.Api.xml");
c.IncludeXmlComments(xmlPathsss, true);
//var xmlPathsss = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", "Performance.Api.xml");
//c.IncludeXmlComments(xmlPathsss, true);
// Token绑定到ConfigureServices
var security = new OpenApiSecurityRequirement
......
......@@ -2,6 +2,7 @@
using Performance.DtoModels;
using Performance.EntityModels.Other;
using Performance.Services;
using System.Collections.Generic;
namespace Performance.Api.Controllers
{
......@@ -181,7 +182,7 @@ public ApiResponse AttendanceBatch(int allotId, int hospitalId, SaveCollectData
/// <param name="allotId"></param>
/// <returns></returns>
[HttpGet("statistics/{allotId}")]
public ApiResponse GetAttendanceStatistics(int allotId)
public ApiResponse<List<AttendanceStatistics>> GetAttendanceStatistics(int allotId)
{
// 返回结果参考接口 employee/apr/getdeptdetail
return _attendanceService.GetAttendanceStatistics(allotId);
......
......@@ -46,10 +46,13 @@
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\Performance.Api.xml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\Performance.DtoModels.xml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\Performance.EntityModels.xml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
......@@ -86,6 +89,10 @@
</None>
</ItemGroup>
<ItemGroup>
<Folder Include="wwwroot\" />
</ItemGroup>
<ProjectExtensions>
<VisualStudio>
<UserProperties appsettings_1json__JSONSchema="" />
......
......@@ -388,12 +388,11 @@
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.AttendanceController.GetAttendanceStatistics(System.Int32,System.Int32)">
<member name="M:Performance.Api.Controllers.AttendanceController.GetAttendanceStatistics(System.Int32)">
<summary>
考勤结果统计
</summary>
<param name="allotId"></param>
<param name="hospitalId"></param>
<param name="allotId"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.BudgetController.Query(Performance.DtoModels.Request.BudgetRequest)">
......
......@@ -2703,6 +2703,56 @@
科室
</summary>
</member>
<member name="P:Performance.DtoModels.AttendanceStatistics.UnitType">
<summary>
核算组别
</summary>
</member>
<member name="P:Performance.DtoModels.AttendanceStatistics.AccountingUnit">
<summary>
核算单元
</summary>
</member>
<member name="P:Performance.DtoModels.AttendanceStatistics.Department">
<summary>
科室名称
</summary>
</member>
<member name="P:Performance.DtoModels.AttendanceStatistics.PersonnelNumber">
<summary>
工号
</summary>
</member>
<member name="P:Performance.DtoModels.AttendanceStatistics.PersonnelName">
<summary>
姓名
</summary>
</member>
<member name="P:Performance.DtoModels.AttendanceStatistics.BeginDate">
<summary>
在科开始时间
</summary>
</member>
<member name="P:Performance.DtoModels.AttendanceStatistics.EndDate">
<summary>
在科结束时间
</summary>
</member>
<member name="P:Performance.DtoModels.AttendanceStatisticsDetial.Value">
<summary>
请假天数
</summary>
</member>
<member name="P:Performance.DtoModels.AttendanceStatisticsDetial.Title">
<summary>
考勤类型
</summary>
</member>
<member name="P:Performance.DtoModels.AttendanceStatisticsDetial.Remark">
<summary>
备注
</summary>
</member>
<member name="P:Performance.DtoModels.BudgetRatioResponse.HospitalId">
<summary>
医院Id
......
......@@ -8850,56 +8850,6 @@
</summary>
</member>
<member name="P:Performance.EntityModels.Other.AttendanceStatistics.UnitType">
<summary>
核算组别
</summary>
</member>
<member name="P:Performance.EntityModels.Other.AttendanceStatistics.AccountingUnit">
<summary>
核算单元
</summary>
</member>
<member name="P:Performance.EntityModels.Other.AttendanceStatistics.Department">
<summary>
科室名称
</summary>
</member>
<member name="P:Performance.EntityModels.Other.AttendanceStatistics.PersonnelNumber">
<summary>
工号
</summary>
</member>
<member name="P:Performance.EntityModels.Other.AttendanceStatistics.PersonnelName">
<summary>
姓名
</summary>
</member>
<member name="P:Performance.EntityModels.Other.AttendanceStatistics.BeginDate">
<summary>
在科开始时间
</summary>
</member>
<member name="P:Performance.EntityModels.Other.AttendanceStatistics.EndDate">
<summary>
在科结束时间
</summary>
</member>
<member name="P:Performance.EntityModels.Other.AttendanceStatisticsDetial.Value">
<summary>
请假天数
</summary>
</member>
<member name="P:Performance.EntityModels.Other.AttendanceStatisticsDetial.Title">
<summary>
考勤类型
</summary>
</member>
<member name="P:Performance.EntityModels.Other.AttendanceStatisticsDetial.Remark">
<summary>
备注
</summary>
</member>
<member name="P:Performance.EntityModels.HisData.HisDepartment">
<summary>
His科室
......
using System;
using System.Collections.Generic;
namespace Performance.DtoModels
{
public class AttendanceStatistics
{
public int AllotID { get; set; }
/// <summary>
/// 核算组别
/// </summary>
public string UnitType { get; set; }
/// <summary>
/// 核算单元
/// </summary>
public string AccountingUnit { get; set; }
/// <summary>
/// 科室名称
/// </summary>
public string Department { get; set; }
/// <summary>
/// 工号
/// </summary>
public string PersonnelNumber { get; set; }
/// <summary>
/// 姓名
/// </summary>
public string PersonnelName { get; set; }
/// <summary>
/// 在科开始时间
/// </summary>
public DateTime BeginDate { get; set; }
/// <summary>
/// 在科结束时间
/// </summary>
public DateTime EndDate { get; set; }
public List<AttendanceStatisticsDetial> Detial { get; set; }
public int AttendanceDays { get; set; }
}
public class AttendanceStatisticsDetial
{
/// <summary>
/// 请假天数
/// </summary>
public int Value { get; set; }
/// <summary>
/// 考勤类型
/// </summary>
public string Title { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remark { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Performance.DtoModels
......
......@@ -60,84 +60,6 @@ public class AttendanceType
}
public class AttendanceResponse<T>
{
public List<AttendaceHeads> Heads { get; set; }
public T Datas { get; set; }
}
public class AttendancesJoinVacatione
{
public string AccountingUnit { get; set; }
public string Department { get; set; }
public string PersonnelName { get; set; }
public string PersonnelNumber { get; set; }
public string UnitType { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
public List<Detail> Detail { get; set; }
public int AttendanceDays { get; set; }
}
public class Detail
{
public string Title { get; set; }
public DateTime? BegDate { get; set; }
public DateTime EndDate { get; set; }
public int IsDeduction { get; set; }
public int VacationDays { get; set; }
}
public class AttendanceStatistics
{
public int AllotID { get; set; }
/// <summary>
/// 核算组别
/// </summary>
public string UnitType { get; set; }
/// <summary>
/// 核算单元
/// </summary>
public string AccountingUnit { get; set; }
/// <summary>
/// 科室名称
/// </summary>
public string Department { get; set; }
/// <summary>
/// 工号
/// </summary>
public string PersonnelNumber { get; set; }
/// <summary>
/// 姓名
/// </summary>
public string PersonnelName { get; set; }
/// <summary>
/// 在科开始时间
/// </summary>
public DateTime BeginDate { get; set; }
/// <summary>
/// 在科结束时间
/// </summary>
public DateTime EndDate { get; set; }
public List<AttendanceStatisticsDetial> Detial { get; set; }
}
public class AttendanceStatisticsDetial
{
/// <summary>
/// 请假天数
/// </summary>
public int Value { get; set; }
/// <summary>
/// 考勤类型
/// </summary>
public string Title { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remark { get; set; }
}
}
......@@ -47,73 +47,58 @@ public class AttendanceService : IAutoInjection
}
#region 初始考勤页面
public AttendanceResponse<List<InitialAttendance>> GetAttendance(int allotId)
public ApiResponse<List<AttendanceStatistics>> GetAttendance(int allotId)
{
var allot = perforPerallotRepository.GetEntity(w => w.ID == allotId);
if (allot == null)
throw new PerformanceException("当前绩效记录不存在");
var attendanceData = perforPerallotRepository.GetAttendance(allotId);
if (attendanceData == null || !attendanceData.Any()) return new AttendanceResponse<List<InitialAttendance>>();
var attendances = new List<InitialAttendance>();
foreach (var item in attendanceData)
List<AttendanceStatistics> statistics = new List<AttendanceStatistics>();
// 交叉补全科室结束时间
foreach (var personnelNumber in attendanceData.Select(w => w.PersonnelNumber).Distinct())
{
if (!item.Source.Contains("结束"))
var attendances = attendanceData.Where(w => w.PersonnelNumber == personnelNumber).OrderBy(w => w.AttendanceDate);
for (int i = 0; i < attendances.Count() - 1; i++)
{
var temp = new InitialAttendance
{
AccountingUnit = item.AccountingUnit,
Department = item.Department,
PersonnelName = item.PersonnelName,
PersonnelNumber = item.PersonnelNumber,
UnitType = item.UnitType,
};
var select = attendanceData.Where(t => t.PersonnelNumber == item.PersonnelNumber && t.AccountingUnit == item.AccountingUnit);
if (item.Source.Contains("开始") && !select.Any(t => t.Source.Contains("结束")))
{
var callInDate = attendanceData.FirstOrDefault(t => t.PersonnelNumber == item.PersonnelNumber && t.AttendanceDate >= item.AttendanceDate && t.Source.Contains("调入")).AttendanceDate;
temp.StartDate = item.AttendanceDate;
temp.EndDate = callInDate;
}
else if (item.Source.Contains("调入") && !select.Any(t => t.Source.Contains("开始")))
{
var endDate = attendanceData.FirstOrDefault(t => t.PersonnelNumber == item.PersonnelNumber && t.AttendanceDate >= item.AttendanceDate && t.Source.Contains("结束"));
temp.StartDate = item.AttendanceDate;
temp.EndDate = endDate.AttendanceDate;
temp.Department = endDate.Department;
}
else
var begDate = attendances.ElementAt(i).AttendanceDate.Value.Date;
var endDate = attendances.ElementAt(i + 1).AttendanceDate.Value.Date;
// 调入科室需要额外减去1天作为上一个科室结束时间
var days = attendances.ElementAt(i + 1).Source == Attendance.Type.调入.ToString() ? -1 : 0;
if (endDate > begDate)
{
temp.StartDate = select.FirstOrDefault(data => data.Source.Contains("开始")).AttendanceDate;
temp.EndDate = select.FirstOrDefault(data => data.Source.Contains("结束")).AttendanceDate;
var stat = new AttendanceStatistics
{
AllotID = attendances.ElementAt(i).ALLOTID,
UnitType = attendances.ElementAt(i).UnitType,
AccountingUnit = attendances.ElementAt(i).AccountingUnit,
Department = attendances.ElementAt(i).Department,
PersonnelNumber = attendances.ElementAt(i).PersonnelNumber,
PersonnelName = attendances.ElementAt(i).PersonnelName,
BeginDate = begDate,
EndDate = endDate.AddDays(days),
Detial = new List<AttendanceStatisticsDetial>()
};
statistics.Add(stat);
}
attendances.Add(temp);
}
}
AttendanceResponse<List<InitialAttendance>> attendanceResponse = new AttendanceResponse<List<InitialAttendance>>()
{
Heads = AttendanceConfig.AttendcanceHeads,
Datas = attendances
};
return attendanceResponse;
return new ApiResponse<List<AttendanceStatistics>>(ResponseType.OK, "", statistics);
}
#endregion
#region 调入记录
public AttendanceResponse<List<view_attendance>> GetCallIn(int allotId)
public ApiResponse<List<view_attendance>> GetCallIn(int allotId)
{
var view_attendance = perforPerallotRepository.GetAttendance(allotId).Where(t => t.Source.Contains("调入")).ToList();
AttendanceResponse<List<view_attendance>> attendanceResponse = new AttendanceResponse<List<view_attendance>>()
{
Heads = AttendanceConfig.CallinlAttendcanceHeads,
Datas = view_attendance
};
return new ApiResponse<List<view_attendance>>(ResponseType.OK, "", view_attendance);
return attendanceResponse;
}
public HandsonTable GetBatchCallInHandsonTable()
{
......@@ -199,7 +184,7 @@ public ApiResponse BatchCallIn(int allotId, int hospitalId, SaveCollectData requ
{ "调入组别", newAttendanceVacatione[i].CallInUnitType??"" },
{ "调入时间", newAttendanceVacatione[i].CallInDate.ToString()??"" },
{ "来源", "粘贴数据" },
{ "错误原因", "调入时间不在本月范围内" },
{ "错误原因", "调入时间不在当前绩效月份范围内" },
});
}
......@@ -386,9 +371,11 @@ public ApiResponse AttendanceBatch(int allotId, int hospitalId, SaveCollectData
var newAttendanceVacatione = JsonHelper.Deserialize<List<RecordAttendcance>>(jsons);
var oldAttendanceVacatione = perfoPperAttendanceVacationeRepository.GetEntities(t => t.AllotId == allotId && t.HospitalId == hospitalId);
var attendanceType = perfoPperAttendanceTypeRepository.GetEntities();
var per_employee = perforPeremployeeRepository.GetEntities(t => t.AllotId == allotId && t.HospitalId == hospitalId);
List<Dictionary<string, string>> error = new List<Dictionary<string, string>>();
var per_allot = perforPerallotRepository.GetEntities(t => t.ID == allotId && t.HospitalId == hospitalId).FirstOrDefault();
for (int i = 0; i < newAttendanceVacatione.Count; i++)
{
......@@ -412,6 +399,21 @@ public ApiResponse AttendanceBatch(int allotId, int hospitalId, SaveCollectData
});
}
var typeAny = attendanceType.Where(t => t.AttendanceName.Contains(newAttendanceVacatione[i].AttendanceName));
if (typeAny == null || !typeAny.Any())
{
error.Add(new Dictionary<string, string>
{
{ "行号", $"第{i+1}行" },
{ "人员工号", newAttendanceVacatione[i].PersonnelNumber??"" },
{ "人员姓名", newAttendanceVacatione[i].PersonnelName??"" },
{ "考勤类型", newAttendanceVacatione[i].AttendanceName??"" },
{ "开始日期", newAttendanceVacatione[i].BegDate.ToString()??"" },
{ "结束日期", newAttendanceVacatione[i].EndDate.ToString()??"" },
{ "来源", "粘贴数据" },
{ "错误原因", "没有该考勤类型" },
});
}
if (newAttendanceVacatione[i].PersonnelName != per_employee.FirstOrDefault(t => t.PersonnelNumber == newAttendanceVacatione[i].PersonnelNumber && t.AllotId == allotId && t.HospitalId == hospitalId)?.DoctorName)
{
error.Add(new Dictionary<string, string>
......@@ -440,6 +442,51 @@ public ApiResponse AttendanceBatch(int allotId, int hospitalId, SaveCollectData
{ "来源", "“粘贴数据”与“历史数据”比对" },
{ "错误原因", $"原名“{oldEmp.PersonnelName}”,工号相同但姓名不同,请删除“历史数据”中该员工" },
});
}
DateTime dt = new DateTime(per_allot.Year, per_allot.Month, 1);
if (newAttendanceVacatione[i].BegDate >= dt && newAttendanceVacatione[i].EndDate > dt.AddMonths(1))
{
error.Add(new Dictionary<string, string>
{
{ "行号", $"第{i+1}行" },
{ "人员工号", newAttendanceVacatione[i].PersonnelNumber??"" },
{ "人员姓名", newAttendanceVacatione[i].PersonnelName??"" },
{ "考勤类型", newAttendanceVacatione[i].AttendanceName??"" },
{ "开始日期", newAttendanceVacatione[i].BegDate.ToString()??"" },
{ "结束日期", newAttendanceVacatione[i].EndDate.ToString()??"" },
{ "来源", "粘贴数据" },
{ "错误原因", "考勤时间不在该绩效月份内" },
});
}
var newDate = SplitEveryDay(Convert.ToDateTime(newAttendanceVacatione[i].BegDate), Convert.ToDateTime(newAttendanceVacatione[i].EndDate));
foreach (var item in oldAttendanceVacatione.Where(w => w.PersonnelNumber == newAttendanceVacatione[i].PersonnelNumber))
{
var oldDate = SplitEveryDay(Convert.ToDateTime(item.BegDate), Convert.ToDateTime(item.EndDate));
bool any = false;
foreach (var old in oldDate)
{
if (newDate.Contains(old))
any = true;
}
if(any)
error.Add(new Dictionary<string, string>
{
{ "行号", $"第{i+1}行" },
{ "人员工号", newAttendanceVacatione[i].PersonnelNumber??"" },
{ "人员姓名", newAttendanceVacatione[i].PersonnelName??"" },
{ "考勤类型", newAttendanceVacatione[i].AttendanceName??"" },
{ "开始日期", newAttendanceVacatione[i].BegDate.ToString()??"" },
{ "结束日期", newAttendanceVacatione[i].EndDate.ToString()??"" },
{ "来源", "粘贴数据" },
{ "错误原因", "该考勤时间范围与历史考勤时间冲突" },
});
}
}
if (error.Count > 0)
......@@ -469,7 +516,7 @@ public ApiResponse AttendanceBatch(int allotId, int hospitalId, SaveCollectData
}
#endregion
public ApiResponse GetAttendanceStatistics(int allotId)
public ApiResponse<List<AttendanceStatistics>> GetAttendanceStatistics(int allotId)
{
var allot = perforPerallotRepository.GetEntity(w => w.ID == allotId);
if (allot == null)
......@@ -482,7 +529,7 @@ public ApiResponse GetAttendanceStatistics(int allotId)
var attendanceData = perforPerallotRepository.GetAttendance(allotId)
.Where(w => numbers.Contains(w.PersonnelNumber))
.ToList();
//var attendanceData = perforPerallotRepository.GetAttendance(allotId);
List<AttendanceStatistics> statistics = new List<AttendanceStatistics>();
// 交叉补全科室结束时间
......@@ -536,8 +583,16 @@ public ApiResponse GetAttendanceStatistics(int allotId)
Remark = w.Remark,
})
.ToList();
int vacationesDays = 0;
foreach (var item in stat.Detial)
{
if (!item.Remark.Contains("不核减"))
vacationesDays += item.Value;
}
stat.AttendanceDays = SplitEveryDay(stat.BeginDate, stat.EndDate).Where(date => date >= stat.BeginDate && date <= stat.EndDate).Count() - vacationesDays;
}
return new ApiResponse(ResponseType.OK, "", statistics);
return new ApiResponse<List<AttendanceStatistics>>(ResponseType.OK, "", statistics);
}
// 拆分请假时间段为每个日期
......@@ -602,27 +657,5 @@ private List<DateTime> SplitEveryDay(DateTime begin, DateTime end)
(nameof(RecordAttendcance.BegDate), "开始时间", t => t.BegDate),
(nameof(RecordAttendcance.EndDate), "结束时间", t => t.EndDate),
};
public class AttendanceConfig
{
public static List<AttendaceHeads> AttendcanceHeads { get; } = new List<AttendaceHeads>
{
new AttendaceHeads{Column="核算单元名称",Name=nameof(InitialAttendance.AccountingUnit)},
new AttendaceHeads{Column="科室名称",Name=nameof(InitialAttendance.Department)},
new AttendaceHeads{Column="姓名",Name=nameof(InitialAttendance.PersonnelName)},
new AttendaceHeads{Column="员工工号",Name=nameof(InitialAttendance.PersonnelNumber)},
new AttendaceHeads{Column="人员组别",Name=nameof(InitialAttendance.UnitType)},
new AttendaceHeads{Column="在科开始日期",Name=nameof(InitialAttendance.StartDate)},
new AttendaceHeads{Column="在科结束日期",Name=nameof(InitialAttendance.EndDate)},
};
public static List<AttendaceHeads> CallinlAttendcanceHeads { get; } = new List<AttendaceHeads>
{
new AttendaceHeads{Column="人员姓名",Name=nameof(per_attendance.PersonnelName)},
new AttendaceHeads{Column="员工工号",Name=nameof(per_attendance.PersonnelNumber)},
new AttendaceHeads{Column="调入核算单元",Name=nameof(per_attendance.CallInAccountingUnit)},
new AttendaceHeads{Column="调入组别",Name=nameof(per_attendance.CallInUnitType)},
new AttendaceHeads{Column="调入时间",Name=nameof(per_attendance.CallInDate)},
};
}
}
}
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