增加考勤对接需要人员接口和考勤记录接口
This commit is contained in:
@@ -299,7 +299,7 @@ namespace BLL
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="filter">查询过滤条件</param>
|
/// <param name="filter">查询过滤条件</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static List<Model.PersonItem> getPersonByFilter(Model.ProjectPersonInput filter)
|
public static List<Model.ProjectPersonOutput> getPersonByFilter(Model.ProjectPersonInput filter)
|
||||||
{
|
{
|
||||||
using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
|
using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
|
||||||
{
|
{
|
||||||
@@ -315,6 +315,12 @@ namespace BLL
|
|||||||
query = query.Where(x => x.ProjectId == filter.ProjectId);
|
query = query.Where(x => x.ProjectId == filter.ProjectId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 项目名称过滤(模糊查询)
|
||||||
|
if (!string.IsNullOrEmpty(filter.ProjectName))
|
||||||
|
{
|
||||||
|
query = query.Where(x => x.ProjectName.Contains(filter.ProjectName));
|
||||||
|
}
|
||||||
|
|
||||||
// 人员ID过滤
|
// 人员ID过滤
|
||||||
if (!string.IsNullOrEmpty(filter.PersonId))
|
if (!string.IsNullOrEmpty(filter.PersonId))
|
||||||
{
|
{
|
||||||
@@ -362,43 +368,25 @@ namespace BLL
|
|||||||
{
|
{
|
||||||
query = query.Where(x => x.WorkPostName.Contains(filter.WorkPostName));
|
query = query.Where(x => x.WorkPostName.Contains(filter.WorkPostName));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 性别过滤
|
|
||||||
if (!string.IsNullOrEmpty(filter.Sex))
|
|
||||||
{
|
|
||||||
query = query.Where(x => x.Sex == filter.Sex);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 电话号码过滤(模糊查询)
|
|
||||||
if (!string.IsNullOrEmpty(filter.Telephone))
|
|
||||||
{
|
|
||||||
query = query.Where(x => x.Telephone.Contains(filter.Telephone));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 默认只返回在岗人员
|
// 默认只返回在岗人员
|
||||||
query = query.Where(x => x.States == Const.ProjectPersonStates_1);
|
query = query.Where(x => x.States == Const.ProjectPersonStates_1);
|
||||||
|
|
||||||
var persons = from x in query orderby x.CardNo descending
|
var persons = from x in query orderby x.CardNo descending
|
||||||
select new Model.PersonItem
|
select new Model.ProjectPersonOutput
|
||||||
{
|
{
|
||||||
PersonId = x.PersonId,
|
PersonId = x.PersonId,
|
||||||
SitePersonId = x.SitePersonId,
|
SitePersonId = x.SitePersonId,
|
||||||
CardNo = x.CardNo,
|
CardNo = x.CardNo,
|
||||||
PersonName = x.PersonName,
|
PersonName = x.PersonName,
|
||||||
SexName = x.SexName,
|
SexName = x.SexName,
|
||||||
Sex = x.Sex,
|
|
||||||
IdentityCard = x.IdentityCard,
|
IdentityCard = x.IdentityCard,
|
||||||
Address = x.Address,
|
|
||||||
ProjectId = x.ProjectId,
|
ProjectId = x.ProjectId,
|
||||||
ProjectCode = x.ProjectCode,
|
|
||||||
ProjectName = x.ProjectName,
|
ProjectName = x.ProjectName,
|
||||||
UnitId = x.UnitId,
|
UnitId = x.UnitId,
|
||||||
UnitCode = x.UnitCode,
|
|
||||||
UnitName = x.UnitName,
|
UnitName = x.UnitName,
|
||||||
TeamGroupId = x.TeamGroupId,
|
|
||||||
TeamGroupName = x.TeamGroupName,
|
TeamGroupName = x.TeamGroupName,
|
||||||
WorkPostId = x.WorkPostId,
|
|
||||||
WorkPostName = x.WorkPostName,
|
WorkPostName = x.WorkPostName,
|
||||||
InTime = string.Format("{0:yyyy-MM-dd}", x.InTime),
|
InTime = string.Format("{0:yyyy-MM-dd}", x.InTime),
|
||||||
OutTime = string.Format("{0:yyyy-MM-dd}", x.OutTime),
|
OutTime = string.Format("{0:yyyy-MM-dd}", x.OutTime),
|
||||||
@@ -406,10 +394,8 @@ namespace BLL
|
|||||||
Telephone = x.Telephone,
|
Telephone = x.Telephone,
|
||||||
PhotoUrl = x.PhotoUrl,
|
PhotoUrl = x.PhotoUrl,
|
||||||
DepartName = x.DepartName,
|
DepartName = x.DepartName,
|
||||||
WorkAreaId = x.WorkAreaId,
|
|
||||||
WorkAreaName = x.WorkAreaName,
|
WorkAreaName = x.WorkAreaName,
|
||||||
PostType = x.PostType,
|
PostType = x.PostType,
|
||||||
IsForeign = x.IsForeign.HasValue ? x.IsForeign : false,
|
|
||||||
PersonType = x.PersonType,
|
PersonType = x.PersonType,
|
||||||
PersonTypeName = x.PersonType == "2" ? "外聘" : (x.PersonType == "3" ? "第三方" : "员工"),
|
PersonTypeName = x.PersonType == "2" ? "外聘" : (x.PersonType == "3" ? "第三方" : "员工"),
|
||||||
PostTypeName = db.Sys_Const.FirstOrDefault(z => z.GroupId == ConstValue.Group_PostType && z.ConstValue == x.PostType).ConstText,
|
PostTypeName = db.Sys_Const.FirstOrDefault(z => z.GroupId == ConstValue.Group_PostType && z.ConstValue == x.PostType).ConstText,
|
||||||
@@ -1113,6 +1099,55 @@ namespace BLL
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region 根据条件获取人员出入场记录(支持多条件过滤)
|
||||||
|
/// <summary>
|
||||||
|
/// 根据条件获取人员出入场记录(支持多条件过滤)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filter">查询过滤条件</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<Model.PersonInOutItem> getPersonInOutListByFilter(Model.PersonInOutRecordInput filter)
|
||||||
|
{
|
||||||
|
using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
|
||||||
|
{
|
||||||
|
var query = from x in db.SitePerson_PersonInOut
|
||||||
|
join y in db.SitePerson_Person on x.PersonId equals y.PersonId
|
||||||
|
where x.ChangeTime >= filter.StartTime && x.ChangeTime <= filter.EndTime
|
||||||
|
select new Model.PersonInOutItem
|
||||||
|
{
|
||||||
|
PersonId = x.PersonId,
|
||||||
|
PersonName = y.PersonName,
|
||||||
|
ProjectId = x.ProjectId,
|
||||||
|
UnitId = y.UnitId,
|
||||||
|
UnitName = db.Base_Unit.First(z => z.UnitId == y.UnitId).UnitName,
|
||||||
|
WorkPostId = y.WorkPostId,
|
||||||
|
WorkPostName = db.Base_WorkPost.First(z => z.WorkPostId == y.WorkPostId).WorkPostName,
|
||||||
|
IsIn = x.IsIn,
|
||||||
|
IsInName = x.IsIn == true ? "进场" : "出场",
|
||||||
|
ChangeTime = string.Format("{0:yyyy-MM-dd HH:mm}", x.ChangeTime),
|
||||||
|
ChangeTimeD = x.ChangeTime,
|
||||||
|
};
|
||||||
|
|
||||||
|
// 添加过滤条件
|
||||||
|
if (filter != null)
|
||||||
|
{
|
||||||
|
// 单位名称过滤(模糊查询)
|
||||||
|
if (!string.IsNullOrEmpty(filter.UnitName))
|
||||||
|
{
|
||||||
|
query = query.Where(x => x.UnitName.Contains(filter.UnitName));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 人员姓名过滤(模糊查询)
|
||||||
|
if (!string.IsNullOrEmpty(filter.PersonName))
|
||||||
|
{
|
||||||
|
query = query.Where(x => x.PersonName.Contains(filter.PersonName));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return query.OrderByDescending(x => x.ChangeTimeD).ToList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region 根据identityCard获取人员资质信息
|
#region 根据identityCard获取人员资质信息
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 根据identityCard获取人员资质信息
|
/// 根据identityCard获取人员资质信息
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Model
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 人员出入记录入参
|
||||||
|
/// </summary>
|
||||||
|
public class PersonInOutRecordInput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 单位名称
|
||||||
|
/// </summary>
|
||||||
|
public string UnitName { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 人员姓名
|
||||||
|
/// </summary>
|
||||||
|
public string PersonName { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 开始时间
|
||||||
|
/// </summary>
|
||||||
|
public DateTime StartTime { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 结束时间
|
||||||
|
/// </summary>
|
||||||
|
public DateTime EndTime { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -26,14 +26,6 @@ namespace Model
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string PersonName { get; set; }
|
public string PersonName { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 性别
|
|
||||||
/// </summary>
|
|
||||||
public string SexName { get; set; }
|
|
||||||
/// <summary>
|
|
||||||
/// 性别
|
|
||||||
/// </summary>
|
|
||||||
public string Sex { get; set; }
|
|
||||||
/// <summary>
|
|
||||||
/// 身份证号码
|
/// 身份证号码
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string IdentityCard { get; set; }
|
public string IdentityCard { get; set; }
|
||||||
@@ -60,18 +52,6 @@ namespace Model
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string WorkPostName { get; set; }
|
public string WorkPostName { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 电话
|
|
||||||
/// </summary>
|
|
||||||
public string Telephone { get; set; }
|
|
||||||
/// <summary>
|
|
||||||
/// 照片路径
|
|
||||||
/// </summary>
|
|
||||||
public string PhotoUrl { get; set; }
|
|
||||||
/// <summary>
|
|
||||||
/// 照片二进制
|
|
||||||
/// </summary>
|
|
||||||
public string headImage { get; set; }
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 部门名称
|
/// 部门名称
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -0,0 +1,124 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Model
|
||||||
|
{
|
||||||
|
public class ProjectPersonOutput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 人员主键ID
|
||||||
|
/// </summary>
|
||||||
|
public string PersonId { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 项目人员主键ID
|
||||||
|
/// </summary>
|
||||||
|
public string SitePersonId { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 卡号
|
||||||
|
/// </summary>
|
||||||
|
public string CardNo { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 姓名
|
||||||
|
/// </summary>
|
||||||
|
public string PersonName { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 性别
|
||||||
|
/// </summary>
|
||||||
|
public string SexName { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 身份证号码
|
||||||
|
/// </summary>
|
||||||
|
public string IdentityCard { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 项目id
|
||||||
|
/// </summary>
|
||||||
|
public string ProjectId { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 项目名称
|
||||||
|
/// </summary>
|
||||||
|
public string ProjectName { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 单位ID
|
||||||
|
/// </summary>
|
||||||
|
public string UnitId { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 单位名称
|
||||||
|
/// </summary>
|
||||||
|
public string UnitName { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 班组名称
|
||||||
|
/// </summary>
|
||||||
|
public string TeamGroupName { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 岗位名称
|
||||||
|
/// </summary>
|
||||||
|
public string WorkPostName { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 入场时间
|
||||||
|
/// </summary>
|
||||||
|
public string InTime { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 出场时间
|
||||||
|
/// </summary>
|
||||||
|
public string OutTime { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 出场原因
|
||||||
|
/// </summary>
|
||||||
|
public string OutResult { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 电话
|
||||||
|
/// </summary>
|
||||||
|
public string Telephone { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 照片路径
|
||||||
|
/// </summary>
|
||||||
|
public string PhotoUrl { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 部门名称
|
||||||
|
/// </summary>
|
||||||
|
public string DepartName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 作业区域名称
|
||||||
|
/// </summary>
|
||||||
|
public string WorkAreaName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 岗位类型
|
||||||
|
/// </summary>
|
||||||
|
public string PostType
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
set;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 岗位类型名称
|
||||||
|
/// </summary>
|
||||||
|
public string PostTypeName
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
set;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 人员类型
|
||||||
|
/// </summary>
|
||||||
|
public string PersonType
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
set;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 人员类型
|
||||||
|
/// </summary>
|
||||||
|
public string PersonTypeName
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
set;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -252,7 +252,9 @@
|
|||||||
<Compile Include="HJGL\TestPackageAnalyzeOutput.cs" />
|
<Compile Include="HJGL\TestPackageAnalyzeOutput.cs" />
|
||||||
<Compile Include="HSSE\DigDataHSEDataCollectItem.cs" />
|
<Compile Include="HSSE\DigDataHSEDataCollectItem.cs" />
|
||||||
<Compile Include="HSSE\PageDataPersonInOutItem.cs" />
|
<Compile Include="HSSE\PageDataPersonInOutItem.cs" />
|
||||||
|
<Compile Include="HSSE\PersonInOutRecordInput.cs" />
|
||||||
<Compile Include="HSSE\ProjectPersonInput.cs" />
|
<Compile Include="HSSE\ProjectPersonInput.cs" />
|
||||||
|
<Compile Include="HSSE\ProjectPersonOutput.cs" />
|
||||||
<Compile Include="HSSE\PuApiOutput.cs" />
|
<Compile Include="HSSE\PuApiOutput.cs" />
|
||||||
<Compile Include="HSSE\PuPayCraftAmountInput.cs" />
|
<Compile Include="HSSE\PuPayCraftAmountInput.cs" />
|
||||||
<Compile Include="HSSE\WorkPostStatisticItem.cs" />
|
<Compile Include="HSSE\WorkPostStatisticItem.cs" />
|
||||||
|
|||||||
@@ -102,25 +102,38 @@ namespace WebAPI.Controllers
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 根据条件获取项目人员信息(支持分页和过滤)
|
/// 根据条件获取项目人员信息(支持分页和过滤)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="filter">查询过滤条件</param>
|
/// <param name="filter">查询过滤条件(ProjectName为必填参数)</param>
|
||||||
/// <param name="pagesize">每页条数</param>
|
/// <param name="pagesize">每页条数</param>
|
||||||
/// <param name="pageindex">页码(从1开始)</param>
|
/// <param name="pageindex">页码(从1开始)</param>
|
||||||
/// <param name="returnAll">是否返回全部数据</param>
|
/// <param name="returnAll">是否返回全部数据</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public Model.ResponeData getPersonByFilter([FromUri] Model.ProjectPersonInput filter, int pagesize = 15, int pageindex = 1, bool returnAll = false)
|
public Model.ResponeData getPersonByFilter([FromUri] Model.ProjectPersonInput filter, int? pagesize = 15, int? pageindex = 1, bool ? returnAll = false)
|
||||||
{
|
{
|
||||||
var responeData = new Model.ResponeData();
|
var responeData = new Model.ResponeData();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// 验证必填参数 ProjectName
|
||||||
|
if (filter == null || string.IsNullOrEmpty(filter.ProjectName))
|
||||||
|
{
|
||||||
|
responeData.code = 2;
|
||||||
|
responeData.message = "ProjectName为必填参数!";
|
||||||
|
return responeData;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理可空参数的默认值
|
||||||
|
int actualPagesize = pagesize ?? 15;
|
||||||
|
int actualPageindex = pageindex ?? 1;
|
||||||
|
bool actualReturnAll = returnAll ?? false;
|
||||||
|
|
||||||
var getDataList = APIPersonService.getPersonByFilter(filter);
|
var getDataList = APIPersonService.getPersonByFilter(filter);
|
||||||
int pageCount = getDataList.Count;
|
int pageCount = getDataList.Count;
|
||||||
|
|
||||||
if (!returnAll && pageCount > 0 && pageindex > 0 && pagesize > 0)
|
if (!actualReturnAll && pageCount > 0 && actualPageindex > 0 && actualPagesize > 0)
|
||||||
{
|
{
|
||||||
getDataList = getDataList.Skip(pagesize * (pageindex - 1)).Take(pagesize).ToList();
|
getDataList = getDataList.Skip(actualPagesize * (actualPageindex - 1)).Take(actualPagesize).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
responeData.data = new { pageCount, pageindex, pagesize, getDataList };
|
responeData.data = new { pageCount, pageindex = actualPageindex, pagesize = actualPagesize, getDataList };
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -1027,6 +1040,60 @@ namespace WebAPI.Controllers
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region 根据条件获取人员出入场记录(支持分页和过滤)
|
||||||
|
/// <summary>
|
||||||
|
/// 根据条件获取人员出入场记录(支持分页和过滤)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filter">查询过滤条件(StartTime和EndTime必填)</param>
|
||||||
|
/// <param name="pagesize">每页条数</param>
|
||||||
|
/// <param name="pageindex">页码(从1开始)</param>
|
||||||
|
/// <param name="returnAll">是否返回全部数据</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public Model.ResponeData getPersonInOutListByFilter([FromUri] Model.PersonInOutRecordInput filter, int? pagesize = 15, int? pageindex = 1, bool? returnAll = false)
|
||||||
|
{
|
||||||
|
var responeData = new Model.ResponeData();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 验证必填参数
|
||||||
|
if (filter == null || filter.StartTime == default(DateTime) || filter.EndTime == default(DateTime))
|
||||||
|
{
|
||||||
|
responeData.code = 2;
|
||||||
|
responeData.message = "StartTime和EndTime为必填参数!";
|
||||||
|
return responeData;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 验证时间范围
|
||||||
|
if (filter.StartTime > filter.EndTime)
|
||||||
|
{
|
||||||
|
responeData.code = 2;
|
||||||
|
responeData.message = "StartTime不能大于EndTime!";
|
||||||
|
return responeData;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理可空参数的默认值
|
||||||
|
int actualPagesize = pagesize ?? 15;
|
||||||
|
int actualPageindex = pageindex ?? 1;
|
||||||
|
bool actualReturnAll = returnAll ?? false;
|
||||||
|
|
||||||
|
var getDataList = APIPersonService.getPersonInOutListByFilter(filter);
|
||||||
|
int pageCount = getDataList.Count;
|
||||||
|
|
||||||
|
if (!actualReturnAll && pageCount > 0 && actualPageindex > 0 && actualPagesize > 0)
|
||||||
|
{
|
||||||
|
getDataList = getDataList.Skip(actualPagesize * (actualPageindex - 1)).Take(actualPagesize).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
responeData.data = new { pageCount, pageindex = actualPageindex, pagesize = actualPagesize, getDataList };
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
responeData.code = 0;
|
||||||
|
responeData.message = ex.Message;
|
||||||
|
}
|
||||||
|
return responeData;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region 获取异常人员信息出入场记录
|
#region 获取异常人员信息出入场记录
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取异常人员信息出入场记录
|
/// 获取异常人员信息出入场记录
|
||||||
|
|||||||
Reference in New Issue
Block a user