写代码时候,第一次是为了实现需要功能。
w.IsHasSpecialTime = True
dMints = ComClass.TimesLapse(dSub.ToDate, dSub.FromDate).TotalMinutes
If w.TimePeriod IsNot Nothing Then
For Each d In AttTimeList
If ComClass.TimeInScope(d, ComClass.TimesCombine(w.Day, w.TimePeriod.CheckInTime1Date), ComClass.TimesCombine(w.Day, w.TimePeriod.CheckInTime2Date)) Then
w.AttInDate = d
Exit For
End If
Next
If w.IsOverDay Then
For i As Integer = AttTimeList2Day.Count - 1 To 0 Step -1
d = AttTimeList2Day.Item(i)
If ComClass.TimeInScope(d, ComClass.TimesCombine(w.Day.AddDays(1), w.TimePeriod.CheckOutTime1Date), ComClass.TimesCombine(w.Day.AddDays(1), w.TimePeriod.CheckOutTime2Date)) Then
w.AttOutDate = d
Exit For
End If
Next
Else
For i As Integer = AttTimeList.Count - 1 To 0 Step -1
d = AttTimeList.Item(i)
If ComClass.TimeInScope(d, ComClass.TimesCombine(w.Day, w.TimePeriod.CheckOutTime1Date), ComClass.TimesCombine(w.Day, w.TimePeriod.CheckOutTime2Date)) Then
w.AttOutDate = d
Exit For
End If
Next
End If
If w.AttInDate = MinDate OrElse w.AttOutDate = MinDate Then
w.IsCalculate = True
w.AttHours = 0
w.InValidHours = (w.TimePeriod.WorkMinutes - dMints) / 60
dSub.ValidHours = dMints / 60
ElseIf w.AttInDate > MinDate And w.AttOutDate > MinDate Then
w.IsCalculate = True
w.AttHours = (w.TimePeriod.WorkMinutes - dMints) / 60
dSub.ValidHours = dMints / 60
End If
End If
处理效果还是可以,不过代码很长很长。同时间有10几个类似这样的代码段。加上其他内容差不多1000多行代码。
于是就想简化点。弄了好久才得出简化结果。 10几个类似的代码段慢慢改。剩下800多行了。
w.IsHasSpecialTime = True
dMints = ComClass.TimesLapse(dSub.ToDate, dSub.FromDate).TotalMinutes
getAttIn(w, ComClass.TimesCombine(w.Day, w.TimePeriod.CheckInTime1Date), ComClass.TimesCombine(w.Day, w.TimePeriod.CheckInTime2Date))
If w.IsOverDay Then
getAttOut2Day(w, ComClass.TimesCombine(w.Day.AddDays(1), w.TimePeriod.CheckOutTime1Date), ComClass.TimesCombine(w.Day.AddDays(1), w.TimePeriod.CheckOutTime2Date))
Else
getAttOut1Day(w, ComClass.TimesCombine(w.Day, w.TimePeriod.CheckOutTime1Date), ComClass.TimesCombine(w.Day, w.TimePeriod.CheckOutTime2Date))
End If
If w.AttInDate = MinDate OrElse w.AttOutDate = MinDate Then
w.IsCalculate = True
w.AttHours = 0
w.InValidHours = (w.TimePeriod.WorkMinutes - dMints) / 60
dSub.ValidHours = dMints / 60
ElseIf w.AttInDate > MinDate And w.AttOutDate > MinDate Then
w.IsCalculate = True
w.AttHours = (w.TimePeriod.WorkMinutes - dMints) / 60
dSub.ValidHours = dMints / 60
End If
结果中间过程有点问题,忽略了很多节点判断,分析,于是结构重新调整,增加几个函数过程。
继续简化,优化。结果不知道能简化成多少行,但是单从字符多少来看,已经减少了很多字符了。
dMints = ComClass.TimesLapse(dSub.ToDate, dSub.FromDate).TotalMinutes
With w
.IsHasSpecialTime = True
.CalcWorkTimeRange()
End With
getAttTime(w)
If w.AttInDate = MinDate OrElse w.AttOutDate = MinDate Then
w.AttHours = 0
w.InValidHours = ToHour(w.WorkMinutes - dMints)
dSub.ValidHours = ToHour(dMints)
ElseIf w.AttInDate > MinDate And w.AttOutDate > MinDate Then
w.AttHours = ToHour(w.WorkMinutes - dMints)
dSub.ValidHours = ToHour(dMints)
End If
期待能得出自己想要的结果。
加油!