Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
E
Education
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
黄奎
Education
Commits
b5040071
Commit
b5040071
authored
Dec 01, 2020
by
liudong1993
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
app 考勤打卡
parent
176f2807
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
927 additions
and
3 deletions
+927
-3
ResultCode.cs
Edu.Common/API/ResultCode.cs
+4
-0
TechnicalTypeEnum.cs
Edu.Common/Enum/User/TechnicalTypeEnum.cs
+19
-0
MapHelper.cs
Edu.Common/Plugin/MapHelper.cs
+60
-0
AttendanceRecodModule.cs
Edu.Module.User/AttendanceRecodModule.cs
+661
-0
UserCenterController.cs
Edu.WebApi/Controllers/User/UserCenterController.cs
+183
-3
No files found.
Edu.Common/API/ResultCode.cs
View file @
b5040071
...
...
@@ -40,5 +40,9 @@
/// 表单重复提交
/// </summary>
FormRepeatSubmit
=
10003
,
/// <summary>
/// 不在打卡范围
/// </summary>
NotInCardRange
=
20001
,
}
}
Edu.Common/Enum/User/TechnicalTypeEnum.cs
0 → 100644
View file @
b5040071
using
Edu.Common.Plugin
;
namespace
Edu.Common.Enum.User
{
/// <summary>
/// 特殊日期打卡类型
/// </summary>
public
enum
TechnicalTypeEnum
{
/// <summary>
/// 打卡
/// </summary>
PunchCard
=
1
,
/// <summary>
/// 不打卡
/// </summary>
NoPunchCard
=
2
}
}
\ No newline at end of file
Edu.Common/Plugin/MapHelper.cs
0 → 100644
View file @
b5040071
using
System
;
namespace
Edu.Common.Plugin
{
/// <summary>
/// 地图帮助类
/// </summary>
public
class
MapHelper
{
//地球半径,单位米
private
const
double
EARTH_RADIUS
=
6378137
;
/// <summary>
/// 计算两点位置的距离,返回两点的距离,单位 米
/// </summary>
/// <param name="lat1">第一点纬度</param>
/// <param name="lng1">第一点经度</param>
/// <param name="lat2">第二点纬度</param>
/// <param name="lng2">第二点经度</param>
/// <returns></returns>
public
static
double
GetDistance
(
double
lat1
,
double
lng1
,
double
lat2
,
double
lng2
)
{
double
radLat1
=
Rad
(
lat1
);
double
radLng1
=
Rad
(
lng1
);
double
radLat2
=
Rad
(
lat2
);
double
radLng2
=
Rad
(
lng2
);
double
a
=
radLat1
-
radLat2
;
double
b
=
radLng1
-
radLng2
;
double
result
=
2
*
Math
.
Asin
(
Math
.
Sqrt
(
Math
.
Pow
(
Math
.
Sin
(
a
/
2
),
2
)
+
Math
.
Cos
(
radLat1
)
*
Math
.
Cos
(
radLat2
)
*
Math
.
Pow
(
Math
.
Sin
(
b
/
2
),
2
)))
*
EARTH_RADIUS
;
return
result
;
}
/// <summary>
/// 计算两个坐标点之间的距离
/// 计算两点位置的距离,返回两点的距离,单位 米
/// </summary>
/// <param name="firstPoint">第一个坐标点的(纬度,经度)</param>
/// <param name="secondPoint">第二个坐标点的(纬度,经度)</param>
/// <returns>返回两点之间的距离,单位:公里/千米</returns>
public
static
double
GetPointDistance
(
string
firstPoint
,
string
secondPoint
)
{
var
firstArray
=
firstPoint
.
Split
(
','
);
var
secondArray
=
secondPoint
.
Split
(
','
);
var
firstLatitude
=
Convert
.
ToDouble
(
firstArray
[
0
].
Trim
());
var
firstLongitude
=
Convert
.
ToDouble
(
firstArray
[
1
].
Trim
());
var
secondLatitude
=
Convert
.
ToDouble
(
secondArray
[
0
].
Trim
());
var
secondLongitude
=
Convert
.
ToDouble
(
secondArray
[
1
].
Trim
());
return
GetDistance
(
firstLatitude
,
firstLongitude
,
secondLatitude
,
secondLongitude
);
}
/// <summary>
/// 经纬度转化成弧度
/// </summary>
/// <param name="d"></param>
/// <returns></returns>
private
static
double
Rad
(
double
d
)
{
return
(
double
)
d
*
Math
.
PI
/
180d
;
}
}
}
Edu.Module.User/AttendanceRecodModule.cs
0 → 100644
View file @
b5040071
using
Edu.Common.API
;
using
Edu.Common.Enum.User
;
using
Edu.Common.Plugin
;
using
Edu.Model.CacheModel
;
using
Edu.Model.Entity.User
;
using
Edu.Model.Public
;
using
Edu.Model.ViewModel.User
;
using
Edu.Repository.User
;
using
Newtonsoft.Json
;
using
Newtonsoft.Json.Linq
;
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Text
;
using
VT.FW.DB
;
namespace
Edu.Module.User
{
/// <summary>
/// 考勤处理类
/// </summary>
public
class
AttendanceRecodModule
{
private
Rb_attendanceRepository
respository
=
new
Rb_attendanceRepository
();
private
Rb_attendance_wayRepository
AWrespository
=
new
Rb_attendance_wayRepository
();
private
Rb_workdaysetingRepository
WDrespository
=
new
Rb_workdaysetingRepository
();
private
Rb_technicaldatesRepository
TDrespository
=
new
Rb_technicaldatesRepository
();
private
Rb_attendance_recordRepository
attendRecordRespository
=
new
Rb_attendance_recordRepository
();
/// <summary>
/// 获取打卡信息
/// </summary>
/// <param name="empId">员工id</param>
/// <param name="RB_Department_Id">部门id</param>
/// <param name="date">打卡日期</param>
/// <returns></returns>
public
JObject
GetAttendRecod
(
int
empId
,
int
RB_Department_Id
,
string
date
)
{
if
(
Convert
.
ToDateTime
(
date
).
Date
>
DateTime
.
Now
.
Date
)
{
return
null
;
}
RB_Attendance_Extend
attendance
=
respository
.
GetAttendanceByEmpId
(
empId
);
if
(
attendance
!=
null
)
{
if
(
attendance
.
CreateTime
.
Date
>
Convert
.
ToDateTime
(
date
).
Date
)
{
return
null
;
}
}
else
{
return
null
;
}
//打卡记录信息
RB_Attendance_Record_Extend
recode
=
attendRecordRespository
.
GetAttendRecod
(
empId
,
date
);
JObject
result
=
new
JObject
();
//先查询特殊日期打卡时间
//RB_Technicaldates_Extend technical = TDrespository.GetSpecialDate(empId, RB_Department_Id, date);
var
technicalList
=
TDrespository
.
GetSpecialDateList
(
empId
,
date
);
// ld 2020-05-25调整
RB_Technicaldates_Extend
technical
=
null
;
if
(
technicalList
.
Any
())
{
if
(
technicalList
.
Where
(
x
=>
x
.
EmployeeId
>
0
).
Any
()
&&
technicalList
.
Where
(
x
=>
x
.
EmployeeId
==
empId
).
Any
())
{
technical
=
technicalList
.
Where
(
x
=>
x
.
EmployeeId
==
empId
).
FirstOrDefault
();
}
else
if
(
technicalList
.
Where
(
x
=>
x
.
RB_Department_Id
>
0
).
Any
()
&&
technicalList
.
Where
(
x
=>
x
.
RB_Department_Id
==
RB_Department_Id
).
Any
())
{
technical
=
technicalList
.
Where
(
x
=>
x
.
RB_Department_Id
==
RB_Department_Id
).
FirstOrDefault
();
}
else
{
if
(
technicalList
.
Where
(
x
=>
x
.
RB_Department_Id
==
0
&&
x
.
EmployeeId
==
0
).
Any
())
{
technical
=
technicalList
.
Where
(
x
=>
x
.
RB_Department_Id
==
0
&&
x
.
EmployeeId
==
0
).
FirstOrDefault
();
}
}
}
if
(
technical
!=
null
)
{
if
(
technical
.
Type
==
(
int
)
TechnicalTypeEnum
.
PunchCard
)
{
result
[
"onTime"
]
=
technical
.
BeOnDutyTime
;
result
[
"offTime"
]
=
technical
.
OffDutyTime
;
}
else
{
//特殊日期不打卡
return
null
;
}
}
else
{
//正常打卡日期
RB_WorkdaySeting_Extend
workDay
=
WDrespository
.
GetWorkDay
(
empId
,
StringHelper
.
GetWeek
(
Convert
.
ToDateTime
(
date
)));
if
(
workDay
!=
null
)
{
result
[
"onTime"
]
=
workDay
.
BeOnDutyTime
;
result
[
"offTime"
]
=
workDay
.
OffDutyTime
;
}
else
{
return
null
;
}
}
if
(
recode
!=
null
)
{
if
(!
string
.
IsNullOrEmpty
(
recode
.
BeOnTime
))
{
result
[
"onTime"
]
=
recode
.
BeOnTime
;
}
if
(!
string
.
IsNullOrEmpty
(
recode
.
OffTime
))
{
result
[
"offTime"
]
=
recode
.
OffTime
;
}
result
[
"id"
]
=
recode
.
Id
;
result
[
"onStatus"
]
=
(
int
)
recode
.
BeOnStatus
;
result
[
"onPunshCardTime"
]
=
recode
.
BeOnDutyTime
==
null
?
""
:
recode
.
BeOnDutyTime
.
Value
.
ToString
(
"HH:mm"
);
result
[
"onPunshCardAddress"
]
=
recode
.
BeOnVerifyAddress
;
result
[
"isLackCard"
]
=
recode
.
BeOnStatus
==
AttendanceEnum
.
QK
?
true
:
false
;
result
[
"offStatus"
]
=
(
int
)
recode
.
OffStatus
;
result
[
"offPunshCardTime"
]
=
recode
.
OffDutyTime
?.
ToString
(
"HH:mm"
);
result
[
"offPunshCardAddress"
]
=
recode
.
OffVerifyAddress
;
}
else
{
result
[
"id"
]
=
0
;
result
[
"onStatus"
]
=
0
;
result
[
"onPunshCardTime"
]
=
null
;
result
[
"onPunshCardAddress"
]
=
""
;
result
[
"isLackCard"
]
=
false
;
result
[
"offStatus"
]
=
0
;
result
[
"offPunshCardTime"
]
=
null
;
result
[
"offPunshCardAddress"
]
=
""
;
}
string
[]
tempTypeStr
=
WFTTemplateTypeEnum
.
ReissueCard
.
ToName
().
Split
(
'|'
);
result
[
"cmd"
]
=
tempTypeStr
[
3
];
//请求表单cmd
result
[
"submitCmd"
]
=
tempTypeStr
[
4
];
//提交表单cmd
return
result
;
}
/// <summary>
/// 验证是否在打卡范围
/// </summary>
/// <param name="empId">员工id</param>
/// <param name="latAndLong">经纬度(维度,经度)</param>
/// <param name="wifiMac">mac地址</param>
/// <param name="oldWifiMac">原始wifiMac</param>
/// <param name="wayList">公司考勤方式</param>
/// <returns></returns>
public
bool
VerifyPunchCard
(
int
empId
,
string
latAndLong
,
string
wifiMac
,
string
oldWifiMac
,
out
List
<
RB_Attendance_Way_Extend
>
wayList
)
{
//verifyAddress合法类型名称
//type合法类型 1 地点 2 wifi
wayList
=
AWrespository
.
GetWayByEmployeeId
(
empId
);
return
IsRange
(
empId
,
latAndLong
,
wifiMac
,
oldWifiMac
,
out
int
type
,
out
string
verifyAddress
);
}
/// <summary>
/// App考勤打卡
/// </summary>
/// <param name="empId">员工id</param>
/// <param name="RB_Department_Id">部门id</param>
/// <param name="latAndLong">经纬度(维度,经度)</param>
/// <param name="wifiMac">mac地址</param>
/// <param name="oldWifiMac">原始mac</param>
/// <param name="phoneId">手机唯一id</param>
/// <param name="address">打卡地址</param>
/// <param name="PhoneName">打卡地址</param>
/// <param name="PunchCardType">1上班,2下班</param>
/// <param name="isNotVerifyVifi">是否验证wifi</param>
/// <returns></returns>
public
string
PunchCard
(
int
empId
,
int
RB_Department_Id
,
string
latAndLong
,
string
wifiMac
,
string
oldWifiMac
,
string
phoneId
,
string
address
,
string
PhoneName
,
out
int
PunchCardType
,
bool
isNotVerifyVifi
=
false
)
{
PunchCardType
=
1
;
string
date
=
DateTime
.
Now
.
ToShortDateString
();
//打卡记录信息
RB_Attendance_Record_Extend
recode
=
attendRecordRespository
.
GetAttendRecod
(
empId
,
date
);
//根据手机标识码获取打卡记录信息
RB_Attendance_Record_Extend
phoneIdRecode
=
attendRecordRespository
.
GetAttendRecodByPhoneId
(
phoneId
,
date
);
string
onTime
=
""
;
string
offTime
=
""
;
//先查询特殊日期打卡时间
#
region
获取打卡时间
//RB_Technicaldates_Extend technical = TDrespository.GetSpecialDate(empId, RB_Department_Id, date);
var
technicalList
=
TDrespository
.
GetSpecialDateList
(
empId
,
date
);
// ld 2020-01-25 调整
RB_Technicaldates_Extend
technical
=
null
;
if
(
technicalList
.
Any
())
{
if
(
technicalList
.
Where
(
x
=>
x
.
EmployeeId
>
0
).
Any
()
&&
technicalList
.
Where
(
x
=>
x
.
EmployeeId
==
empId
).
Any
())
{
technical
=
technicalList
.
Where
(
x
=>
x
.
EmployeeId
==
empId
).
FirstOrDefault
();
}
else
if
(
technicalList
.
Where
(
x
=>
x
.
RB_Department_Id
>
0
).
Any
()
&&
technicalList
.
Where
(
x
=>
x
.
RB_Department_Id
==
RB_Department_Id
).
Any
())
{
technical
=
technicalList
.
Where
(
x
=>
x
.
RB_Department_Id
==
RB_Department_Id
).
FirstOrDefault
();
}
else
{
if
(
technicalList
.
Where
(
x
=>
x
.
RB_Department_Id
==
0
&&
x
.
EmployeeId
==
0
).
Any
())
{
technical
=
technicalList
.
Where
(
x
=>
x
.
RB_Department_Id
==
0
&&
x
.
EmployeeId
==
0
).
FirstOrDefault
();
}
}
}
if
(
technical
!=
null
)
{
if
(
technical
.
Type
==
(
int
)
TechnicalTypeEnum
.
PunchCard
)
{
onTime
=
technical
.
BeOnDutyTime
;
offTime
=
technical
.
OffDutyTime
;
}
else
{
//特殊日期不打卡
return
"ok"
;
}
}
else
{
//正常打卡日期
RB_WorkdaySeting_Extend
workDay
=
WDrespository
.
GetWorkDay
(
empId
,
StringHelper
.
GetWeek
(
Convert
.
ToDateTime
(
date
)));
if
(
workDay
!=
null
)
{
onTime
=
workDay
.
BeOnDutyTime
;
offTime
=
workDay
.
OffDutyTime
;
}
else
{
return
"今天休息,无需打卡"
;
}
}
#
endregion
#
region
验证打卡方式
//type合法类型 1 地点 2 wifi
//是否在范围
int
type
=
2
;
string
verifyAddress
=
""
;
bool
isRange
=
isNotVerifyVifi
?
isNotVerifyVifi
:
IsRange
(
empId
,
latAndLong
,
wifiMac
,
oldWifiMac
,
out
type
,
out
verifyAddress
);
if
(!
isRange
&&
string
.
IsNullOrWhiteSpace
(
latAndLong
))
{
type
=
2
;
}
#
endregion
#
region
打卡
if
(
recode
==
null
)
//上班打卡
{
if
(
phoneIdRecode
!=
null
&&
phoneIdRecode
.
EmployeeId
!=
empId
)
{
return
"一台手机一天不能为多个账号打卡"
;
}
else
{
RB_Attendance_Record
dbRecord
=
new
RB_Attendance_Record
{
EmployeeId
=
empId
,
BeOnAddress
=
address
,
BeOnDutyTime
=
DateTime
.
Now
,
BeOnType
=
type
,
BeOnVerifyAddress
=
verifyAddress
};
if
(
dbRecord
.
BeOnType
==
1
)
{
dbRecord
.
BeOnTargetAddress
=
latAndLong
;
}
else
{
dbRecord
.
BeOnTargetAddress
=
wifiMac
;
}
dbRecord
.
PhoneId
=
phoneId
;
dbRecord
.
PhoneName
=
PhoneName
;
dbRecord
.
Date
=
DateTime
.
Now
;
dbRecord
.
BeOnTime
=
onTime
;
//string punchCardTime = dbRecord.BeOnDutyTime.ToShortTimeString();
DateTime
punchCardDateTime
=
DateTime
.
Now
;
//打卡时间
DateTime
onDateTime
=
Convert
.
ToDateTime
(
onTime
);
//上班时间
if
(
isRange
)
{
if
(
punchCardDateTime
.
AddMinutes
(-
1
)
<=
onDateTime
)
{
dbRecord
.
BeOnStatus
=
AttendanceEnum
.
ZC
;
}
else
{
dbRecord
.
BeOnStatus
=
AttendanceEnum
.
CD
;
TimeSpan
timeSpan
=
punchCardDateTime
-
onDateTime
;
dbRecord
.
BeLateTime
=
(
int
)
timeSpan
.
TotalMinutes
;
//迟到分钟数
}
}
else
{
return
"不在打卡范围"
;
}
attendRecordRespository
.
Insert
(
dbRecord
);
return
"ok"
;
}
}
else
{
if
(
phoneIdRecode
!=
null
&&
phoneIdRecode
.
Id
!=
recode
.
Id
)
{
return
"一台手机一天不能为多个账号打卡"
;
}
else
{
RB_Attendance_Record
dbRecord
=
recode
.
RefMapperTo
<
RB_Attendance_Record
>();
dbRecord
.
OffAddress
=
address
;
if
(
dbRecord
.
BeOnType
==
1
)
{
dbRecord
.
OffTargetAddress
=
latAndLong
;
}
else
{
dbRecord
.
OffTargetAddress
=
wifiMac
;
}
dbRecord
.
OffDutyTime
=
DateTime
.
Now
;
dbRecord
.
OffType
=
type
;
dbRecord
.
PhoneId
=
phoneId
;
dbRecord
.
PhoneName
=
PhoneName
;
dbRecord
.
OffVerifyAddress
=
verifyAddress
;
dbRecord
.
OffTime
=
offTime
;
//string punchCardTime = dbRecord.BeOnDutyTime.ToShortTimeString();
DateTime
punchCardDateTime
=
DateTime
.
Now
;
//打卡时间
DateTime
offDateTime
=
Convert
.
ToDateTime
(
offTime
);
//下班时间
if
(
isRange
)
{
if
(
punchCardDateTime
>=
offDateTime
)
{
dbRecord
.
OffStatus
=
AttendanceEnum
.
ZC
;
PunchCardType
=
2
;
}
else
{
return
"没到下班时间,打卡失败"
;
}
}
else
{
return
"不在打卡范围"
;
}
attendRecordRespository
.
Update
(
dbRecord
);
return
"ok"
;
}
}
#
endregion
}
/// <summary>
/// 验证打卡范围
/// </summary>
/// <param name="empId"></param>
/// <param name="latAndLong"></param>
/// <param name="wifiMac"></param>
/// <param name="oldWifiMac"></param>
/// <param name="type">合法类型 1 地点 2 wifi</param>
/// <param name="verifyAddress">合法类型 名称</param>
/// <returns></returns>
private
bool
IsRange
(
int
empId
,
string
latAndLong
,
string
wifiMac
,
string
oldWifiMac
,
out
int
type
,
out
string
verifyAddress
)
{
type
=
1
;
verifyAddress
=
""
;
List
<
RB_Attendance_Way_Extend
>
wayList
=
AWrespository
.
GetWayByEmployeeId
(
empId
);
if
(
wayList
!=
null
&&
wayList
.
Count
()
>
0
)
{
if
(!
string
.
IsNullOrWhiteSpace
(
wifiMac
))
{
List
<
RB_Attendance_Way_Extend
>
wifiWay
=
wayList
.
Where
(
t
=>
t
.
Type
==
(
int
)
AttendWayTypeEnum
.
Wifi
&&
(
t
.
TargetAddress
.
ToLower
()
==
wifiMac
||
t
.
TargetAddress
.
ToLower
()
==
oldWifiMac
)).
ToList
();
if
(
wifiWay
!=
null
&&
wifiWay
.
Count
()
>
0
)
{
verifyAddress
=
wifiWay
.
FirstOrDefault
().
Name
;
type
=
2
;
return
true
;
}
}
if
(!
string
.
IsNullOrWhiteSpace
(
latAndLong
))
{
List
<
RB_Attendance_Way_Extend
>
addressList
=
wayList
.
Where
(
t
=>
t
.
Type
==
(
int
)
AttendWayTypeEnum
.
Address
).
ToList
();
if
(
addressList
!=
null
&&
addressList
.
Count
()
>
0
)
{
foreach
(
var
item
in
addressList
)
{
double
distance
=
MapHelper
.
GetPointDistance
(
item
.
TargetAddress
,
latAndLong
);
if
(
distance
<=
item
.
Scope
)
{
verifyAddress
=
item
.
Name
;
type
=
1
;
return
true
;
}
}
}
}
return
false
;
}
else
{
return
false
;
}
}
/// <summary>
/// 获取打卡信息统计
/// </summary>
/// <param name="empId">员工id</param>
/// <param name="date">获取日期(年-月-日)</param>
/// <returns></returns>
public
List
<
JObject
>
PunchCardStatistical
(
int
empId
,
string
date
)
{
//打卡记录信息
List
<
RB_Attendance_Record_Extend
>
recodeList
=
attendRecordRespository
.
PunchCardStatistical
(
empId
,
date
);
List
<
JObject
>
result
=
new
List
<
JObject
>();
#
region
出勤天数
{
JObject
attendance
=
new
JObject
{
[
"name"
]
=
$"出勤天数"
,
[
"day"
]
=
$"
{
recodeList
.
Count
}
天"
};
if
(
recodeList
.
Count
>
0
)
{
attendance
[
"color"
]
=
"black"
;
}
else
{
attendance
[
"color"
]
=
"gray"
;
}
List
<
string
>
dataList
=
new
List
<
string
>();
foreach
(
var
item
in
recodeList
)
{
dataList
.
Add
(
$"
{
item
.
Date
.
ToShortDateString
().
Replace
(
"/"
,
"-"
)}
(
{
StringHelper
.
GetWeekChar
(
item
.
Date
)}
)"
);
}
attendance
[
"dataList"
]
=
JsonConvert
.
SerializeObject
(
dataList
);
result
.
Add
(
attendance
);
}
#
endregion
#
region
休息天数
{
JObject
rest
=
new
JObject
{
[
"name"
]
=
$"休息天数"
};
DateTime
searchDate
=
Convert
.
ToDateTime
(
date
);
List
<
string
>
dataList
=
new
List
<
string
>();
if
(
DateTime
.
Now
.
ToString
(
"yyyy-MM"
)
==
searchDate
.
ToString
(
"yyyy-MM"
))
//本月
{
TimeSpan
timeSpan
=
DateTime
.
Now
-
new
DateTime
(
DateTime
.
Now
.
Year
,
DateTime
.
Now
.
Month
,
1
);
int
days
=
timeSpan
.
Days
+
1
;
rest
[
"day"
]
=
$"
{
days
-
recodeList
.
Count
()}
天"
;
rest
[
"color"
]
=
"gray"
;
for
(
int
i
=
1
;
i
<=
days
;
i
++)
{
DateTime
dt
=
new
DateTime
(
searchDate
.
Year
,
searchDate
.
Month
,
i
);
if
(
recodeList
.
Where
(
t
=>
t
.
Date
.
ToShortDateString
()
==
dt
.
ToShortDateString
()).
Count
()
==
0
)
{
dataList
.
Add
(
$"
{
dt
.
Date
.
ToShortDateString
().
Replace
(
"/"
,
"-"
)}
(
{
StringHelper
.
GetWeekChar
(
dt
.
Date
)}
)"
);
}
}
//foreach (var item in recodeList)
//{
// dataList.Add($"{item.Date.ToShortDateString().Replace("/", "-")}({StringHelper.GetWeekChar(item.Date)})");
//}
}
else
{
int
days
=
DateTime
.
DaysInMonth
(
searchDate
.
Year
,
searchDate
.
Month
);
rest
[
"day"
]
=
$"
{
days
-
recodeList
.
Count
}
天"
;
rest
[
"color"
]
=
"black"
;
for
(
int
i
=
1
;
i
<=
days
;
i
++)
{
DateTime
dt
=
new
DateTime
(
searchDate
.
Year
,
searchDate
.
Month
,
i
);
if
(
recodeList
.
Where
(
t
=>
t
.
Date
.
ToShortDateString
()
==
dt
.
ToShortDateString
()).
Count
()
==
0
)
{
dataList
.
Add
(
$"
{
dt
.
Date
.
ToShortDateString
().
Replace
(
"/"
,
"-"
)}
(
{
StringHelper
.
GetWeekChar
(
dt
.
Date
)}
)"
);
}
}
}
rest
[
"dataList"
]
=
JsonConvert
.
SerializeObject
(
dataList
);
result
.
Add
(
rest
);
}
#
endregion
#
region
迟到
{
JObject
late
=
new
JObject
{
[
"name"
]
=
$"迟到"
};
List
<
RB_Attendance_Record_Extend
>
lateRecodeList
=
recodeList
.
Where
(
t
=>
t
.
BeOnStatus
==
AttendanceEnum
.
CD
).
ToList
();
late
[
"day"
]
=
$"
{
lateRecodeList
.
Count
}
天"
;
if
(
recodeList
.
Count
>
0
)
{
late
[
"color"
]
=
"black"
;
}
else
{
late
[
"color"
]
=
"gray"
;
}
List
<
string
>
dataList
=
new
List
<
string
>();
foreach
(
var
item
in
lateRecodeList
)
{
dataList
.
Add
(
$"
{
item
.
Date
.
ToShortDateString
().
Replace
(
"/"
,
"-"
)}
(
{
StringHelper
.
GetWeekChar
(
item
.
Date
)}
)"
);
}
late
[
"dataList"
]
=
JsonConvert
.
SerializeObject
(
dataList
);
result
.
Add
(
late
);
}
#
endregion
#
region
缺卡
{
JObject
lackOfCard
=
new
JObject
{
[
"name"
]
=
$"缺卡"
};
List
<
RB_Attendance_Record_Extend
>
lackOfCardRecodeList
=
recodeList
.
Where
(
t
=>
t
.
BeOnStatus
!=
AttendanceEnum
.
QK
&&
t
.
OffStatus
==
AttendanceEnum
.
QK
).
ToList
();
lackOfCard
[
"day"
]
=
$"
{
lackOfCardRecodeList
.
Count
}
天"
;
if
(
lackOfCardRecodeList
.
Count
>
0
)
{
lackOfCard
[
"color"
]
=
"black"
;
}
else
{
lackOfCard
[
"color"
]
=
"gray"
;
}
List
<
string
>
dataList
=
new
List
<
string
>();
foreach
(
var
item
in
lackOfCardRecodeList
)
{
dataList
.
Add
(
$"
{
item
.
Date
.
ToShortDateString
().
Replace
(
"/"
,
"-"
)}
(
{
StringHelper
.
GetWeekChar
(
item
.
Date
)}
)"
);
}
lackOfCard
[
"dataList"
]
=
JsonConvert
.
SerializeObject
(
dataList
);
result
.
Add
(
lackOfCard
);
}
#
endregion
#
region
旷工
{
JObject
absenteeism
=
new
JObject
{
[
"name"
]
=
$"旷工"
};
List
<
RB_Attendance_Record_Extend
>
absenteeismRecodeList
=
recodeList
.
Where
(
t
=>
t
.
BeOnStatus
==
AttendanceEnum
.
QK
&&
t
.
OffStatus
==
AttendanceEnum
.
QK
).
ToList
();
absenteeism
[
"day"
]
=
$"
{
absenteeismRecodeList
.
Count
}
天"
;
if
(
absenteeismRecodeList
.
Count
>
0
)
{
absenteeism
[
"color"
]
=
"red"
;
}
else
{
absenteeism
[
"color"
]
=
"gray"
;
}
List
<
string
>
dataList
=
new
List
<
string
>();
foreach
(
var
item
in
absenteeismRecodeList
)
{
dataList
.
Add
(
$"
{
item
.
Date
.
ToShortDateString
().
Replace
(
"/"
,
"-"
)}
(
{
StringHelper
.
GetWeekChar
(
item
.
Date
)}
)"
);
}
absenteeism
[
"dataList"
]
=
JsonConvert
.
SerializeObject
(
dataList
);
result
.
Add
(
absenteeism
);
}
#
endregion
#
region
外勤
{
JObject
field
=
new
JObject
{
[
"name"
]
=
$"外勤"
};
List
<
RB_Attendance_Record_Extend
>
fieldRecodeList
=
recodeList
.
Where
(
t
=>
t
.
BeOnStatus
==
AttendanceEnum
.
WQ
||
t
.
OffStatus
==
AttendanceEnum
.
WQ
).
ToList
();
field
[
"day"
]
=
$"
{
fieldRecodeList
.
Count
}
天"
;
if
(
fieldRecodeList
.
Count
>
0
)
{
field
[
"color"
]
=
"black"
;
}
else
{
field
[
"color"
]
=
"gray"
;
}
List
<
string
>
dataList
=
new
List
<
string
>();
foreach
(
var
item
in
fieldRecodeList
)
{
dataList
.
Add
(
$"
{
item
.
Date
.
ToShortDateString
().
Replace
(
"/"
,
"-"
)}
(
{
StringHelper
.
GetWeekChar
(
item
.
Date
)}
)"
);
}
field
[
"dataList"
]
=
JsonConvert
.
SerializeObject
(
dataList
);
result
.
Add
(
field
);
}
#
endregion
return
result
;
}
/// <summary>
/// 获取打卡月历
/// </summary>
/// <param name="empId">员工id</param>
/// <param name="date">获取日期(年-月-日)</param>
/// <returns></returns>
public
List
<
JObject
>
PunchCardCalendar
(
int
empId
,
string
date
)
{
//打卡记录信息
List
<
RB_Attendance_Record_Extend
>
recodeList
=
attendRecordRespository
.
PunchCardStatistical
(
empId
,
date
);
List
<
JObject
>
result
=
new
List
<
JObject
>();
DateTime
searchDate
=
Convert
.
ToDateTime
(
date
);
List
<
string
>
dataList
=
new
List
<
string
>();
int
days
=
DateTime
.
DaysInMonth
(
searchDate
.
Year
,
searchDate
.
Month
);
for
(
int
i
=
1
;
i
<=
days
;
i
++)
{
DateTime
dt
=
new
DateTime
(
searchDate
.
Year
,
searchDate
.
Month
,
i
);
if
(
dt
.
Date
<
DateTime
.
Now
.
Date
)
{
JObject
data
=
new
JObject
{
[
"day"
]
=
i
};
RB_Attendance_Record_Extend
recode
=
recodeList
.
Where
(
t
=>
t
.
Date
.
ToShortDateString
()
==
dt
.
ToShortDateString
()).
FirstOrDefault
();
if
(
recode
!=
null
)
{
data
[
"id"
]
=
recode
.
Id
;
data
[
"rest"
]
=
false
;
if
(
recode
.
BeOnStatus
==
AttendanceEnum
.
ZC
&&
recode
.
OffStatus
==
AttendanceEnum
.
ZC
)
{
data
[
"stateColor"
]
=
"#09D49D"
;
//正常
}
else
if
(
recode
.
BeOnStatus
==
AttendanceEnum
.
CD
)
{
data
[
"stateColor"
]
=
"#FF7D4C"
;
//迟到
}
else
if
(
recode
.
BeOnStatus
==
AttendanceEnum
.
QK
||
recode
.
OffStatus
==
AttendanceEnum
.
QK
)
{
data
[
"stateColor"
]
=
"#FF6868"
;
//缺卡
}
else
if
(
recode
.
BeOnStatus
==
AttendanceEnum
.
WQ
||
recode
.
OffStatus
==
AttendanceEnum
.
WQ
)
{
data
[
"stateColor"
]
=
"#548DFF"
;
//外勤
}
else
if
(
recode
.
BeOnStatus
==
AttendanceEnum
.
QJ
||
recode
.
OffStatus
==
AttendanceEnum
.
QJ
)
{
data
[
"stateColor"
]
=
"#FF7D4C"
;
//请假
}
else
if
(
recode
.
BeOnStatus
==
AttendanceEnum
.
BK
||
recode
.
OffStatus
==
AttendanceEnum
.
BK
)
{
data
[
"stateColor"
]
=
"#37CCE7"
;
//补卡
}
else
{
data
[
"stateColor"
]
=
"#FF6868"
;
//异常
}
}
else
{
data
[
"rest"
]
=
true
;
data
[
"stateColor"
]
=
"#CCCCCC"
;
}
result
.
Add
(
data
);
}
else
{
break
;
}
}
return
result
;
}
}
}
Edu.WebApi/Controllers/User/UserCenterController.cs
View file @
b5040071
...
...
@@ -29,17 +29,21 @@ namespace Edu.WebApi.Controllers.User
/// <summary>
/// 助教处理类对象
/// </summary>
private
readonly
NoticeModule
noticeModule
=
AOPHelper
.
CreateAOPObject
<
NoticeModule
>();
private
readonly
NoticeModule
noticeModule
=
new
NoticeModule
();
/// <summary>
/// 考勤处理类
/// </summary>
private
readonly
AttendanceModule
attendancemodule
=
new
AttendanceModule
();
/// <summary>
/// 审核处理
/// </summary>
private
readonly
WorkFlowModule
workFlowModule
=
new
WorkFlowModule
();
/// <summary>
/// 考勤记录处理类
/// </summary>
public
AttendanceRecodModule
attendRecodeModule
=
new
AttendanceRecodModule
();
#
region
公告管理
...
...
@@ -1799,5 +1803,181 @@ namespace Edu.WebApi.Controllers.User
}
#
endregion
#
region
APP
考勤
/// <summary>
/// App获取今天打卡信息
/// </summary>
/// <returns></returns>
public
ApiResult
GetAttendRecod
()
{
JObject
parm
=
JObject
.
Parse
(
RequestParm
.
Msg
.
ToString
());
UserInfo
userInfo
=
UserReidsCache
.
GetUserLoginInfo
(
RequestParm
.
Uid
);
string
date
=
JsonHelper
.
GetStringValue
(
parm
,
"date"
);
if
(
string
.
IsNullOrWhiteSpace
(
date
))
{
return
ApiResult
.
ParamIsNull
(
"日期时间为空"
);
}
JObject
result
=
new
JObject
();
JObject
recodeInfo
=
attendRecodeModule
.
GetAttendRecod
(
userInfo
.
Id
,
userInfo
.
DeptId
,
date
);
if
(
recodeInfo
==
null
)
{
result
[
"isNeedCard"
]
=
false
;
result
[
"recodeInfo"
]
=
recodeInfo
;
}
else
{
result
[
"isNeedCard"
]
=
true
;
result
[
"recodeInfo"
]
=
recodeInfo
;
}
return
ApiResult
.
Success
(
"获取成功"
,
data
:
result
);
}
/// <summary>
/// App验证是否在打卡范围
/// </summary>
/// <returns></returns>
public
ApiResult
VerifyPunchCard
()
{
JObject
parm
=
JObject
.
Parse
(
RequestParm
.
Msg
.
ToString
());
string
latAndLong
=
JsonHelper
.
GetStringValue
(
parm
,
"latAndLong"
);
string
wifiMac
=
JsonHelper
.
GetStringValue
(
parm
,
"wifiMac"
);
string
oldWifiMac
=
JsonHelper
.
GetStringValue
(
parm
,
"wifiMac"
);
string
version
=
JsonHelper
.
GetStringValue
(
parm
,
"version"
);
if
(
string
.
IsNullOrWhiteSpace
(
latAndLong
)
&&
string
.
IsNullOrWhiteSpace
(
wifiMac
))
{
return
ApiResult
.
ParamIsNull
(
"参数为空"
);
}
int
empId
=
Convert
.
ToInt32
(
RequestParm
.
Uid
);
List
<
RB_Attendance_Way_Extend
>
wayList
=
new
List
<
RB_Attendance_Way_Extend
>();
wifiMac
=
GetMdifyWifiMac
(
wifiMac
);
bool
isNotVerifyVifi
=
JudgeNotVerifyVifi
(
version
,
empId
);
bool
isRang
=
isNotVerifyVifi
?
isNotVerifyVifi
:
attendRecodeModule
.
VerifyPunchCard
(
empId
,
latAndLong
,
wifiMac
,
oldWifiMac
,
out
wayList
);
var
attendWay
=
wayList
.
Select
(
t
=>
new
{
type
=
t
.
Type
,
name
=
t
.
Name
,
address
=
t
.
Address
,
targetAddress
=
t
.
TargetAddress
,
scope
=
t
.
Scope
});
var
result
=
new
{
isLegal
=
isRang
,
attendWay
};
return
ApiResult
.
Success
(
"获取成功"
,
data
:
result
);
}
/// <summary>
/// App考勤打卡
/// </summary>
/// <returns></returns>
public
ApiResult
PunchCard
()
{
JObject
parm
=
JObject
.
Parse
(
RequestParm
.
Msg
.
ToString
());
string
latAndLong
=
JsonHelper
.
GetStringValue
(
parm
,
"latAndLong"
);
string
address
=
JsonHelper
.
GetStringValue
(
parm
,
"address"
);
string
wifiMac
=
JsonHelper
.
GetStringValue
(
parm
,
"wifiMac"
);
string
oldWifiMac
=
wifiMac
;
string
phoneId
=
JsonHelper
.
GetStringValue
(
parm
,
"phoneId"
);
string
PhoneName
=
JsonHelper
.
GetStringValue
(
parm
,
"PhoneName"
);
string
version
=
JsonHelper
.
GetStringValue
(
parm
,
"version"
);
if
(
string
.
IsNullOrWhiteSpace
(
latAndLong
)
&&
string
.
IsNullOrWhiteSpace
(
wifiMac
))
{
return
ApiResult
.
ParamIsNull
(
"参数为空"
);
}
if
(
string
.
IsNullOrWhiteSpace
(
phoneId
))
{
return
ApiResult
.
ParamIsNull
(
"手机标识码为空"
);
}
UserInfo
userInfo
=
UserReidsCache
.
GetUserLoginInfo
(
RequestParm
.
Uid
);
string
date
=
JsonHelper
.
GetStringValue
(
parm
,
"date"
);
wifiMac
=
GetMdifyWifiMac
(
wifiMac
);
LogHelper
.
WriteInfo
(
$"打卡信息:
{
JsonConvert
.
SerializeObject
(
RequestParm
)}
-->更新后的mac:
{
wifiMac
}
"
);
int
PunchCardType
;
bool
isNotVerifyVifi
=
JudgeNotVerifyVifi
(
version
,
userInfo
.
Id
);
string
result
=
attendRecodeModule
.
PunchCard
(
userInfo
.
Id
,
userInfo
.
DeptId
,
latAndLong
,
wifiMac
,
oldWifiMac
,
phoneId
,
address
,
PhoneName
,
out
PunchCardType
,
isNotVerifyVifi
);
var
resultData
=
new
{
punchCardType
=
PunchCardType
};
if
(
result
.
Equals
(
"ok"
))
{
return
ApiResult
.
Success
(
"打卡成功"
,
data
:
resultData
);
}
else
if
(
result
.
Equals
(
"不在打卡范围"
))
{
return
new
ApiResult
()
{
Code
=
(
int
)
ResultCode
.
NotInCardRange
,
Message
=
result
};
}
else
{
return
ApiResult
.
Failed
(
message
:
result
);
}
}
/// <summary>
/// 不打卡wifi版本
/// </summary>
/// <param name="version"></param>
/// <param name="EmpId"></param>
/// <returns></returns>
private
bool
JudgeNotVerifyVifi
(
string
version
,
int
EmpId
)
{
bool
isNotVerifyVifi
=
false
;
if
(!
string
.
IsNullOrWhiteSpace
(
version
))
{
string
[]
versionInfo
=
version
.
Split
(
'&'
);
if
(
versionInfo
.
Length
==
3
&&
versionInfo
[
1
].
ToLower
().
Equals
(
"ios"
)
&&
versionInfo
[
2
].
Equals
(
"1.1.8"
))
{
isNotVerifyVifi
=
true
;
}
}
return
isNotVerifyVifi
;
}
/// <summary>
/// 获取修改后wifimac
/// </summary>
/// <param name="wifiMac">原始</param>
/// <returns></returns>
private
string
GetMdifyWifiMac
(
string
wifiMac
)
{
if
(!
string
.
IsNullOrWhiteSpace
(
wifiMac
))
{
string
[]
mac
=
wifiMac
.
Split
(
':'
);
for
(
int
i
=
0
;
i
<
mac
.
Length
;
i
++)
{
if
(
mac
[
i
].
Length
==
1
)
{
mac
[
i
]
=
$"0
{
mac
[
i
]}
"
;
}
}
wifiMac
=
string
.
Join
(
":"
,
mac
).
ToLower
();
}
return
wifiMac
;
}
/// <summary>
/// App考勤打卡统计
/// </summary>
/// <returns></returns>
public
ApiResult
PunchCardStatistical
()
{
JObject
parm
=
JObject
.
Parse
(
RequestParm
.
Msg
.
ToString
());
string
date
=
JsonHelper
.
GetStringValue
(
parm
,
"date"
);
if
(
string
.
IsNullOrWhiteSpace
(
date
))
{
return
ApiResult
.
ParamIsNull
(
"日期为空"
);
}
int
empId
=
Convert
.
ToInt32
(
RequestParm
.
Uid
);
List
<
JObject
>
result
=
attendRecodeModule
.
PunchCardStatistical
(
empId
,
date
);
return
ApiResult
.
Success
(
"获取成功"
,
data
:
result
);
}
/// <summary>
/// App考勤打卡月历
/// </summary>
/// <returns></returns>
public
ApiResult
PunchCardCalendar
()
{
JObject
parm
=
JObject
.
Parse
(
RequestParm
.
Msg
.
ToString
());
string
date
=
JsonHelper
.
GetStringValue
(
parm
,
"date"
);
if
(
string
.
IsNullOrWhiteSpace
(
date
))
{
return
ApiResult
.
ParamIsNull
(
"日期为空"
);
}
int
empId
=
Convert
.
ToInt32
(
RequestParm
.
Uid
);
List
<
JObject
>
result
=
attendRecodeModule
.
PunchCardCalendar
(
empId
,
date
);
return
ApiResult
.
Success
(
"获取成功"
,
data
:
result
);
}
#
endregion
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment