科室考勤统计

parent 0dd00ae3
...@@ -34,8 +34,8 @@ AttendanceService attendanceService ...@@ -34,8 +34,8 @@ AttendanceService attendanceService
public ApiResponse GetAttendance(int allotId) public ApiResponse GetAttendance(int allotId)
{ {
// 查询考勤视图,并按照设计图做格式转换 仅查询开始结束 // 查询考勤视图,并按照设计图做格式转换 仅查询开始结束
var result =_attendanceService.GetAttendance(allotId); var result = _attendanceService.GetAttendance(allotId);
if (result != null ) if (result != null)
{ {
return new ApiResponse(ResponseType.OK, result); return new ApiResponse(ResponseType.OK, result);
} }
...@@ -69,7 +69,7 @@ public ApiResponse GetCallIn(int allotId) ...@@ -69,7 +69,7 @@ public ApiResponse GetCallIn(int allotId)
public ApiResponse GetBatchCallInHandsonTable() public ApiResponse GetBatchCallInHandsonTable()
{ {
// 返回HandsonTable格式调动记录 // 返回HandsonTable格式调动记录
return new ApiResponse(ResponseType.OK,_attendanceService.GetBatchCallInHandsonTable()); return new ApiResponse(ResponseType.OK, _attendanceService.GetBatchCallInHandsonTable());
} }
/// <summary> /// <summary>
...@@ -80,7 +80,7 @@ public ApiResponse GetBatchCallInHandsonTable() ...@@ -80,7 +80,7 @@ public ApiResponse GetBatchCallInHandsonTable()
/// <param name="request"></param> /// <param name="request"></param>
/// <returns></returns> /// <returns></returns>
[HttpPost("CallIn/Batch/{allotId}")] [HttpPost("CallIn/Batch/{allotId}")]
public ApiResponse BatchCallIn(int allotId,int hospitalId,SaveCollectData request) public ApiResponse BatchCallIn(int allotId, int hospitalId, SaveCollectData request)
{ {
// obj自己定义结构 // obj自己定义结构
// 批量插入调动记录,插入前需要删除所有后重新插入 // 批量插入调动记录,插入前需要删除所有后重新插入
...@@ -89,7 +89,7 @@ public ApiResponse BatchCallIn(int allotId,int hospitalId,SaveCollectData reques ...@@ -89,7 +89,7 @@ public ApiResponse BatchCallIn(int allotId,int hospitalId,SaveCollectData reques
// 需要验证核算组别和核算单元是否与“核算单元及组别”(cof_accounting)完全匹配,不匹配则返回表格错误提示 // 需要验证核算组别和核算单元是否与“核算单元及组别”(cof_accounting)完全匹配,不匹配则返回表格错误提示
// 表格错误提醒参考PersonService.CreatePerson方法 // 表格错误提醒参考PersonService.CreatePerson方法
return _attendanceService.BatchCallIn(allotId,hospitalId,request); return _attendanceService.BatchCallIn(allotId, hospitalId, request);
} }
#endregion #endregion
...@@ -103,7 +103,7 @@ public ApiResponse BatchCallIn(int allotId,int hospitalId,SaveCollectData reques ...@@ -103,7 +103,7 @@ public ApiResponse BatchCallIn(int allotId,int hospitalId,SaveCollectData reques
[HttpGet("Type/{allotId},{hospitalId}")] [HttpGet("Type/{allotId},{hospitalId}")]
public ApiResponse GetAttendanceType(int allotId, int hospitalId) public ApiResponse GetAttendanceType(int allotId, int hospitalId)
{ {
return new ApiResponse(ResponseType.OK,_attendanceService.GetAttendanceType(allotId,hospitalId)); return new ApiResponse(ResponseType.OK, _attendanceService.GetAttendanceType(allotId, hospitalId));
} }
/// <summary> /// <summary>
/// 新增或修改考勤类型 /// 新增或修改考勤类型
...@@ -113,7 +113,7 @@ public ApiResponse GetAttendanceType(int allotId, int hospitalId) ...@@ -113,7 +113,7 @@ public ApiResponse GetAttendanceType(int allotId, int hospitalId)
/// <param name="attendanceType"></param> /// <param name="attendanceType"></param>
/// <returns></returns> /// <returns></returns>
[HttpPost("Type/Edit/{allotId},{hospitalId}")] [HttpPost("Type/Edit/{allotId},{hospitalId}")]
public ApiResponse InsertAttendanceType(int allotId,int hospitalId, AttendanceType attendanceType) public ApiResponse InsertAttendanceType(int allotId, int hospitalId, AttendanceType attendanceType)
{ {
// obj自己定义结构 // obj自己定义结构
return _attendanceService.InsertAttendanceType(allotId, hospitalId, attendanceType); return _attendanceService.InsertAttendanceType(allotId, hospitalId, attendanceType);
...@@ -140,7 +140,7 @@ public ApiResponse DeleteAttendanceType(int id) ...@@ -140,7 +140,7 @@ public ApiResponse DeleteAttendanceType(int id)
public ApiResponse GetAttendanceVacationHandsonTable() public ApiResponse GetAttendanceVacationHandsonTable()
{ {
// 返回HandsonTable格式考勤记录 // 返回HandsonTable格式考勤记录
return new ApiResponse(ResponseType.OK,_attendanceService.GetAttendanceVacationHandsonTable()); return new ApiResponse(ResponseType.OK, _attendanceService.GetAttendanceVacationHandsonTable());
} }
/// <summary> /// <summary>
...@@ -150,9 +150,9 @@ public ApiResponse GetAttendanceVacationHandsonTable() ...@@ -150,9 +150,9 @@ public ApiResponse GetAttendanceVacationHandsonTable()
/// <param name="hospitalId"></param> /// <param name="hospitalId"></param>
/// <returns></returns> /// <returns></returns>
[HttpGet("Vacation/{allotId},{hospitalId}")] [HttpGet("Vacation/{allotId},{hospitalId}")]
public ApiResponse GetAttendanceVacation(int allotId,int hospitalId) public ApiResponse GetAttendanceVacation(int allotId, int hospitalId)
{ {
return new ApiResponse(ResponseType.OK, _attendanceService.GetAttendanceVacation(allotId,hospitalId)); return new ApiResponse(ResponseType.OK, _attendanceService.GetAttendanceVacation(allotId, hospitalId));
} }
/// <summary> /// <summary>
...@@ -163,7 +163,7 @@ public ApiResponse GetAttendanceVacation(int allotId,int hospitalId) ...@@ -163,7 +163,7 @@ public ApiResponse GetAttendanceVacation(int allotId,int hospitalId)
/// <param name="request"></param> /// <param name="request"></param>
/// <returns></returns> /// <returns></returns>
[HttpPost("Vacation/Batch/{allotId}")] [HttpPost("Vacation/Batch/{allotId}")]
public ApiResponse AttendanceBatch(int allotId,int hospitalId, SaveCollectData request) public ApiResponse AttendanceBatch(int allotId, int hospitalId, SaveCollectData request)
{ {
// obj自己定义结构 // obj自己定义结构
// 批量插入考勤记录,插入前需要删除所有后重新插入 // 批量插入考勤记录,插入前需要删除所有后重新插入
...@@ -171,7 +171,7 @@ public ApiResponse AttendanceBatch(int allotId,int hospitalId, SaveCollectData r ...@@ -171,7 +171,7 @@ public ApiResponse AttendanceBatch(int allotId,int hospitalId, SaveCollectData r
// 需要验证工号和姓名是否与“人员字典”(per_employee)完全匹配,不匹配则返回表格错误提示 // 需要验证工号和姓名是否与“人员字典”(per_employee)完全匹配,不匹配则返回表格错误提示
// 表格错误提醒参考PersonService.CreatePerson方法 // 表格错误提醒参考PersonService.CreatePerson方法
return new ApiResponse(ResponseType.OK,_attendanceService.AttendanceBatch(allotId,hospitalId,request)); return new ApiResponse(ResponseType.OK, _attendanceService.AttendanceBatch(allotId, hospitalId, request));
} }
#endregion #endregion
...@@ -179,13 +179,12 @@ public ApiResponse AttendanceBatch(int allotId,int hospitalId, SaveCollectData r ...@@ -179,13 +179,12 @@ public ApiResponse AttendanceBatch(int allotId,int hospitalId, SaveCollectData r
/// 考勤结果统计 /// 考勤结果统计
/// </summary> /// </summary>
/// <param name="allotId"></param> /// <param name="allotId"></param>
/// <param name="hospitalId"></param>
/// <returns></returns> /// <returns></returns>
[HttpGet("statistics/{allotId}")] [HttpGet("statistics/{allotId}")]
public ApiResponse GetAttendanceStatistics(int allotId,int hospitalId) public ApiResponse GetAttendanceStatistics(int allotId)
{ {
// 返回结果参考接口 employee/apr/getdeptdetail // 返回结果参考接口 employee/apr/getdeptdetail
return _attendanceService.GetAttendanceStatistics(allotId, hospitalId); return _attendanceService.GetAttendanceStatistics(allotId);
} }
} }
} }
...@@ -6120,6 +6120,11 @@ ...@@ -6120,6 +6120,11 @@
验证失败描述 验证失败描述
</summary> </summary>
</member> </member>
<member name="P:Performance.EntityModels.Entity.per_attendance_type.IsDeduction">
<summary>
是否核减出勤 1 核减 2 不核减
</summary>
</member>
<member name="T:Performance.EntityModels.per_batch"> <member name="T:Performance.EntityModels.per_batch">
<summary> <summary>
分批发放记录 分批发放记录
...@@ -8845,6 +8850,56 @@ ...@@ -8845,6 +8850,56 @@
</summary> </summary>
</member> </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"> <member name="P:Performance.EntityModels.HisData.HisDepartment">
<summary> <summary>
His科室 His科室
......
...@@ -155,4 +155,19 @@ public enum Status ...@@ -155,4 +155,19 @@ public enum Status
超时 = 99, 超时 = 99,
} }
} }
public class Attendance
{
public enum Type
{
开始,
调入,
结束,
}
public enum Deduction
{
核减 = 1,
不核减 = 2,
}
}
} }
...@@ -16,6 +16,9 @@ public class per_attendance_type ...@@ -16,6 +16,9 @@ public class per_attendance_type
public int HospitalId { get; set; } //医院Id public int HospitalId { get; set; } //医院Id
public int AllotId { get; set; } //绩效Id public int AllotId { get; set; } //绩效Id
public string AttendanceName { get; set; } //考勤类型名称 public string AttendanceName { get; set; } //考勤类型名称
public int IsDeduction { get; set; } //是否核减出勤 1 核减 2 不核减 /// <summary>
/// 是否核减出勤 1 核减 2 不核减
/// </summary>
public int IsDeduction { get; set; }
} }
} }
...@@ -89,5 +89,55 @@ public class Detail ...@@ -89,5 +89,55 @@ public class Detail
} }
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; }
}
} }
...@@ -469,150 +469,86 @@ public ApiResponse AttendanceBatch(int allotId, int hospitalId, SaveCollectData ...@@ -469,150 +469,86 @@ public ApiResponse AttendanceBatch(int allotId, int hospitalId, SaveCollectData
} }
#endregion #endregion
public ApiResponse GetAttendanceStatistics(int allotId, int hospitalId) public ApiResponse GetAttendanceStatistics(int allotId)
{ {
var attendanceData = perforPerallotRepository.GetAttendance(allotId); var allot = perforPerallotRepository.GetEntity(w => w.ID == allotId);
//if (view_attendance == null || !view_attendance.Any()) return new AttendanceResponse<List<InitialAttendance>>(); if (allot == null)
throw new PerformanceException("当前绩效记录不存在");
var attendances = new List<InitialAttendance>();
var types = perfoPperAttendanceTypeRepository.GetEntities(t => t.AllotId == allotId) ?? new List<per_attendance_type>();
foreach (var item in attendanceData) var vacationeData = perfoPperAttendanceVacationeRepository.GetEntities(t => t.AllotId == allotId) ?? new List<per_attendance_vacation>();
{ // 只关注请假的人
if (!item.Source.Contains("结束")) var numbers = vacationeData.Select(w => w.PersonnelNumber).ToList();
{ var attendanceData = perforPerallotRepository.GetAttendance(allotId)
var temp = new InitialAttendance .Where(w => numbers.Contains(w.PersonnelNumber))
{ .ToList();
AccountingUnit = item.AccountingUnit,
Department = item.Department,
PersonnelName = item.PersonnelName, List<AttendanceStatistics> statistics = new List<AttendanceStatistics>();
PersonnelNumber = item.PersonnelNumber, // 交叉补全科室结束时间
UnitType = item.UnitType, foreach (var personnelNumber in attendanceData.Select(w => w.PersonnelNumber).Distinct())
{
var attendances = attendanceData.Where(w => w.PersonnelNumber == personnelNumber).OrderBy(w => w.AttendanceDate);
for (int i = 0; i < attendances.Count() - 1; i++)
{
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)
{
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>()
}; };
var select = attendanceData.Where(t => t.PersonnelNumber == item.PersonnelNumber && t.AccountingUnit == item.AccountingUnit); statistics.Add(stat);
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
{
temp.StartDate = select.FirstOrDefault(data => data.Source.Contains("开始")).AttendanceDate;
temp.EndDate = select.FirstOrDefault(data => data.Source.Contains("结束")).AttendanceDate;
} }
attendances.Add(temp);
} }
} var vacationes = vacationeData
.Where(w => w.BegDate.HasValue && w.EndDate.HasValue)
var type = perfoPperAttendanceTypeRepository.GetEntities(t => t.AllotId == allotId && t.HospitalId == hospitalId); .Select(w => new
var vacatione = perfoPperAttendanceVacationeRepository.GetEntities(t => t.AllotId == allotId && t.HospitalId == hospitalId);
var attendancesJoinVacatione = from a in attendances
join b in vacatione on a.PersonnelNumber equals b.PersonnelNumber into temp
from aleftjoinb in temp.DefaultIfEmpty()
join c in type on aleftjoinb?.TypeId equals c.Id into temp2
from bleftjoinc in temp2.DefaultIfEmpty()
select new InitialAttendanceJoin
{ {
AccountingUnit = a.AccountingUnit, w.PersonnelNumber,
Department = a.Department, Type = types.FirstOrDefault(p => p.Id == w.TypeId)?.AttendanceName ?? "考勤类型缺失",
PersonnelName = a.PersonnelName, Dates = SplitEveryDay(w.BegDate.Value.Date, w.EndDate.Value.Date),
PersonnelNumber = a.PersonnelNumber, Remark = types.FirstOrDefault(p => p.Id == w.TypeId)?.IsDeduction == (int)Attendance.Deduction.核减 ? "核减" : "不核减",
UnitType = a.UnitType,
StartDate = a.StartDate,
EndDate = a.EndDate,
AttendanceName = bleftjoinc?.AttendanceName,
IsDeduction = bleftjoinc?.IsDeduction??2,
BegDate = aleftjoinb?.BegDate,
bEndDate = aleftjoinb?.EndDate
};
var result = attendancesJoinVacatione.GroupBy(t => new { t.PersonnelNumber, t.PersonnelName,t.AccountingUnit,t.Department,t.UnitType}).Select(t => new AttendancesJoinVacatione
{
AccountingUnit = t.Key.AccountingUnit,
Department = t.Key.Department,
PersonnelName = t.Key.PersonnelName,
PersonnelNumber = t.Key.PersonnelNumber,
UnitType = t.Key.UnitType,
StartDate = t.FirstOrDefault().StartDate,
EndDate = t.FirstOrDefault().EndDate,
Detail = t.GroupBy(group => group.AttendanceName).Select(group => new EntityModels.Other.Detail
{
Title = group.Key,
//Value = Convert.ToInt32(new TimeSpan(Convert.ToDateTime(group.FirstOrDefault().BegDate).Ticks).Subtract(new TimeSpan(Convert.ToDateTime(group.FirstOrDefault().EndDate).Ticks)).Duration().Days) + 1,
BegDate = group.FirstOrDefault().BegDate,
EndDate = Convert.ToDateTime(group.FirstOrDefault().bEndDate),
IsDeduction = group.FirstOrDefault().IsDeduction,
VacationDays = 0
}).ToList(),
}); });
List<AttendancesJoinVacatione> list = new List<AttendancesJoinVacatione>();
foreach (var item in result)
{
AttendancesJoinVacatione temp = new AttendancesJoinVacatione()
{
AccountingUnit = item.AccountingUnit,
Department = item.Department,
PersonnelName = item.PersonnelName,
PersonnelNumber = item.PersonnelNumber,
UnitType = item.UnitType,
StartDate = item.StartDate,
EndDate = item.EndDate,
Detail = new List<EntityModels.Other.Detail>(),
AttendanceDays = 0,
};
foreach (var detail in item.Detail)
{
if (item.PersonnelName.Contains("夏东"))
{
if (item.StartDate >= detail.BegDate && detail.EndDate <= item.EndDate)
{
if (item.StartDate >= detail.BegDate && detail.EndDate <= item.EndDate)
detail.BegDate = item.StartDate;
detail.VacationDays = Convert.ToInt32(new TimeSpan(Convert.ToDateTime(detail.BegDate).Ticks).Subtract(new TimeSpan(Convert.ToDateTime(detail.EndDate).Ticks)).Duration().Days) + 1;
temp.Detail.Add(detail); foreach (var stat in statistics)
}
else if (detail.BegDate <= item.EndDate && detail.EndDate > item.EndDate)
{ {
detail.EndDate = Convert.ToDateTime(item.EndDate); stat.Detial = vacationes
detail.VacationDays = Convert.ToInt32(new TimeSpan(Convert.ToDateTime(detail.BegDate).Ticks).Subtract(new TimeSpan(Convert.ToDateTime(detail.EndDate).Ticks)).Duration().Days) + 1; .Where(w => w.PersonnelNumber == stat.PersonnelNumber)
.Select(w => new AttendanceStatisticsDetial
temp.Detail.Add(detail);
}
}
}
temp.AttendanceDays = Convert.ToInt32(new TimeSpan(Convert.ToDateTime(temp.StartDate).Ticks).Subtract(new TimeSpan(Convert.ToDateTime(temp.EndDate).Ticks)).Duration().Days) + 1;
var vacationDays = temp.Detail.Where(t => t.IsDeduction == 1).Select(t => t.VacationDays).ToArray();
for (int i = 0; i < vacationDays.Count(); i++)
{ {
temp.AttendanceDays = temp.AttendanceDays - vacationDays[i]; Title = w.Type,
Value = w.Dates.Where(date => date >= stat.BeginDate && date <= stat.EndDate).Count(),
Remark = w.Remark,
})
.ToList();
} }
list.Add(temp); return new ApiResponse(ResponseType.OK, "", statistics);
} }
AttendanceResponse<List<AttendancesJoinVacatione>> attendanceResponse = new AttendanceResponse<List<AttendancesJoinVacatione>>() // 拆分请假时间段为每个日期
private List<DateTime> SplitEveryDay(DateTime begin, DateTime end)
{ {
Heads = AttendanceConfig.StatisticsAttendcanceHeads, List<DateTime> dates = new List<DateTime>();
Datas = list for (int i = 0; i <= (end - begin).TotalDays; i++)
}; {
return new ApiResponse(ResponseType.OK, "ok", attendanceResponse); dates.Add(begin.AddDays(i));
}
return dates;
} }
...@@ -687,18 +623,6 @@ public class AttendanceConfig ...@@ -687,18 +623,6 @@ public class AttendanceConfig
new AttendaceHeads{Column="调入组别",Name=nameof(per_attendance.CallInUnitType)}, new AttendaceHeads{Column="调入组别",Name=nameof(per_attendance.CallInUnitType)},
new AttendaceHeads{Column="调入时间",Name=nameof(per_attendance.CallInDate)}, new AttendaceHeads{Column="调入时间",Name=nameof(per_attendance.CallInDate)},
}; };
public static List<AttendaceHeads> StatisticsAttendcanceHeads { get; } = new List<AttendaceHeads>
{
new AttendaceHeads{Column="核算单元名称",Name=nameof(AttendancesJoinVacatione.AccountingUnit)},
new AttendaceHeads{Column="科室名称",Name=nameof(AttendancesJoinVacatione.Department)},
new AttendaceHeads{Column="姓名",Name=nameof(AttendancesJoinVacatione.PersonnelName)},
new AttendaceHeads{Column="人员工号",Name=nameof(AttendancesJoinVacatione.PersonnelNumber)},
new AttendaceHeads{Column="人员组别",Name=nameof(AttendancesJoinVacatione.UnitType)},
new AttendaceHeads{Column="在科开始日期",Name=nameof(AttendancesJoinVacatione.StartDate)},
new AttendaceHeads{Column="在科结束日期",Name=nameof(AttendancesJoinVacatione.EndDate)},
new AttendaceHeads{Column="详细",Name=nameof(AttendancesJoinVacatione.Detail)},
new AttendaceHeads{Column="出勤天数",Name=nameof(AttendancesJoinVacatione.AttendanceDays)},
};
} }
} }
} }
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