Skip to content

Commit 49e609e

Browse files
committed
Resolves resolves #21, resolves #23, resolves #24
1 parent c5d6015 commit 49e609e

File tree

6 files changed

+105
-18
lines changed

6 files changed

+105
-18
lines changed

PunchPal.Core/Services/AttendanceTypeService.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public async Task<List<AttendanceType>> List()
6565
}
6666
}
6767
public static readonly string[] AskForLeaveIds = new string[] { "AL", "SL", "PL", "ML", "PPL", "BL", "FL", "CL", "GL", "RL", "TL", "BD", "IW" };
68+
public static readonly string[] PunchInRecordIds = new string[] { "NA", "CP" };
6869
private static readonly KeyValuePair<string, string>[] initialTyps = new KeyValuePair<string, string>[]
6970
{
7071
// 考勤类型

PunchPal.Core/Services/WorkHourService.cs

Lines changed: 70 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,23 +23,34 @@ public async Task<List<WorkingHours>> List(int dayStartHour, Expression<Func<Pun
2323
var records = await PunchRecordService.Instance.List(predicate);
2424
return await List(dayStartHour, records);
2525
}
26-
public async Task<List<WorkingHours>> List(int dayStartHour, IEnumerable<PunchRecord> punchRecords)
26+
public async Task<List<WorkingHours>> List(int dayStartHour, IEnumerable<PunchRecord> punchRecordEnumerables)
2727
{
2828
var result = new List<WorkingHours>();
29-
if (punchRecords == null || punchRecords.Count() == 0)
29+
if (punchRecordEnumerables == null || punchRecordEnumerables.Count() == 0)
3030
{
3131
return result;
3232
}
33-
var lastRecord = punchRecords.FirstOrDefault();
33+
var lastRecord = punchRecordEnumerables.FirstOrDefault();
34+
var punchRecords = punchRecordEnumerables.ToList();
3435
var lastDate = lastRecord.PunchDateTime;
3536
var monthStartDay = new DateTime(lastDate.Year, lastDate.Month, 1);
3637
var monthEndDay = monthStartDay.AddMonths(1).AddDays(-1);
3738
var now = DateTime.Now;
3839
var startUnix = monthStartDay.TimestampUnix();
3940
var endUnix = monthEndDay.TimestampUnix();
4041
var workingTimeRanges = await WorkingTimeRangeService.Instance.Items(startUnix, endUnix);
41-
var attendanceRecords = await AttendanceRecordService.Instance.List(m => m.StartTime >= startUnix && m.StartTime < endUnix && AttendanceTypeService.AskForLeaveIds.Contains(m.AttendanceTypeId));
42+
var attendances = await AttendanceRecordService.Instance.List(m => m.StartTime >= startUnix && m.StartTime < endUnix && AttendanceTypeService.AskForLeaveIds.Contains(m.AttendanceTypeId));
43+
var punchInRecords = await AttendanceRecordService.Instance.List(m => m.StartTime >= startUnix && m.StartTime < endUnix && (m.EndTime <= 0 || m.EndTime < endUnix) && AttendanceTypeService.PunchInRecordIds.Contains(m.AttendanceTypeId));
44+
var attendanceRecords = ParseAttendance(attendances, workingTimeRanges);
4245
var calendars = await CalendarService.Instance.ListAll(m => m.Date >= startUnix && m.Date < endUnix);
46+
foreach (var item in punchInRecords)
47+
{
48+
if (item.StartTime <= 0 && item.EndTime <= 0) continue;
49+
punchRecords.Add(new PunchRecord()
50+
{
51+
PunchTime = item.StartTime > 0 ? item.StartTime : item.EndTime,
52+
});
53+
}
4354
for (var i = 1; i <= monthEndDay.Day; i++)
4455
{
4556
if (monthEndDay.Year == now.Year && monthEndDay.Month == now.Month && i > now.Day)
@@ -61,6 +72,60 @@ public async Task<List<WorkingHours>> List(int dayStartHour, IEnumerable<PunchRe
6172
return result.OrderByDescending(m => m.WorkingDate).ToList();
6273
}
6374

75+
private List<AttendanceRecord> ParseAttendance(List<AttendanceRecord> attendances, Dictionary<long, WorkingTimeRangeItems> workingTimeRanges)
76+
{
77+
var result = new List<AttendanceRecord>();
78+
foreach (var item in attendances)
79+
{
80+
var startDate = item.StartDateTime;
81+
var endDate = item.EndDateTime;
82+
var startDateUnix = startDate?.TimestampUnix() ?? 0;
83+
var endDateUnix = endDate?.TimestampUnix() ?? 0;
84+
var diff = endDateUnix - startDateUnix;
85+
if (diff > DateTimeTools.DaySeconds)
86+
{
87+
var ranges = GetDateRanges(startDate.Value, endDate.Value, workingTimeRanges);
88+
foreach (var range in ranges)
89+
{
90+
result.Add(new AttendanceRecord()
91+
{
92+
AttendanceId = item.AttendanceId,
93+
AttendanceTypeId = item.AttendanceTypeId,
94+
AttendanceType = item.AttendanceType,
95+
UserId = item.UserId,
96+
StartTime = range.Item1,
97+
EndTime = range.Item2,
98+
AttendanceTime = item.AttendanceTime,
99+
Remark = item.Remark
100+
});
101+
}
102+
}
103+
else
104+
{
105+
result.Add(item);
106+
}
107+
}
108+
return result;
109+
}
110+
111+
private List<(int, int)> GetDateRanges(DateTime startTime, DateTime endTime, Dictionary<long, WorkingTimeRangeItems> workingTimeRanges)
112+
{
113+
var result = new List<(int, int)>();
114+
var endTimeUnix = endTime.TimestampUnix();
115+
for (var start = startTime; start < endTime; start = start.AddDays(1))
116+
{
117+
var dateUnix = start.Date.TimestampUnix();
118+
if (!workingTimeRanges.TryGetValue(dateUnix, out WorkingTimeRangeItems work))
119+
{
120+
continue;
121+
}
122+
var startWorkDate = new DateTime(start.Year, start.Month, start.Day, work.Work.StartHour, work.Work.StartMinute, 0);
123+
var endWorkDate = new DateTime(start.Year, start.Month, start.Day, work.Work.EndHour, work.Work.EndMinute, 0);
124+
result.Add((Math.Max(startWorkDate.TimestampUnix(), start.TimestampUnix()), Math.Min(endWorkDate.TimestampUnix(), endTimeUnix)));
125+
}
126+
return result;
127+
}
128+
64129
private List<AttendanceRecord> GetAttendanceRecords(List<AttendanceRecord> attendanceRecords, long timeStart, long timeEnd, WorkingTimeRangeItems workingTime)
65130
{
66131
var currentRecords = attendanceRecords.Where(m => m.StartTime >= timeStart && m.StartTime < timeEnd).ToList();
@@ -73,7 +138,7 @@ private List<AttendanceRecord> GetAttendanceRecords(List<AttendanceRecord> atten
73138
var startWorkDate = new DateTime(date.Year, date.Month, date.Day, workingTime.Work.StartHour, 0, 0);
74139
if (currentRecords.Count == 0)
75140
{
76-
var currentCrossRecords = attendanceRecords.Where(m => m.StartTime < timeStart && m.EndTime > timeStart).ToList();
141+
var currentCrossRecords = attendanceRecords.Where(m => m.StartTime <= timeStart && m.EndTime >= timeStart).ToList();
77142
foreach (var item in currentCrossRecords)
78143
{
79144
item.StartTime = Math.Max(item.StartTime, startWorkDate.TimestampUnix());

PunchPal.Core/ViewModels/CalendarItem.cs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public float BackgroundOpacity
117117
public bool IsWorkOvertime { get; set; }
118118

119119
private List<string> _textList = null;
120-
private List<string> _remarks = null;
120+
private readonly List<string> _remarks = new List<string>();
121121
private string _lunarDate = string.Empty;
122122
public string TextListText
123123
{
@@ -128,20 +128,25 @@ public string TextListText
128128
{
129129
result.Add(DaySchedule);
130130
}
131+
var textList = TextList;
132+
if (_remarks.Count > 0)
133+
{
134+
result.AddRange(_remarks);
135+
}
131136
var settings = SettingsModel.Load();
132137
var lunarSolarTermVisible = settings.Calendar.LunarSolarTermVisible;
133138
var otherFestivalVisible = settings.Calendar.OtherFestivalVisible;
134139
if (lunarSolarTermVisible && otherFestivalVisible)
135140
{
136-
result.AddRange(TextList);
141+
result.AddRange(textList);
137142
}
138143
else if (lunarSolarTermVisible)
139144
{
140-
result.AddRange(TextList.Where(m => CalendarService.ChineseHolidays.Contains(m) && CalendarService.SolarTerms.Contains(m)));
145+
result.AddRange(textList.Where(m => CalendarService.ChineseHolidays.Contains(m) || CalendarService.SolarTerms.Contains(m)));
141146
}
142147
else if (otherFestivalVisible)
143148
{
144-
result.AddRange(TextList.Where(m => !CalendarService.ChineseHolidays.Contains(m) && !CalendarService.SolarTerms.Contains(m)));
149+
result.AddRange(textList.Where(m => !CalendarService.ChineseHolidays.Contains(m) && !CalendarService.SolarTerms.Contains(m)));
145150
}
146151
if (result.Count == 0 && !string.IsNullOrWhiteSpace(_lunarDate))
147152
{
@@ -171,10 +176,6 @@ public List<string> TextList
171176
_remarks.Add(item.Trim());
172177
}
173178
}
174-
else
175-
{
176-
_remarks = new List<string>();
177-
}
178179
var festivalEmpty = string.IsNullOrWhiteSpace(record.Festival);
179180
var solarTermEmpty = string.IsNullOrWhiteSpace(record.SolarTerm);
180181
if (!solarTermEmpty && record.SolarTerm != record.Festival && !_textList.Contains(record.SolarTerm))
@@ -211,7 +212,14 @@ public string TextListToolTip
211212
{
212213
get
213214
{
214-
var text = string.Join(Environment.NewLine, TextList);
215+
var result = new List<string>();
216+
var textList = TextList;
217+
if (_remarks != null && _remarks.Count > 0)
218+
{
219+
result.AddRange(_remarks);
220+
}
221+
result.AddRange(textList);
222+
var text = string.Join(Environment.NewLine, result.Distinct());
215223
if (!SettingsModel.Load().Calendar.LunarSolarTermVisible ||
216224
_calendarData == null ||
217225
string.IsNullOrWhiteSpace(_calendarData.LunarYear) ||
@@ -225,7 +233,7 @@ public string TextListToolTip
225233
{
226234
return lunarDate;
227235
}
228-
return string.Join(Environment.NewLine, TextList) + Environment.NewLine + lunarDate;
236+
return text + Environment.NewLine + lunarDate;
229237
}
230238
}
231239

PunchPal.Core/ViewModels/DataSourceModel.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,12 @@ public void Save()
349349
_ = SaveReal(saveCts.Token);
350350
}
351351

352+
public async Task OnSave()
353+
{
354+
saveCts?.Cancel();
355+
await SaveReal();
356+
}
357+
352358
public async Task SaveReal(CancellationToken? token = null)
353359
{
354360
try

PunchPal.Core/ViewModels/SettingsModel.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,15 @@ public void Save()
163163

164164
private async void OnSave()
165165
{
166-
saveCts?.Cancel();
167-
await SaveReal();
166+
if (CurrentSettingPage == PageType.DataSource)
167+
{
168+
await DataSource.OnSave();
169+
}
170+
else
171+
{
172+
saveCts?.Cancel();
173+
await SaveReal();
174+
}
168175
EventManager.ShowTips(new Models.TipsOption("提示", "保存成功"));
169176
}
170177

PunchPal.WPF/PunchPal.WPF.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<RepositoryType>git</RepositoryType>
1414
<Product>PunchPal</Product>
1515
<Authors>PicaPico</Authors>
16-
<Version>2.0.7</Version>
16+
<Version>2.0.8</Version>
1717
<AssemblyTitle>PunchPal</AssemblyTitle>
1818
<IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>
1919
<PackageIcon>logo.ico</PackageIcon>

0 commit comments

Comments
 (0)