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>
This diff is collapsed.
This diff is collapsed.
......@@ -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>
This diff is collapsed.
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