Commit a08d9abe authored by 黄奎's avatar 黄奎

Merge branch 'master' of http://gitlab.oytour.com/Kui2/education

parents 35eee09d fa4acefc
......@@ -40,5 +40,9 @@
/// 表单重复提交
/// </summary>
FormRepeatSubmit = 10003,
/// <summary>
/// 不在打卡范围
/// </summary>
NotInCardRange = 20001,
}
}
......@@ -274,6 +274,15 @@ namespace Edu.Common
}
}
public static int IsSendMsg
{
get
{
int.TryParse(ReadConfigKey("IsSendMsg"), out int _isSendMsg);
return _isSendMsg;
}
}
/// <summary>
/// 导出文件保存路径
/// </summary>
......
......@@ -16,6 +16,11 @@ namespace Edu.Common.Enum.Public
/// 阿里云
/// </summary>
[EnumField("阿里云")]
Alicloud = 2
Alicloud = 2,
/// <summary>
/// 系统
/// </summary>
[EnumField("系统")]
System = 3
}
}
using System;
using System.Collections.Generic;
using System.Text;
using Edu.Common.Plugin;
namespace Edu.Common.Enum.System
{
public enum BaseTemplateTypeEnum
{
/// <summary>
/// 订单下单成功通知
/// </summary>
[EnumField("订单下单成功通知")]
OrderSuccess = 1,
/// <summary>
/// 订单下单失败通知
/// </summary>
[EnumField("订单下单失败通知")]
OrderFail = 2
}
}
using System;
using System.Collections.Generic;
using System.Text;
using Edu.Common.Plugin;
namespace Edu.Common.Enum.System
{
public enum MsgSendStatusEnum
{
//发送状态1:等待回执,2:发送失败,3:发送成功。
/// <summary>
/// 等待回执
/// </summary>
[EnumField("等待回执")]
InReceipt = 1,
/// <summary>
/// 发送失败
/// </summary>
[EnumField("发送失败")]
Fail = 2,
/// <summary>
/// 发送成功
/// </summary>
[EnumField("发送成功")]
Success = 3,
}
}
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
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;
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using Edu.Common.Enum.Public;
using Edu.Common.Enum.System;
using VT.FW.DB;
namespace Edu.Model.Entity.System
{
/// <summary>
/// 短信发送记录实体表
/// </summary>
[Serializable]
[DB(ConnectionName = "DefaultConnection")]
public class RB_Msg_BaseTemplate
{
public int ID { get; set; }
/// <summary>
/// 集团编号
/// </summary>
public int Group_Id { get; set; }
/// <summary>
/// 模板状态,0-正常,1-禁用
/// </summary>
public int TemplateStaus { get; set; }
public BaseTemplateTypeEnum BaseTemplateType { get; set; }
/// <summary>
/// 存储位置,1-腾讯云,2-阿里,3-其他
/// </summary>
public StoreTypeEnum StoreType { get; set; }
/// <summary>
/// 签名
/// </summary>
public string Sign { get; set; }
/// <summary>
/// 消息配置信息
/// </summary>
public string TemplateId { get; set; }
/// <summary>
/// 创建人
/// </summary>
public int CreateBy { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreateDate { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
using Edu.Common.Enum.System;
using VT.FW.DB;
namespace Edu.Model.Entity.System
......@@ -36,10 +37,10 @@ namespace Edu.Model.Entity.System
public DateTime CreateDate { get; set; }
/// <summary>
/// 发送状态1-失败,2-成功
/// 发送状态1:等待回执,2:发送失败,3:发送成功。
/// </summary>
public int SendStatus { get; set; }
public MsgSendStatusEnum? SendStatus { get; set; }
/// <summary>
......@@ -67,5 +68,17 @@ namespace Edu.Model.Entity.System
/// 接收人电话
/// </summary>
public string ReceiverPhone { get; set; }
/// <summary>
/// 存储位置,1-腾讯云,2-阿里,3-其他
/// </summary>
public Common.Enum.Public.StoreTypeEnum StoreType { get; set; }
/// <summary>
/// 消息配置信息
/// </summary>
public string MsgConfigure { get; set; }
}
}
......@@ -56,6 +56,10 @@ namespace Edu.Model.Public
/// </summary>
public string CustomDomain { get; set; }
/// <summary>
/// 上传域名
/// </summary>
public string UploadDomain { get; set; }
/// <summary>
/// 自定义域名
......@@ -65,7 +69,7 @@ namespace Edu.Model.Public
/// 自定义域名
/// </summary>
public string SecretId { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
using Edu.Model.Entity.System;
namespace Edu.Model.ViewModel.System
{
public class RB_Msg_BaseTemplate_ViewModel: RB_Msg_BaseTemplate
{
/// <summary>
/// 创建时间字符串
/// </summary>
public string CreateDateStr
{
get
{
return Common.ConvertHelper.FormatTime(this.CreateDate);
}
}
public string BaseTemplateTypeStr { get; set; }
}
}
......@@ -28,5 +28,8 @@ namespace Edu.Model.ViewModel.System
/// </summary>
public string EndDate { get; set; }
public RB_Msg_Base_ViewModel MsgBase { get; set; }
}
}
......@@ -9,6 +9,13 @@
<ProjectReference Include="..\Edu.Common\Edu.Common.csproj" />
<ProjectReference Include="..\Edu.Model\Edu.Model.csproj" />
<ProjectReference Include="..\Edu.Repository\Edu.Repository.csproj" />
<ProjectReference Include="..\Edu.ThirdCore\Edu.ThirdCore.csproj" />
</ItemGroup>
<ItemGroup>
<Reference Include="aliyun-net-sdk-dysmsapi">
<HintPath>..\Edu.ThirdCore\lib\aliyun-net-sdk-dysmsapi.dll</HintPath>
</Reference>
</ItemGroup>
</Project>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Edu.Common.Enum;
using Edu.Model.Entity.System;
using Edu.Model.ViewModel.System;
using Edu.Repository.System;
using VT.FW.DB;
using Aliyun.Net.SDK.Core;
namespace Edu.Module.System
{
......@@ -21,6 +23,11 @@ namespace Edu.Module.System
/// </summary>
private readonly RB_Msg_BaseRepository msgBaseRepository = new RB_Msg_BaseRepository();
/// <summary>
/// 短信模板配置仓储层对象
/// </summary>
private readonly RB_Msg_BaseTemplateRepository msgBaseTemplateRepository = new RB_Msg_BaseTemplateRepository();
#region 短信记录
......@@ -42,7 +49,7 @@ namespace Edu.Module.System
/// <summary>
/// 获取班级列表
/// 获取短信配置列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
......@@ -52,7 +59,7 @@ namespace Edu.Module.System
}
/// <summary>
/// 获取班级分页列表
/// 获取短信配置列表
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
......@@ -76,7 +83,8 @@ namespace Edu.Module.System
{
{ nameof(RB_Msg_Base.CreateDate),model.CreateDate},
{ nameof(RB_Msg_Base.CreateBy),model.CreateBy},
{ nameof(RB_Msg_Base.MsgConfigure),model.MsgConfigure}
{ nameof(RB_Msg_Base.StoreType),model.StoreType},
{ nameof(RB_Msg_Base.MsgConfigure),model.MsgConfigure}
};
return msgBaseRepository.Update(fileds, new WhereHelper(nameof(RB_Msg_Base.ID), model.ID));
}
......@@ -111,5 +119,194 @@ namespace Edu.Module.System
return msgBaseRepository.Update(fileds, new WhereHelper(nameof(RB_Msg_Base.ID), ID));
}
#endregion
#region 短信模板配置
/// <summary>
/// 获取短信模板配置列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_Msg_BaseTemplate_ViewModel> GetMsgBaseTemplateListModule(RB_Msg_BaseTemplate_ViewModel query)
{
return msgBaseTemplateRepository.GetListRepository(query);
}
/// <summary>
/// 获取短信模板配置分页列表
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="rowsCount"></param>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_Msg_BaseTemplate_ViewModel> GetMsgBaseTemplatePageListModule(int pageIndex, int pageSize, out long rowsCount, RB_Msg_BaseTemplate_ViewModel query)
{
return msgBaseTemplateRepository.GetPageListRepository(pageIndex, pageSize, out rowsCount, query);
}
/// <summary>
/// 新增修改 短信模板配置
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public bool SetMsgBaseTemplateModule(RB_Msg_BaseTemplate_ViewModel model)
{
if (model.ID > 0)
{
Dictionary<string, object> fileds = new Dictionary<string, object>()
{
{ nameof(RB_Msg_BaseTemplate_ViewModel.CreateDate),model.CreateDate},
{ nameof(RB_Msg_BaseTemplate_ViewModel.CreateBy),model.CreateBy},
{ nameof(RB_Msg_BaseTemplate_ViewModel.TemplateStaus),model.TemplateStaus},
{ nameof(RB_Msg_BaseTemplate_ViewModel.TemplateId),model.TemplateId},
{ nameof(RB_Msg_BaseTemplate_ViewModel.StoreType),model.StoreType},
{ nameof(RB_Msg_BaseTemplate_ViewModel.Sign),model.Sign},
{ nameof(RB_Msg_BaseTemplate_ViewModel.BaseTemplateType),model.BaseTemplateType}
};
return msgBaseTemplateRepository.Update(fileds, new WhereHelper(nameof(RB_Msg_BaseTemplate_ViewModel.ID), model.ID));
}
else
{
var newId = msgBaseTemplateRepository.Insert(model);
return newId > 0;
}
}
/// <summary>
/// 根据短信模板配置编号获取短信配置详细信息
/// </summary>
/// <param name="ClassId"></param>
/// <returns></returns>
public RB_Msg_BaseTemplate_ViewModel GetMsgBaseTemplateModule(object ClassId)
{
return msgBaseTemplateRepository.GetEntity<RB_Msg_BaseTemplate_ViewModel>(ClassId);
}
/// <summary>
/// 删除短信模板配置
/// </summary>
/// <param name="ClassId"></param>
/// <returns></returns>
public bool RemoveMsgBaseTemplateModule(object ID)
{
Dictionary<string, object> fileds = new Dictionary<string, object>()
{
{ nameof(RB_Msg_BaseTemplate_ViewModel.TemplateStaus),(int)DateStateEnum.Delete},
};
return msgBaseTemplateRepository.Update(fileds, new WhereHelper(nameof(RB_Msg_BaseTemplate_ViewModel.ID), ID));
}
#endregion
#region 发送短信统一方法
public void SendMsg(object PhoneMessage, Common.Enum.System.BaseTemplateTypeEnum BaseTemplateType, RB_Msg_Log msgLogModel)
{
//查询当前集团的短信基础配置
var msgBaseList = msgBaseRepository.GetListRepository(new RB_Msg_Base_Function_ViewModel { Group_Id = msgLogModel.Group_Id });
//查询当前下面是否有模板
var allMsgBaseTemplateList = msgBaseTemplateRepository.GetListRepository(new RB_Msg_BaseTemplate_ViewModel { BaseTemplateType = BaseTemplateType, Group_Id = msgLogModel.Group_Id }).Where(x => x.TemplateStaus == 0);
if (msgBaseList != null && msgBaseList.Any() && allMsgBaseTemplateList != null && allMsgBaseTemplateList.Any())
{
RB_Msg_Base_Function_ViewModel model = new RB_Msg_Base_Function_ViewModel(); // msgBaseList.OrderBy(x => x.ID).FirstOrDefault();
if (allMsgBaseTemplateList.Where(x => x.BaseTemplateType == BaseTemplateType).GroupBy(x => x.StoreType).Count() > 1)
{
model = msgBaseList.OrderBy(x => x.ID).FirstOrDefault();
}
else
{
model = msgBaseList.Where(x => x.StoreType == allMsgBaseTemplateList.FirstOrDefault().StoreType).FirstOrDefault();
}
if (model != null && model.ID > 0)
{
if (!string.IsNullOrWhiteSpace(model.MsgConfigure))
{
msgLogModel.StoreType = model.StoreType;
msgLogModel.MsgConfigure = model.MsgConfigure;
int id = msgLogRepository.Insert(msgLogModel);
model.MsgBase = Common.Plugin.JsonHelper.DeserializeObject<RB_Msg_Base_ViewModel>(model.MsgConfigure);
var msgBaseTemplateList = allMsgBaseTemplateList.Where(x => x.BaseTemplateType == BaseTemplateType);
if (!string.IsNullOrWhiteSpace(model.MsgBase.AccessKeyId) && !string.IsNullOrWhiteSpace(model.MsgBase.AccessSecret) && !string.IsNullOrWhiteSpace(model.MsgBase.Domain) && !string.IsNullOrWhiteSpace(model.MsgBase.RegionId))
{
if (msgBaseTemplateList != null && msgBaseTemplateList.Any(x => x.TemplateStaus == 0))
{
var msgBaseTemplateModel = msgBaseTemplateList.Where(x => x.TemplateStaus == 0).FirstOrDefault();
if (Common.Config.IsSendMsg == 1)
{
ThirdCore.Message.SMSService.SendMsg(msgLogModel.ReceiverPhone, PhoneMessage, msgBaseTemplateModel.TemplateId, msgBaseTemplateModel.Sign, model.MsgBase.Domain, model.MsgBase.AccessKeyId, model.MsgBase.AccessSecret, model.MsgBase.RegionId, id.ToString());
}
}
}
}
}
}
// ThirdCore.Message.SMSService.SendMsg("13551132417", PhoneMessage, "SMS_201722097", "印象之旅", "dysmsapi.aliyuncs.com", "LTAIwE7l9dImZSa3", "j47Ajn0d0WzUCIX8Biyj3P2r8QDltI", "cn-hangzhou");
}
/// <summary>
/// 更新消息发送状态
/// </summary>
public void UpdateMsgSendStatus()
{
var list = msgLogRepository.GetListRepository(new RB_Msg_Log { SendStatus = Common.Enum.System.MsgSendStatusEnum.InReceipt });
foreach (var item in list.GroupBy(x => new { x.ReceiverPhone, x.StoreType, x.MsgConfigure, CreateDate = x.CreateDate.ToString("yyyyMMdd") }))
{
if (item.Key.StoreType == Common.Enum.Public.StoreTypeEnum.Alicloud)
{
try
{
RB_Msg_Base_ViewModel msgBase = new RB_Msg_Base_ViewModel();
if (!string.IsNullOrWhiteSpace(item.Key.MsgConfigure))
{
msgBase = Common.Plugin.JsonHelper.DeserializeObject<RB_Msg_Base_ViewModel>(item.Key.MsgConfigure);
}
Aliyun.Acs.Dysmsapi.Model.V20170525.QuerySendDetailsResponse querySendDetailsResponse = Edu.ThirdCore.Message.MessageCore.QuerySendDetails(item.Key.ReceiverPhone, DateTime.Now.ToString("yyyyMMdd"), "", msgBase.Domain, msgBase.AccessKeyId, msgBase.AccessSecret, msgBase.RegionId);
if (querySendDetailsResponse.Code == "OK")
{
if (querySendDetailsResponse.SmsSendDetailDTOs != null && querySendDetailsResponse.SmsSendDetailDTOs.Any())
{
foreach (var modelSmsSendDetailDTO in querySendDetailsResponse.SmsSendDetailDTOs)
{
int sendStatus = 1;
if (modelSmsSendDetailDTO != null && !string.IsNullOrWhiteSpace(modelSmsSendDetailDTO.OutId))
{
sendStatus = (int)(modelSmsSendDetailDTO.SendStatus ?? 1);
}
if (sendStatus > 1)
{
Dictionary<string, object> fileds = new Dictionary<string, object>()
{
{ nameof(RB_Msg_Log.SendStatus),sendStatus}
};
msgLogRepository.Update(fileds, new WhereHelper(nameof(RB_Msg_Log.ID), Convert.ToInt32(modelSmsSendDetailDTO.OutId)));
}
}
}
}
}
catch (Exception ex)
{
}
}
}
}
#endregion
}
}
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;
}
}
}
......@@ -2293,14 +2293,14 @@
"Microsoft.NETCore.Targets/1.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-jtuKp4+ddUpehBOlmQJNWek/tXwXLeDAGtkkrHS1Qi6nOPmaLCuvDKFaqBu2c4DGKci+JMDUk4R+6jQ8P8l1aw==",
"sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==",
"path": "microsoft.netcore.targets/1.1.0",
"hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512"
},
"Microsoft.Win32.Primitives/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ZthhVqE8T07PsCHMAixDJJjmbdc07VO3GW8FULO+YWr/CmTLolwJoJdXRL/z2/4FAOtCJaJ/H+TPhtH2v1oaUA==",
"sha512": "sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==",
"path": "microsoft.win32.primitives/4.3.0",
"hashPath": "microsoft.win32.primitives.4.3.0.nupkg.sha512"
},
......@@ -2356,7 +2356,7 @@
"NETStandard.Library/1.6.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-UQNdem5WY//vGStfYv8LFMcWvNTLxUocZ9YfGg4Ps2WaDerp+HrO46tDjQX88/wZaBkwv+Xq/mqjfPeMDz6QnQ==",
"sha512": "sha512-WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==",
"path": "netstandard.library/1.6.1",
"hashPath": "netstandard.library.1.6.1.nupkg.sha512"
},
......@@ -2391,28 +2391,28 @@
"runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-uoCdP75em+GOf04ew/VTet4nr9h/uVMJkrAF9vgRXc4NV4c94R5bzL853tU/kjEfQEUn79aEzzL/ETNhLTasow==",
"sha512": "sha512-HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==",
"path": "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl/4.3.0",
"hashPath": "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512"
},
"runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-h6SbWq7Fjz9udTUOzuhx1sLYBaIs9YmKpiAb17H9E0YYYIOknAusPKVGv1bExrka1WRtbnpTXpuoBfYU8zVH1w==",
"sha512": "sha512-+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==",
"path": "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl/4.3.0",
"hashPath": "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512"
},
"runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-cHH7MckuzKikSR6L6RrySZ2m2C9DDsse28va9U2bE2Op1KotonVDj8JB8qLlXC3jNrdH0SuHfZ4jsHpKuTT0iw==",
"sha512": "sha512-c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==",
"path": "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl/4.3.0",
"hashPath": "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512"
},
"runtime.native.System/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-S+nQhAdiCsSEeAqawUDCKvQl6sO501hZaT/8V49VpKGSNJQKZh0z2pw+TRDOo9LJv8yjCWMHypHgQBTEEUmw2w==",
"sha512": "sha512-c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==",
"path": "runtime.native.system/4.3.0",
"hashPath": "runtime.native.system.4.3.0.nupkg.sha512"
},
......@@ -2426,84 +2426,84 @@
"runtime.native.System.IO.Compression/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ubimUZNWVWNbB55MO1Ev9uq66w2jmHgx4wNCaUHUs4G6qHPyGm5b0cV+zS2ai0aS9sO1e6StzJJ98OIhVQ2Oyw==",
"sha512": "sha512-INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==",
"path": "runtime.native.system.io.compression/4.3.0",
"hashPath": "runtime.native.system.io.compression.4.3.0.nupkg.sha512"
},
"runtime.native.System.Net.Http/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-iTbzUFkAYPzlBjSNi4/tv6GWiw4c3D2mYScFgPgS5BUEO7K21AYXeIU7l8KtErqYEn/+DJ5FZLDDd9xMEASN4Q==",
"sha512": "sha512-ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==",
"path": "runtime.native.system.net.http/4.3.0",
"hashPath": "runtime.native.system.net.http.4.3.0.nupkg.sha512"
},
"runtime.native.System.Security.Cryptography.Apple/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-5DyXXwEyil5vfxbfszS9HVXqMrPBsvZtTe1COwiDt4hfjp/yTFbACWb4JZ2IfYP+r+mb0pwobpBLQ5aW7qUv3Q==",
"sha512": "sha512-DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==",
"path": "runtime.native.system.security.cryptography.apple/4.3.0",
"hashPath": "runtime.native.system.security.cryptography.apple.4.3.0.nupkg.sha512"
},
"runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-fFcF1RvzmvWvBqBeyLa5MX/HO5cGe2Tef6uZnUKv0LJ0MwKhXensaDd48pXDgDLrHOCH9yLg8ENb6ppmgA/Upw==",
"sha512": "sha512-NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==",
"path": "runtime.native.system.security.cryptography.openssl/4.3.0",
"hashPath": "runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512"
},
"runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-y1X4xOQmneMsDwpkiRAzHI+PaH7eycMb1jIFU3bAb20Ks0l14ZSOx9HTHQviOtztYuLZ9shZNRJNvWVbJSIMpg==",
"sha512": "sha512-b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==",
"path": "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl/4.3.0",
"hashPath": "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512"
},
"runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-vv4ZlH/xxDOrL3r5y76cdsmzlCS/yrOTs4xjGNwe1P57f0CkTQdzMz9dSHo4tWk9Eg4bA3DiVwVpVO+kqAEZQg==",
"sha512": "sha512-KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==",
"path": "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl/4.3.0",
"hashPath": "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512"
},
"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-FwiyAuPHsMyQVxhdC9NvJgnaYzEu0080It56MNVonOUX54ezZzafsjuSeRht8R4slkTDwU0laIXWuUEN7U6tTA==",
"sha512": "sha512-kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==",
"path": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.apple/4.3.0",
"hashPath": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.apple.4.3.0.nupkg.sha512"
},
"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-wH7IrGz1YyAPIt4nJXut7EyjQ5xgs2qc23YN0OiMCoA0i2OoAXgpNAPSl0QDjXB+CeKe+ZRnhGNeKfYBX1YdLw==",
"sha512": "sha512-X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==",
"path": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0",
"hashPath": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512"
},
"runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-WWabnawXg2BVm76El1mwkgzOljzAOK8YHe4AenFiKKDG8/nXs38RtInyrHcG2xNLrCLSfRwrhfS4RPAQH5E0ew==",
"sha512": "sha512-nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==",
"path": "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl/4.3.0",
"hashPath": "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512"
},
"runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-rBEA8wlrj/iZvNMyz/lksEz+ps3LknjwavzCG+23vm1WwLZWYIEoQIDi10pgXzgUROHC9j2ppoownmB9YzARmQ==",
"sha512": "sha512-ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==",
"path": "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0",
"hashPath": "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512"
},
"runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-0DLUJpbpi+CthPVmOzA7bkNKwNuxvFi4V8sYsSYQuLuQbBAd462CHOrIMM29ivBeUsEvdtdAel+JZa4s9t6dFQ==",
"sha512": "sha512-I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==",
"path": "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0",
"hashPath": "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512"
},
"runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Tq1k9cfn9PGxTwX8QmWS9NQ9Rt4HS/r+i6SPe2R5cM9OO+RgWbRK0ExGGcZqjuqyzekHfHBYrW8sVUNvaZjw8w==",
"sha512": "sha512-VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==",
"path": "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0",
"hashPath": "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512"
},
......@@ -2566,7 +2566,7 @@
"System.AppContext/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-do9UYqgS80R3NfDLsxXgAyv0w4y003ik6KmfYBpJ5CTBQb/K8ylQfrx7WlnXwvdmxj2kti2NKPv8/8nua54/ng==",
"sha512": "sha512-fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==",
"path": "system.appcontext/4.3.0",
"hashPath": "system.appcontext.4.3.0.nupkg.sha512"
},
......@@ -2580,14 +2580,14 @@
"System.Collections/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-tfqWMsO3XZc72+g/jdFG2bdAErjOc/SlQBXa9+maU/TvZPu6Ew8a2HQOfLAuY8CVuqviTaeEu7ptsbxPB+8SaA==",
"sha512": "sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==",
"path": "system.collections/4.3.0",
"hashPath": "system.collections.4.3.0.nupkg.sha512"
},
"System.Collections.Concurrent/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-tRgZFvPa9jMS4qRluyUvD5Ll6gJeG5vG5UHWZ7nK83dOzpCux8pRuJY2TiPvoqx/anCRNEweVl+89ieenbnHHg==",
"sha512": "sha512-ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==",
"path": "system.collections.concurrent/4.3.0",
"hashPath": "system.collections.concurrent.4.3.0.nupkg.sha512"
},
......@@ -2608,7 +2608,7 @@
"System.ComponentModel/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-0WhdQqaBmYmIgmgADNmjTenYep1MsRO2qgATQiGkLVjinEfRBATw+OaMUTU3FQtUDxCyl2HNz789BpBCb9NcSQ==",
"sha512": "sha512-VyGn1jGRZVfxnh8EdvDCi71v3bMXrsu8aYJOwoV7SNDLVhiEqwP86pPMyRGsDsxhXAm2b3o9OIqeETfN5qfezw==",
"path": "system.componentmodel/4.3.0",
"hashPath": "system.componentmodel.4.3.0.nupkg.sha512"
},
......@@ -2643,7 +2643,7 @@
"System.Console/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-HyI4eNqHaD7sDyxN7eTC3MmVA34LrK86IgXY4bznqGgpJ52zrigum5ZZj0ZxD+Xbnwhix/cwgJazOstiKBP/LQ==",
"sha512": "sha512-DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==",
"path": "system.console/4.3.0",
"hashPath": "system.console.4.3.0.nupkg.sha512"
},
......@@ -2657,7 +2657,7 @@
"System.Diagnostics.Debug/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3jTiSHr6dO9uSJAoUcH8Wg29Nc+cQHSmkkn9ul6a9HQhW0KboGrGLiHGCt2AXISFHK7YlGP0fzes2X6/gbpDgQ==",
"sha512": "sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==",
"path": "system.diagnostics.debug/4.3.0",
"hashPath": "system.diagnostics.debug.4.3.0.nupkg.sha512"
},
......@@ -2678,7 +2678,7 @@
"System.Diagnostics.Tools/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-uVam5oaDJ+lrCkzR5paF0bXKewt8/h8ZaX8xIqm48ypbpdpkp/EWM+uTegiUvraO3Fv+o3oj0cPtprJISNhXXQ==",
"sha512": "sha512-UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==",
"path": "system.diagnostics.tools/4.3.0",
"hashPath": "system.diagnostics.tools.4.3.0.nupkg.sha512"
},
......@@ -2692,7 +2692,7 @@
"System.Diagnostics.Tracing/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-sRRUOGLj+PCOa9xei6b4JUSg0CSxwBm+EkyNAngFW9ARE6S3D19o9Ol5SeGUr1tFSVt4vX+xdl0OSz581Ksd4Q==",
"sha512": "sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==",
"path": "system.diagnostics.tracing/4.3.0",
"hashPath": "system.diagnostics.tracing.4.3.0.nupkg.sha512"
},
......@@ -2706,63 +2706,63 @@
"System.Dynamic.Runtime/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-zxQXMykO4ZAptqREvoqNlbzdBz+SusbQqr8acRtXQGZ3wDyH+Mi6VFImuIyeFsPMkNLhNvk2xBzNHnY1Bi9zjQ==",
"sha512": "sha512-SNVi1E/vfWUAs/WYKhE9+qlS6KqK0YVhnlT0HQtr8pMIA8YX3lwy3uPMownDwdYISBdmAF/2holEIldVp85Wag==",
"path": "system.dynamic.runtime/4.3.0",
"hashPath": "system.dynamic.runtime.4.3.0.nupkg.sha512"
},
"System.Globalization/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-QsvKtsliUgA7KWLgXPibgflvlvg0r3g05jzNMwz5tvRg4ZPnRT8xtzr8CBCDdBVQs7x8qUcHvciUykA8bAo7jw==",
"sha512": "sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==",
"path": "system.globalization/4.3.0",
"hashPath": "system.globalization.4.3.0.nupkg.sha512"
},
"System.Globalization.Calendars/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-AaI3lmNJGDhuQ2gvrcj1mL4mFMVNXQ+mQ4a4nMq+jiZk3tDJO6SShiteHoJ+tMAF8u4ipEF0oUHe8aL7hYiFxg==",
"sha512": "sha512-GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==",
"path": "system.globalization.calendars/4.3.0",
"hashPath": "system.globalization.calendars.4.3.0.nupkg.sha512"
},
"System.Globalization.Extensions/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-YTMfoFzh5xRVINlBLjD1b5quJPh9eMpFr4xg17wSRFnVz4IxKltD084XB1curpdQlrAsYjf1wIsf+ddlQl0HnA==",
"sha512": "sha512-FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==",
"path": "system.globalization.extensions/4.3.0",
"hashPath": "system.globalization.extensions.4.3.0.nupkg.sha512"
},
"System.IO/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-lHnCA1CwGlY3hbvMSgRrjGLpj6XJKvvrZ4I/0IFV+CrjPXorggUMrdjFWzWMngdWbYQMYIE3sCatHKInWtMBTQ==",
"sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==",
"path": "system.io/4.3.0",
"hashPath": "system.io.4.3.0.nupkg.sha512"
},
"System.IO.Compression/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-S2tSQT+SjN1MIbKlgqmkowPHD384bX1O1U7vbg+RDMQVLWNUqqOCADy4y/lGkLFwj6P4MfVoukR6HKm3HjmH9w==",
"sha512": "sha512-YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==",
"path": "system.io.compression/4.3.0",
"hashPath": "system.io.compression.4.3.0.nupkg.sha512"
},
"System.IO.Compression.ZipFile/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-SapbBchwyGYdnkT1vtLcKSJHHtQ8r8qhsJ7NTMwK9WQijD7y73L9OTf75iGIAHS7RCZbAyBefsSvHw6RmUEjZQ==",
"sha512": "sha512-G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==",
"path": "system.io.compression.zipfile/4.3.0",
"hashPath": "system.io.compression.zipfile.4.3.0.nupkg.sha512"
},
"System.IO.FileSystem/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Uoayf21U2TOqHjRz1/nxbVvanOaOkisgy8bZLwJUPeloZLiS7TL+t2/doDWQ4Wzq1Xc5qmwtmR3GpRUgh9s5UA==",
"sha512": "sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==",
"path": "system.io.filesystem/4.3.0",
"hashPath": "system.io.filesystem.4.3.0.nupkg.sha512"
},
"System.IO.FileSystem.Primitives/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-qCnhqnKBWOop9amxE4FdfIdhnrHk2nXp/Vbn5ea1/vGXgvA+IrqI/YRSP0TB00ajXKOrZTthyhRwmNx2YFtKNA==",
"sha512": "sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==",
"path": "system.io.filesystem.primitives/4.3.0",
"hashPath": "system.io.filesystem.primitives.4.3.0.nupkg.sha512"
},
......@@ -2776,14 +2776,14 @@
"System.Linq/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-/OIh4dHw7pUiq4t06EMVZOL3DhQY+1wCtjiUHZwFmm83cnpwTv6hKNtULiMP8Q26HYXOx7u3d+AY0IzYPGxOtQ==",
"sha512": "sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==",
"path": "system.linq/4.3.0",
"hashPath": "system.linq.4.3.0.nupkg.sha512"
},
"System.Linq.Expressions/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-0jD/FCSXymfWCrk0UAR9Q2wmNk3VJ0f28ECpZdw2Dj56e4gYrdduDxrMZKCDu8oDJJSFGUIcuXT6cDodrd4wVQ==",
"sha512": "sha512-PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==",
"path": "system.linq.expressions/4.3.0",
"hashPath": "system.linq.expressions.4.3.0.nupkg.sha512"
},
......@@ -2797,7 +2797,7 @@
"System.Net.Http/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Yp04JL85F38LQzElsET91QqJsNQm+BHOZ5PR8IHpi+yM8KBIOVc8RkZXrRYtmDw/4Pu0zxqNKupI9xNUkuZv7A==",
"sha512": "sha512-sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==",
"path": "system.net.http/4.3.0",
"hashPath": "system.net.http.4.3.0.nupkg.sha512"
},
......@@ -2811,84 +2811,84 @@
"System.Net.Primitives/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-BZYIpCiPjW/UhJ5sir6sU3qtLD/0NuAsrUS0CUubAywpuDEPwTaKrN33OJ5FVpLO8aLqfCGRJQAjWgQvZHkbqg==",
"sha512": "sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==",
"path": "system.net.primitives/4.3.0",
"hashPath": "system.net.primitives.4.3.0.nupkg.sha512"
},
"System.Net.Sockets/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-JS4gfkz7iImQFscfYrIHeEGNyttsC7pjBtdpglbvVO15VrvOa1jaIEeCnopKNrI/XCJWihhbYNgdLNm5v4CFKA==",
"sha512": "sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==",
"path": "system.net.sockets/4.3.0",
"hashPath": "system.net.sockets.4.3.0.nupkg.sha512"
},
"System.ObjectModel/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-eASwOXeVD6d04alRZz9htFleUhFGAm9QT9pU71FCUvew58ojSGQ91OpK753Qv0LdqeUk6Oskqs4LZHaY6OCxhw==",
"sha512": "sha512-bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==",
"path": "system.objectmodel/4.3.0",
"hashPath": "system.objectmodel.4.3.0.nupkg.sha512"
},
"System.Reflection/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-/U196t6BR0QGPIodNy1kESvR1co1pW6fhtNZXyOIrers7dpk4+sHvuQjOfZq++KhcpTVZYAttknYEpLBrqn1Bw==",
"sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==",
"path": "system.reflection/4.3.0",
"hashPath": "system.reflection.4.3.0.nupkg.sha512"
},
"System.Reflection.Emit/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-GCAFZkuA/6JuYqVQIpDh1+DNdPZ9cfUY7NvAnQ0DBs3avOZVNVTRIhqZE1eIMu+Qj7sF4U+eRxW0gSfV6hQAgQ==",
"sha512": "sha512-228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==",
"path": "system.reflection.emit/4.3.0",
"hashPath": "system.reflection.emit.4.3.0.nupkg.sha512"
},
"System.Reflection.Emit.ILGeneration/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-/fyzpXnU506v9HfSpaTSGSPnJWFg4b8t0nbKHNwJ5LFquvJAtND6td2Cpp+Ek1OLRuR0WxJ+YCB6ZW2GyvpBZQ==",
"sha512": "sha512-59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==",
"path": "system.reflection.emit.ilgeneration/4.3.0",
"hashPath": "system.reflection.emit.ilgeneration.4.3.0.nupkg.sha512"
},
"System.Reflection.Emit.Lightweight/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-FX/zDlUSbxIwBM3ePmXoFfeiEPXRqwtoDH12velyRYhTv41pmM3fKLWL2vceLrJ1kOZTKFjHScPz+j3arI2p7g==",
"sha512": "sha512-oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==",
"path": "system.reflection.emit.lightweight/4.3.0",
"hashPath": "system.reflection.emit.lightweight.4.3.0.nupkg.sha512"
},
"System.Reflection.Extensions/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-gfClVzHQcT0eY3qSVcMI6cQxwRmjFQfIrINEpBJMA6ftlNIhO/H8/e6V78YzX+0z7Bw2VJFJP4G7oIcbO32olQ==",
"sha512": "sha512-rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==",
"path": "system.reflection.extensions/4.3.0",
"hashPath": "system.reflection.extensions.4.3.0.nupkg.sha512"
},
"System.Reflection.Primitives/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-uln4id8a086oqZBDylX/0jTZQ8qkoAdTjI1ZkUieD+nJkH9qQfRxCWSNCe2W0qVyRiQZe+iKerY5T5dtOyYcXA==",
"sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==",
"path": "system.reflection.primitives/4.3.0",
"hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512"
},
"System.Reflection.TypeExtensions/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ER4elwccfGOYXV69hI3W3nCwMelkAtu3VSs8lhHfE0EjqW5qG8qmv9lbhCdKOEWwI4B/LlXCbsyo38nGYY1Bnw==",
"sha512": "sha512-7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==",
"path": "system.reflection.typeextensions/4.3.0",
"hashPath": "system.reflection.typeextensions.4.3.0.nupkg.sha512"
},
"System.Resources.ResourceManager/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-AN3tKJp9LAOcCA9l+sm67HYGSAhMIWApcLYl6U6yuB9/7U8vybia7BhPUWvlO9D1Bojqhh7fQs4KWYoHLG+Jyw==",
"sha512": "sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==",
"path": "system.resources.resourcemanager/4.3.0",
"hashPath": "system.resources.resourcemanager.4.3.0.nupkg.sha512"
},
"System.Runtime/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-R7ADy3PoW/NP1vgBNBlitlNxZm9OjzlHnPAyY0xvrcJjyh3PqrcDbRErvZwR5TRZxgMnaBT0hZRpHS4EHXzKLw==",
"sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==",
"path": "system.runtime/4.3.0",
"hashPath": "system.runtime.4.3.0.nupkg.sha512"
},
......@@ -2902,35 +2902,35 @@
"System.Runtime.Extensions/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-KqXVl/pu190dAwqKc8fczs34LdLeNEuH69NmCTKmKoN8y1fcxapVIEtrbUVTebiyO2r66m/VP5HaPLU0ejzP6w==",
"sha512": "sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==",
"path": "system.runtime.extensions/4.3.0",
"hashPath": "system.runtime.extensions.4.3.0.nupkg.sha512"
},
"System.Runtime.Handles/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-yDJvHNMQNLHqvBxK63gK5/TrEbNuaZJkBTHapyiq8FwQycDoWlHwSWPqzcpbDnNH3adqL1AV+3Crpuye5Q+QNg==",
"sha512": "sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==",
"path": "system.runtime.handles/4.3.0",
"hashPath": "system.runtime.handles.4.3.0.nupkg.sha512"
},
"System.Runtime.InteropServices/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-HU/IH6woK1FxbYPBBvVADidlk74DZIFlXgk7VTxmsrlNjS9mq9biwgq25YgMvqRllCFtvuNEKcK6zVcMj8S/jA==",
"sha512": "sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==",
"path": "system.runtime.interopservices/4.3.0",
"hashPath": "system.runtime.interopservices.4.3.0.nupkg.sha512"
},
"System.Runtime.InteropServices.RuntimeInformation/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-AwOv0R98WGNhdLNFQGvC027YvE4VUsTmDnkSAoxLUcZVrW/KSXCdeevtBdDuP8JvlSy2MoBaEkI45vdwoxYjxQ==",
"sha512": "sha512-cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==",
"path": "system.runtime.interopservices.runtimeinformation/4.3.0",
"hashPath": "system.runtime.interopservices.runtimeinformation.4.3.0.nupkg.sha512"
},
"System.Runtime.Numerics/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-fbmlkJiM9SEw6chayUoKRdBP7DOXObYAxP7d4xuKk6PU8nClgrf4LGPo/Nd3cqXD0+Uvs5G3fxyS8vrAfRrIAg==",
"sha512": "sha512-yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==",
"path": "system.runtime.numerics/4.3.0",
"hashPath": "system.runtime.numerics.4.3.0.nupkg.sha512"
},
......@@ -2944,42 +2944,42 @@
"System.Security.Cryptography.Algorithms/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-NG72ASyDyPOSIimdioqz0fI9GQckfzbPvQvEQxuIQKLQ0SacMyQRLWPIre2f6i5P8bhEKO7yKX5nZ0a8dL+33w==",
"sha512": "sha512-W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==",
"path": "system.security.cryptography.algorithms/4.3.0",
"hashPath": "system.security.cryptography.algorithms.4.3.0.nupkg.sha512"
},
"System.Security.Cryptography.Cng/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-eew12RoETmll8EN7kEzW7y9jZVbhD/JC5LASxkjrfPesTNQnZMZeeGwV+EY+VqKf2s15IcdI/MUiaN5b+IDueA==",
"sha512": "sha512-03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==",
"path": "system.security.cryptography.cng/4.3.0",
"hashPath": "system.security.cryptography.cng.4.3.0.nupkg.sha512"
},
"System.Security.Cryptography.Csp/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-kCLk/d0VSgm6jjp4vgJUM77z/+BAUkNt5JvQxs+vQm6RZjYSmmluxWdeI30B8js9rc5ja978s6RYZwoNiJDd9g==",
"sha512": "sha512-X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==",
"path": "system.security.cryptography.csp/4.3.0",
"hashPath": "system.security.cryptography.csp.4.3.0.nupkg.sha512"
},
"System.Security.Cryptography.Encoding/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-LJJnwE5qD790h2DPHhlXsmlewEmg2xZducxHhNpoWrk9rNDb71HSKMJpioCJ3hCBtQeDSCsj6uhUeipQ8KS9qA==",
"sha512": "sha512-1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==",
"path": "system.security.cryptography.encoding/4.3.0",
"hashPath": "system.security.cryptography.encoding.4.3.0.nupkg.sha512"
},
"System.Security.Cryptography.OpenSsl/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-8+yrkPIQ7N9oxskjATGoYWqNyPdyXqeN08jRQfdybm2TCyObj81iz/zSytiozBSf8GDpNOfiQ4DqAT9t4zfP5g==",
"sha512": "sha512-h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==",
"path": "system.security.cryptography.openssl/4.3.0",
"hashPath": "system.security.cryptography.openssl.4.3.0.nupkg.sha512"
},
"System.Security.Cryptography.Primitives/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-hFqAVt9OsfH5loeAlpDj+apYs+RzUdmaI19+f2Cq78Vn1bCvVZxEzrECKJH4iD6foRCpIQCwQ/inxz8KKg7XCw==",
"sha512": "sha512-7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==",
"path": "system.security.cryptography.primitives/4.3.0",
"hashPath": "system.security.cryptography.primitives.4.3.0.nupkg.sha512"
},
......@@ -2993,7 +2993,7 @@
"System.Security.Cryptography.X509Certificates/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-G15jaQeTp4XU5A3TI+CiJKhji49hqjZSNbz+R0V2dY7hT6gR4zLpEASYqH3m51JTZtmRx0WhBYxbx13OaQuBFA==",
"sha512": "sha512-t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==",
"path": "system.security.cryptography.x509certificates/4.3.0",
"hashPath": "system.security.cryptography.x509certificates.4.3.0.nupkg.sha512"
},
......@@ -3014,7 +3014,7 @@
"System.Text.Encoding/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-9+kKiGF7iM11HWsWhHv0bJaY3DdabXRK3A0LAu4RES+F0qf/G9OK2xrzaLVOFXjykQw0V9+y5XBbsTrBgU1C5w==",
"sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==",
"path": "system.text.encoding/4.3.0",
"hashPath": "system.text.encoding.4.3.0.nupkg.sha512"
},
......@@ -3028,7 +3028,7 @@
"System.Text.Encoding.Extensions/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-vnL/fBuhf/rHeEsYpSIx14QsU8DLXtoekPCSTeZN4RO3pVweHpnwlGN7Hgs75yY6TVtcYob7za8dufR/wG8WOA==",
"sha512": "sha512-YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==",
"path": "system.text.encoding.extensions/4.3.0",
"hashPath": "system.text.encoding.extensions.4.3.0.nupkg.sha512"
},
......@@ -3049,14 +3049,14 @@
"System.Text.RegularExpressions/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Cs0QoguH5Uw4d66xuhgS/X4Tjm/Mncged1C2fGRXdhPJr9pUhbir59lm40f/RZsxQLL19efaeedWQbtpJryfAg==",
"sha512": "sha512-RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==",
"path": "system.text.regularexpressions/4.3.0",
"hashPath": "system.text.regularexpressions.4.3.0.nupkg.sha512"
},
"System.Threading/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-GUdTRQI5b7tP+bxn0wb1H2urT4gVyZmAMAiAsmExO8xGfxbVYnJnaErE1Qz/K1TL/lpymoQUwgaqj8295vHK+w==",
"sha512": "sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==",
"path": "system.threading/4.3.0",
"hashPath": "system.threading.4.3.0.nupkg.sha512"
},
......@@ -3070,7 +3070,7 @@
"System.Threading.Tasks/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-KlMDBDsVbQ/dfjAKi23D1QMSDRE4SmlEXatGsgBmDXZ1dqpnLdJOe/NVyc9Dt2T6Adgo6pBJSucmn/QTj6JWdA==",
"sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==",
"path": "system.threading.tasks/4.3.0",
"hashPath": "system.threading.tasks.4.3.0.nupkg.sha512"
},
......@@ -3098,7 +3098,7 @@
"System.Threading.Timer/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-N9AzP8dUwPxMhg2jh33pV8bOVms5HkXoTWsm/mnfRYPOy842yZkaqTFyz1qEDqneksg8qzSEA2JPnZNqIe68Kg==",
"sha512": "sha512-Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==",
"path": "system.threading.timer/4.3.0",
"hashPath": "system.threading.timer.4.3.0.nupkg.sha512"
},
......@@ -3112,14 +3112,14 @@
"System.Xml.ReaderWriter/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-e9D+WUChqF7SZDcRYiH+NNxXeP5eTKbbvwhnAhs4s5mLcXvGOVR7IynsDxI87hzUwihj6xMx23S4SiLLOUL7kg==",
"sha512": "sha512-GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==",
"path": "system.xml.readerwriter/4.3.0",
"hashPath": "system.xml.readerwriter.4.3.0.nupkg.sha512"
},
"System.Xml.XDocument/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-gUE7UkiymHpxEDSWJ2oiycH43yvGk51NHzbY7Ub7ZIEFPh6oi5HjWatH4bJc2IeBQhOeRZ/akadnr0YEXH6wZA==",
"sha512": "sha512-5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==",
"path": "system.xml.xdocument/4.3.0",
"hashPath": "system.xml.xdocument.4.3.0.nupkg.sha512"
},
......@@ -3133,7 +3133,7 @@
"System.Xml.XPath/4.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-7lq2TCqxJ+6eIDZOc7HBVN6TcX4HzuO11O0wuS7XZprAMvxVCqTZQoDArlEglmo2yvTIDKtGYQ3ByIIDZx7bIQ==",
"sha512": "sha512-UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==",
"path": "system.xml.xpath/4.0.1",
"hashPath": "system.xml.xpath.4.0.1.nupkg.sha512"
},
......
......@@ -7,7 +7,7 @@ using Edu.Model.ViewModel.System;
namespace Edu.Repository.System
{
public class RB_Msg_BaseRepository:BaseRepository<RB_Msg_Base>
public class RB_Msg_BaseRepository : BaseRepository<RB_Msg_Base>
{
/// <summary>
/// 表名称
......@@ -22,7 +22,7 @@ namespace Edu.Repository.System
public List<RB_Msg_Base_Function_ViewModel> GetListRepository(RB_Msg_Base_Function_ViewModel query)
{
StringBuilder builder = new StringBuilder();
builder.Append($" SELECT * FROM {TableName} ");
builder.Append($" SELECT * FROM {TableName} where Status=0 ");
if (query != null)
{
if (query.Group_Id > 0)
......@@ -31,9 +31,9 @@ namespace Edu.Repository.System
}
if (query.StoreType > 0)
{
builder.Append($" AND {nameof(RB_Msg_Base.StoreType)}={query.StoreType}");
builder.Append($" AND {nameof(RB_Msg_Base.StoreType)}={(int)query.StoreType}");
}
}
return Get<RB_Msg_Base_Function_ViewModel>(builder.ToString()).ToList();
......@@ -48,7 +48,7 @@ namespace Edu.Repository.System
public List<RB_Msg_Base_Function_ViewModel> GetPageListRepository(int pageIndex, int pageSize, out long rowsCount, RB_Msg_Base_Function_ViewModel query)
{
StringBuilder builder = new StringBuilder();
builder.Append($" SELECT * FROM {TableName} where 1=1 ");
builder.Append($" SELECT * FROM {TableName} where Status=0 ");
if (query != null)
{
if (query.Group_Id > 0)
......@@ -57,7 +57,7 @@ namespace Edu.Repository.System
}
if (query.StoreType > 0)
{
builder.Append($" AND {nameof(RB_Msg_Base.StoreType)}={query.StoreType}");
builder.Append($" AND {nameof(RB_Msg_Base.StoreType)}={(int)query.StoreType}");
}
}
......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Edu.Model.Entity.System;
using Edu.Model.ViewModel.System;
namespace Edu.Repository.System
{
/// <summary>
/// 短信模板仓储层
/// </summary>
public class RB_Msg_BaseTemplateRepository : BaseRepository<RB_Msg_BaseTemplate>
{
/// <summary>
/// 表名称
/// </summary>
public string TableName { get { return nameof(RB_Msg_BaseTemplate); } }
/// <summary>
/// 获取短信模板配置信息
/// </summary>
/// <param name="query">查询条件</param>
/// <returns></returns>
public List<RB_Msg_BaseTemplate_ViewModel> GetListRepository(RB_Msg_BaseTemplate_ViewModel query)
{
StringBuilder builder = new StringBuilder();
builder.Append($" SELECT * FROM {TableName} where 1=1 ");
if (query != null)
{
if (query.Group_Id > 0)
{
builder.Append($" AND {nameof(RB_Msg_BaseTemplate.Group_Id)}={query.Group_Id}");
}
if (query.StoreType > 0)
{
builder.Append($" AND {nameof(RB_Msg_BaseTemplate.StoreType)}={(int)query.StoreType}");
}
if (query.BaseTemplateType > 0)
{
builder.Append($" AND {nameof(RB_Msg_BaseTemplate.BaseTemplateType)}={(int)query.BaseTemplateType}");
}
}
return Get<RB_Msg_BaseTemplate_ViewModel>(builder.ToString()).ToList();
}
/// <summary>
/// 获取短信模板配置信息
/// </summary>
/// <param name="query">查询条件</param>
/// <returns></returns>
public List<RB_Msg_BaseTemplate_ViewModel> GetPageListRepository(int pageIndex, int pageSize, out long rowsCount, RB_Msg_BaseTemplate_ViewModel query)
{
StringBuilder builder = new StringBuilder();
builder.Append($" SELECT * FROM {TableName} where 1=1 ");
if (query != null)
{
if (query.Group_Id > 0)
{
builder.Append($" AND {nameof(RB_Msg_BaseTemplate.Group_Id)}={query.Group_Id}");
}
if (query.StoreType > 0)
{
builder.Append($" AND {nameof(RB_Msg_BaseTemplate.StoreType)}={(int)query.StoreType}");
}
if (query.BaseTemplateType > 0)
{
builder.Append($" AND {nameof(RB_Msg_BaseTemplate.BaseTemplateType)}={(int)query.BaseTemplateType}");
}
}
return GetPage<RB_Msg_BaseTemplate_ViewModel>(pageIndex, pageSize, out rowsCount, builder.ToString()).ToList();
}
}
}
......@@ -21,7 +21,7 @@ namespace Edu.Repository.System
public List<RB_Msg_Log> GetListRepository(RB_Msg_Log query)
{
StringBuilder builder = new StringBuilder();
builder.Append($" SELECT * FROM {TableName} ");
builder.Append($" SELECT * FROM {TableName} where 1=1 ");
if (query != null)
{
if (query.Group_Id > 0)
......@@ -32,7 +32,7 @@ namespace Edu.Repository.System
{
builder.Append($" AND {nameof(RB_Msg_Log.School_Id)}={query.School_Id}");
}
if (query.SendStatus > 0)
if (query.SendStatus.HasValue&& query.SendStatus > 0)
{
builder.Append($" AND {nameof(RB_Msg_Log.SendStatus)}={(int)query.SendStatus}");
}
......@@ -62,7 +62,7 @@ namespace Edu.Repository.System
builder.Append($" AND {nameof(RB_Msg_Log.School_Id)}={query.School_Id}");
}
if (query.SendStatus > 0)
if (query.SendStatus.HasValue && query.SendStatus > 0)
{
builder.Append($" AND {nameof(RB_Msg_Log.SendStatus)}={(int)query.SendStatus}");
}
......
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Folder Include="Oss\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Aliyun.Net.SDK.Core" Version="1.0.3" />
<PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.10.0" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
</ItemGroup>
<ItemGroup>
<Reference Include="aliyun-net-sdk-core">
<HintPath>lib\aliyun-net-sdk-core.dll</HintPath>
</Reference>
<Reference Include="aliyun-net-sdk-dysmsapi">
<HintPath>lib\aliyun-net-sdk-dysmsapi.dll</HintPath>
</Reference>
</ItemGroup>
</Project>
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Threading;
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Exceptions;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.Dysmsapi.Model.V20170525;
namespace Edu.ThirdCore.Message
{
/// <summary>
/// 消息发送中心
/// </summary>
public class MessageCore
{
private static bool IsFinish = true;
public static void Init()
{
while (QueueHelper.Queue.Count == 0 || !IsFinish)
{
Thread.Sleep(1000);
};
IsFinish = false;
string content = QueueHelper.Queue.Dequeue() as string;
Run(content);
Init();
}
public static void Run(string content)
{
try
{
JObject obj = JObject.Parse(content);
switch (obj["cmd"].ToString().ToLower())
{
case "sms":
SendSMS(obj);
break;
default:
break;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
IsFinish = true;
}
private static void SendSMS(JObject obj)
{
SendSmsRequest request = new SendSmsRequest();
try
{
String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
String domain = obj["Domain"].ToString(); //短信API产品域名(接口地址固定,无需修改)
String accessKeyId = obj["AccessKeyId"].ToString();
String accessKeySecret = obj["AccessKeySecret"].ToString();
IClientProfile profile = DefaultProfile.GetProfile(obj["RegionId"].ToString(), accessKeyId, accessKeySecret);
DefaultProfile.AddEndpoint(obj["RegionId"].ToString(), obj["RegionId"].ToString(), product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
request.PhoneNumbers = obj["phoneNumber"].ToString();
request.SignName = obj["SignName"].ToString(); //aliSms["signName"].ToString();
//必填:短信模板-可在短信控制台中找到
request.TemplateCode = obj["templateCode"].ToString();
//可选:模板中的变量替换JSON串,如模板内容为"您的验证码为${code}"时,此处的值为
request.TemplateParam = obj["templateParam"].ToString();
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
request.OutId = obj["OutId"].ToString();
//请求失败这里会抛ClientException异常
SendSmsResponse sendSmsResponse = acsClient.GetAcsResponse(request);
if (!sendSmsResponse.Code.Equals("OK"))
{
var data = new { phoneNumber = obj["phoneNumber"].ToString(), templateParam = obj["templateParam"].ToString(), code = sendSmsResponse.Code, message = sendSmsResponse.Message };
//return data;
}
var datatst = new { phoneNumber = obj["phoneNumber"].ToString(), templateParam = obj["templateParam"].ToString(), code = sendSmsResponse.Code, message = sendSmsResponse.Message };
//return datatst;
// Mall.Common.Plugin.LogHelper.WriteInfo(JsonConvert.SerializeObject(datatst));
}
catch (Aliyun.Acs.Core.Exceptions.ServerException ex)
{
var data = new { phoneNumber = obj["phoneNumber"].ToString(), templateParam = obj["templateParam"].ToString(), code = "NO", message = ex.ToString() };
// return data;
//LogHelper.Write(ex, "SendSMS1");
}
catch (ClientException ex)
{
var data = new { phoneNumber = obj["phoneNumber"].ToString(), templateParam = obj["templateParam"].ToString(), code = "NO", message = ex.ToString() };
// return data;
// LogHelper.Write(ex, "SendSMS2");
}
}
/// <summary>
/// java调用
/// </summary>
/// <param name="obj"></param>
public static string SendSMSToJava(string phoneNumber, string templateCode, string templateParam, string SignName, string Domain, string AccessKeyId, string AccessKeySecret, string RegionId)
{
SendSmsRequest request = new SendSmsRequest();
try
{
//JObject aliSms = Config.AliSms;
//String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
//String domain = "dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改)
//String accessKeyId = aliSms["accessKeyId"].ToString();
//String accessKeySecret = aliSms["accessKeySecret"].ToString();
//IClientProfile profile = DefaultProfile.GetProfile("cn-hangzhou", accessKeyId, accessKeySecret);
//DefaultProfile.AddEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
String domain = Domain; //短信API产品域名(接口地址固定,无需修改)
String accessKeyId = AccessKeyId;
String accessKeySecret = AccessKeySecret;
IClientProfile profile = DefaultProfile.GetProfile(RegionId, accessKeyId, accessKeySecret);
DefaultProfile.AddEndpoint(RegionId, RegionId, product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
request.PhoneNumbers = phoneNumber;
request.SignName = SignName;// aliSms["signName"].ToString();
//必填:短信模板-可在短信控制台中找到
request.TemplateCode = templateCode;
//可选:模板中的变量替换JSON串,如模板内容为"您的验证码为${code}"时,此处的值为
request.TemplateParam = templateParam;
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
request.OutId = "";
//请求失败这里会抛ClientException异常
SendSmsResponse sendSmsResponse = acsClient.GetAcsResponse(request);
if (!sendSmsResponse.Code.Equals("OK"))
{
var data = new { phoneNumber, templateParam, code = sendSmsResponse.Code, message = sendSmsResponse.Message };
return "";
}
else
{
return sendSmsResponse.BizId;
}
}
catch (Aliyun.Acs.Core.Exceptions.ServerException ex)
{
//LogHelper.Write(ex, "SendSMSToJava1");
}
catch (ClientException ex)
{
//LogHelper.Write(ex, "SendSMSToJava2");
}
return "";
}
/// <summary>
/// 获取短信发送状态
/// </summary>
/// <param name="phoneNumber"></param>
/// <param name="SendDate"></param>
/// <param name="BizId"></param>
/// <returns></returns>
public static string SendSMSStatus(string phoneNumber, string SendDate, string BizId, string Domain, string AccessKeyId, string AccessKeySecret, string RegionId)
{
// JObject aliSms = Config.AliSms;
String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
String domain = Domain;// "dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改)
String accessKeyId = AccessKeyId;// aliSms["accessKeyId"].ToString();
String accessKeySecret = AccessKeySecret; //aliSms["accessKeySecret"].ToString();
IClientProfile profile = DefaultProfile.GetProfile(RegionId, accessKeyId, accessKeySecret);
DefaultProfile.AddEndpoint(RegionId, RegionId, product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//拼接参数 返回url
string url = $@"https://{domain}/?AccessKeyId={accessKeyId}&Action=QuerySendDetails&CurrentPage=1&Format=JSON&PageSize=12&PhoneNumber={phoneNumber}&RegionId=cn-hangzhou&SecureTransport=true&SendDate={SendDate}&BizId={BizId}&SignatureMethod=HMAC-SHA1&SignatureNonce=46edc0b6cc74e437aa0ba1703c71a99b&SignatureVersion=1.0&SourceIp=171.88.98.6&Timestamp=2019-09-25T02%3A12%3A35Z&Version=2017-05-25&Signature=Uvqz3E13092wPxNYUt3ytDojV50%3D";
return url;
}
/// <summary>
/// 获取短信发送状态
/// </summary>
/// <param name="phoneNumber"></param>
/// <param name="SendDate"></param>
/// <param name="BizId"></param>
/// <returns></returns>
public static QuerySendDetailsResponse QuerySendDetails(string phoneNumber, string SendDate, string BizId, string Domain, string AccessKeyId, string AccessKeySecret, string RegionId)
{
String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
// 初始化acsClient,暂不支持region化
IClientProfile profile = DefaultProfile.GetProfile(RegionId, AccessKeyId, AccessKeySecret);
DefaultProfile.AddEndpoint(RegionId, RegionId, product, Domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
// 组装请求对象
QuerySendDetailsRequest request = new QuerySendDetailsRequest
{
PhoneNumber = phoneNumber,
BizId = BizId,
SendDate = SendDate,
PageSize = 10,
CurrentPage = 1
};
QuerySendDetailsResponse querySendDetailsResponse = null;
try
{
// 请求失败这里会抛ClientException异常
querySendDetailsResponse = acsClient.GetAcsResponse(request);
}
catch (ServerException e)
{
querySendDetailsResponse = new QuerySendDetailsResponse();
// LogHelper.LogException<ServerException>(e.ErrorMessage);
}
catch (ClientException e)
{
querySendDetailsResponse = new QuerySendDetailsResponse();
// LogHelper.LogException<ClientException>(e.ErrorMessage);
}
return querySendDetailsResponse;
}
/// <summary>
/// 获取短信状态
/// </summary>
/// <param name="phoneNumber"></param>
/// <param name="SendDate"></param>
/// <param name="BizId"></param>
/// <returns></returns>
public static string SendSMSStatus2(string phoneNumber, string SendDate, string BizId, string Domain, string AccessKeyId, string AccessKeySecret, string RegionId)
{
//JObject aliSms = Config.AliSms;
String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
String domain = Domain;//"dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改)
String accessKeyId = AccessKeyId;//aliSms["accessKeyId"].ToString();
String accessKeySecret = AccessKeySecret; //aliSms["accessKeySecret"].ToString();
IClientProfile profile = DefaultProfile.GetProfile(RegionId, accessKeyId, accessKeySecret);
DefaultProfile.AddEndpoint(RegionId, RegionId, product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
QuerySendDetailsRequest request = new QuerySendDetailsRequest();
request.CurrentPage = 1;
request.PageSize = 12;
request.PhoneNumber = phoneNumber;
request.SendDate = SendDate;
request.BizId = BizId;
//请求失败这里会抛ClientException异常
var robj = acsClient.DoAction(request);
if (robj.Status == 200)
{
System.IO.Stream stream = new System.IO.MemoryStream(robj.Content);
var reader = new System.IO.StreamReader(stream, System.Text.Encoding.UTF8);
string rrrr = reader.ReadToEnd();
return rrrr;
}
return "";
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Threading;
namespace Edu.ThirdCore.Message
{
/// <summary>
/// 消息队列
/// </summary>
public class QueueHelper
{
/// <summary>
/// 任务队列
/// </summary>
public static Queue<string> Queue = new Queue<string>();
/// <summary>
/// 线程锁
/// </summary>
private static object locker = new object();
/// <summary>
/// 添加消息到队列
/// </summary>
/// <param name="task"></param>
public static void EnqueueTask(string task)
{
lock (locker)
{
//同样的任务,不同时加入
IList<string> tasks = Queue.ToList();
if (tasks.Count(p => p == task) == 0)
{
Queue.Enqueue(task);
Monitor.PulseAll(locker);
}
}
}
}
}

using System;
using System.Collections.Generic;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace Edu.ThirdCore.Message
{
/// <summary>
/// 短信消息
/// </summary>
public class SMSService
{
/// <summary>
/// 发送证码
/// </summary>
/// <param name="phoneNumber">电话号码</param>
/// <param name="code">验证码</param>
public static void SendCode(string phoneNumber, string code, string templateCode, string SignName, string Domain, string AccessKeyId, string AccessKeySecret, string RegionId, string OutId)
{
JObject obj = new JObject();
obj["cmd"] = "sms";
obj["phoneNumber"] = phoneNumber;
obj["templateCode"] = templateCode;
obj["SignName"] = SignName;
obj["Domain"] = Domain;
obj["AccessKeyId"] = AccessKeyId;
obj["AccessKeySecret"] = AccessKeySecret;
obj["RegionId"] = RegionId;
var TemplateParam = new { code = code };
obj["OutId"] = OutId;
obj["templateParam"] = JsonConvert.SerializeObject(TemplateParam);
QueueHelper.EnqueueTask(JsonConvert.SerializeObject(obj));
}
/// <summary>
/// 发送短信通知
/// </summary>
/// <param name="phoneNumber"></param>
/// <param name="content"></param>
/// <param name="templateCode"></param>
public static void SendMsg(string phoneNumber, string content, string templateCode, string SignName, string Domain, string AccessKeyId, string AccessKeySecret, string RegionId, string OutId)
{
JObject obj = new JObject();
obj["cmd"] = "sms";
obj["phoneNumber"] = phoneNumber;
obj["templateCode"] = templateCode;
obj["SignName"] = SignName;
obj["Domain"] = Domain;
obj["AccessKeyId"] = AccessKeyId;
obj["RegionId"] = RegionId;
obj["AccessKeySecret"] = AccessKeySecret;
var TemplateParam = new { content };
obj["OutId"] = OutId;
obj["templateParam"] = JsonConvert.SerializeObject(TemplateParam);
//LogHelper.WriteInfo("发送短信信息");
QueueHelper.EnqueueTask(JsonConvert.SerializeObject(obj));
}
/// <summary>
/// 发送短信通知
/// </summary>
/// <param name="phoneNumber"></param>
/// <param name="templateParam">通知参数</param>
/// <param name="templateCode"></param>
public static void SendMsg(string phoneNumber, object templateParam, string templateCode, string SignName, string Domain, string AccessKeyId, string AccessKeySecret, string RegionId,string OutId)
{
JObject obj = new JObject();
obj["cmd"] = "sms";
obj["phoneNumber"] = phoneNumber;
obj["templateCode"] = templateCode;
var TemplateParam = templateParam;
obj["SignName"] = SignName;
obj["Domain"] = Domain;
obj["RegionId"] = RegionId;
obj["AccessKeyId"] = AccessKeyId;
obj["AccessKeySecret"] = AccessKeySecret;
obj["OutId"] = OutId;
obj["templateParam"] = JsonConvert.SerializeObject(TemplateParam);
QueueHelper.EnqueueTask(JsonConvert.SerializeObject(obj));
}
}
}
......@@ -28,7 +28,7 @@ namespace Edu.WebApi.Controllers.Public
/// </summary>
private readonly MsgLogModule msgLogModule = new MsgLogModule();
#region 短信记录信息
/// <summary>
/// 获取短信记录分页列表
/// </summary>
......@@ -47,6 +47,18 @@ namespace Edu.WebApi.Controllers.Public
}
/// <summary>
/// 获取触发事件枚举
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult GetMsgSendStatusEnumList()
{
var list = EnumHelper.EnumToList(typeof(Common.Enum.System.MsgSendStatusEnum));
return ApiResult.Success("", list);
}
#endregion
#region 短信配置
......@@ -71,6 +83,7 @@ namespace Edu.WebApi.Controllers.Public
}
pageModel.Count = rowsCount;
pageModel.PageData = list;
return ApiResult.Success(data: pageModel);
}
......@@ -106,13 +119,14 @@ namespace Edu.WebApi.Controllers.Public
var model = new RB_Msg_Base();
model.CreateDate = DateTime.Now;
model.CreateBy = UserInfo.Id;
model.Group_Id = this.UserInfo.Group_Id;
model.Group_Id = base.UserInfo.Group_Id;
model.ID = extModel.ID;
model.StoreType = extModel.StoreType;
if (extModel.MsgBase != null)
{
model.MsgConfigure = Common.Plugin.JsonHelper.Serialize(extModel.MsgBase);
}
bool flag = msgLogModule.SetMsgBaseModule(extModel);
bool flag = msgLogModule.SetMsgBaseModule(model);
return flag ? ApiResult.Success() : ApiResult.Failed();
}
......@@ -145,5 +159,153 @@ namespace Edu.WebApi.Controllers.Public
}
#endregion
#region 短信模板配置
/// <summary>
/// 获取触发事件枚举
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult GetBaseTemplateTypeEnumList()
{
var list = EnumHelper.EnumToList(typeof(Common.Enum.System.BaseTemplateTypeEnum));
return ApiResult.Success("", list);
}
/// <summary>
/// 获取短信模板配置页列表
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult GetMsgBaseTemplatePageList()
{
var pageModel = Common.Plugin.JsonHelper.DeserializeObject<ResultPageModel>(RequestParm.Msg.ToString());
var query = Common.Plugin.JsonHelper.DeserializeObject<RB_Msg_BaseTemplate_ViewModel>(RequestParm.Msg.ToString());
query.Group_Id = base.UserInfo.Group_Id;
var list = msgLogModule.GetMsgBaseTemplatePageListModule(pageModel.PageIndex, pageModel.PageSize, out long rowsCount, query);
foreach (var item in list)
{
item.BaseTemplateTypeStr = EnumHelper.ToName(item.BaseTemplateType);
}
pageModel.Count = rowsCount;
pageModel.PageData = list;
return ApiResult.Success(data: pageModel);
}
/// <summary>
/// 获取短信模板配置列表
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult GetMsgBaseTemplateList()
{
var query = Common.Plugin.JsonHelper.DeserializeObject<RB_Msg_BaseTemplate_ViewModel>(RequestParm.Msg.ToString());
query.Group_Id = base.UserInfo.Group_Id;
var list = msgLogModule.GetMsgBaseTemplateModule(query);
return ApiResult.Success(data: list);
}
/// <summary>
/// 添加修改短信模板配置
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult SetMsgBaseTemplate()
{
var extModel = Common.Plugin.JsonHelper.DeserializeObject<RB_Msg_BaseTemplate_ViewModel>(RequestParm.Msg.ToString());
extModel.CreateDate = DateTime.Now;
extModel.CreateBy = UserInfo.Id;
extModel.Group_Id = base.UserInfo.Group_Id;
bool flag = msgLogModule.SetMsgBaseTemplateModule(extModel);
return flag ? ApiResult.Success() : ApiResult.Failed();
}
/// <summary>
/// 获取短信模板配置实体
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult GetMsgBaseTemplate()
{
var ID = base.ParmJObj.GetInt("ID", 0);
var extModel = msgLogModule.GetMsgBaseTemplateModule(ID);
return ApiResult.Success(data: extModel);
}
/// <summary>
/// 删除短信模板配置
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult RemoveMsgBaseTemplate()
{
var ClassId = base.ParmJObj.GetInt("ID", 0);
var flag = msgLogModule.RemoveMsgBaseTemplateModule(ClassId);
return flag ? ApiResult.Success() : ApiResult.Failed();
}
#endregion
#region 发短信测试
[HttpPost]
public ApiResult TestSendMsg()
{
object PhoneMessage = new
{
OrderNo = "1111111111111",
Name = "李三",
Mobile = "13551132418",
TripDate = "2020-11-30",//item.TripSTime.Value.ToString("yyyy-MM-dd HH:mm") + " " + ((item.UseDay ?? 0) == Convert.ToDecimal(0.5) ? "半" : Convert.ToInt32(item.UseDay ?? 0).ToString()) + "日",
Address = "阳光新业2号楼",
Number = "李四"
};
//新增短信记录信息
var msgLogModel = new RB_Msg_Log
{
Group_Id = 100000,
School_Id = 1,
Student_Id = 2,
CreateDate = DateTime.Now,
SendStatus = Common.Enum.System.MsgSendStatusEnum.InReceipt,
CreateBy = 0,
CreateByName = "系统自动发送",
SendContent = "测试内容",
ReceiverName = "张学生",
ReceiverPhone = "13551132417"
};
msgLogModule.SendMsg(PhoneMessage, Common.Enum.System.BaseTemplateTypeEnum.OrderSuccess, msgLogModel);
// ThirdCore.Message.SMSService.SendMsg("13551132417", PhoneMessage, "SMS_201722097", "印象之旅", "dysmsapi.aliyuncs.com", "LTAIwE7l9dImZSa3", "j47Ajn0d0WzUCIX8Biyj3P2r8QDltI", "cn-hangzhou");
return ApiResult.Success("");
}
[HttpPost]
public ApiResult TestUpdateSendMsg()
{
msgLogModule.UpdateMsgSendStatus();
return ApiResult.Success("");
}
#endregion
}
}
......@@ -366,8 +366,17 @@ namespace Edu.WebApi.Controllers.Public
[HttpPost]
public ApiResult GetStoreTypeEnumList()
{
int type = base.ParmJObj.GetInt("ID", 0);
var list = EnumHelper.EnumToList(typeof(Common.Enum.Public.StoreTypeEnum));
return ApiResult.Success("", list);
if (type == 1)
{
return ApiResult.Success("", list.Where(x => x.Id != 3));
}
else
{
return ApiResult.Success("", list);
}
}
/// <summary>
......
......@@ -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
......@@ -31,6 +31,7 @@
<ProjectReference Include="..\Edu.Module.System\Edu.Module.System.csproj" />
<ProjectReference Include="..\Edu.Module.User\Edu.Module.User.csproj" />
<ProjectReference Include="..\Edu.Repository\Edu.Repository.csproj" />
<ProjectReference Include="..\Edu.ThirdCore\Edu.ThirdCore.csproj" />
</ItemGroup>
</Project>
using System.Collections.Generic;
using System.Text.Encodings.Web;
using System.Text.Unicode;
using System.Threading.Tasks;
using Edu.ThirdCore.Message;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
......@@ -50,7 +52,7 @@ namespace Edu.WebApi
};
services.AddCors(options => options.AddPolicy("AllowCors", policy => policy.AllowAnyHeader().AllowAnyMethod().AllowCredentials().WithOrigins(corsArray.ToArray())));
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime appLifetime)
......@@ -67,7 +69,9 @@ namespace Edu.WebApi
app.UseCors("AllowCors");
app.UseAuthorization();
//启动信息发送
// Task.Run(() => MessageCore.Init());
Task.Run(() => MessageCore.Init());
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
......
{
"ConnectionStrings": {
"DefaultConnection": "server=192.168.1.214;user id=reborn;password=Reborn@2018;database=reborn_edu;CharSet=utf8mb4; Convert Zero Datetime=true; ",
"DefaultConnectionPName": "MySql.Data.MySqlClient"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"JwtSecretKey": "@VIITTOREBORN*2018",
"JwtExpirTime": 2592000,
"AllowedHosts": "*",
"OpenValidation": "False",
"UploadSiteUrl": "http://192.168.1.214:8120",
"ViewFileSiteUrl": "https://viitto-1301420277.cos.ap-chengdu.myqcloud.com",
"Mongo": "mongodb://47.96.25.130:27017",
"MongoDBName": "Edu",
"RabbitMqConfig": {
"HostName": "47.96.25.130",
"VirtualHost": "/",
"Port": 5672,
"UserName": "guest",
"Password": "viitto2019"
},
"RedisSetting": {
"RedisServer": "47.96.23.199",
"RedisPort": "6379",
"RedisPwd": "Viitto2018"
},
"VirtualDirectory": "WebFile",
//Ƿϻ
"IsOnline": false
"ConnectionStrings": {
"DefaultConnection": "server=192.168.1.214;user id=reborn;password=Reborn@2018;database=reborn_edu;CharSet=utf8mb4; Convert Zero Datetime=true; ",
"DefaultConnectionPName": "MySql.Data.MySqlClient"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"JwtSecretKey": "@VIITTOREBORN*2018",
"JwtExpirTime": 2592000,
"IsSendMsg": 1,
"AllowedHosts": "*",
"OpenValidation": "False",
"UploadSiteUrl": "http://192.168.1.214:8120",
"ViewFileSiteUrl": "https://viitto-1301420277.cos.ap-chengdu.myqcloud.com",
"Mongo": "mongodb://47.96.25.130:27017",
"MongoDBName": "Edu",
"RabbitMqConfig": {
"HostName": "47.96.25.130",
"VirtualHost": "/",
"Port": 5672,
"UserName": "guest",
"Password": "viitto2019"
},
"RedisSetting": {
"RedisServer": "47.96.23.199",
"RedisPort": "6379",
"RedisPwd": "Viitto2018"
},
"VirtualDirectory": "WebFile",
//Ƿϻ
"IsOnline": false
}
\ No newline at end of file
......@@ -37,7 +37,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Edu.Module.User", "Edu.Modu
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Edu.Module.Public", "Edu.Module.Public\Edu.Module.Public.csproj", "{8E34CE2D-AAF3-481C-A5E3-5AECC8F7F1B5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Edu.Module.Log", "Edu.Module.Log\Edu.Module.Log.csproj", "{809E4C87-97F6-4DCB-9232-9C70ECEF2655}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Edu.Module.Log", "Edu.Module.Log\Edu.Module.Log.csproj", "{809E4C87-97F6-4DCB-9232-9C70ECEF2655}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Edu.ThirdCore", "Edu.ThirdCore\Edu.ThirdCore.csproj", "{5F76907A-7181-4FC5-B224-52CDD5B90359}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
......@@ -93,6 +95,10 @@ Global
{809E4C87-97F6-4DCB-9232-9C70ECEF2655}.Debug|Any CPU.Build.0 = Debug|Any CPU
{809E4C87-97F6-4DCB-9232-9C70ECEF2655}.Release|Any CPU.ActiveCfg = Release|Any CPU
{809E4C87-97F6-4DCB-9232-9C70ECEF2655}.Release|Any CPU.Build.0 = Release|Any CPU
{5F76907A-7181-4FC5-B224-52CDD5B90359}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5F76907A-7181-4FC5-B224-52CDD5B90359}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5F76907A-7181-4FC5-B224-52CDD5B90359}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5F76907A-7181-4FC5-B224-52CDD5B90359}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
......@@ -109,6 +115,7 @@ Global
{AD259CCC-048A-4F65-A368-91B8B4A9F200} = {7AC0A4EC-3215-4FF2-96DC-DE8325ED6915}
{8E34CE2D-AAF3-481C-A5E3-5AECC8F7F1B5} = {7AC0A4EC-3215-4FF2-96DC-DE8325ED6915}
{809E4C87-97F6-4DCB-9232-9C70ECEF2655} = {7AC0A4EC-3215-4FF2-96DC-DE8325ED6915}
{5F76907A-7181-4FC5-B224-52CDD5B90359} = {52C9E4CB-A475-4232-95A3-4508B6592AC7}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8763B446-FAB1-46BF-9743-F2628533241B}
......
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