Commit 7a4404c1 authored by liudong1993's avatar liudong1993

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

parents cf5f44d8 752e5c15
......@@ -37,5 +37,11 @@ namespace Edu.Cache
/// </summary>
public static string Student_Frozen_Key = "Edu_Student_Frozen_";
/// <summary>
/// 微信支付回调key
/// </summary>
public static string WeChatPay_Callback_Key = "WeChatPay_Callback_Key_";
}
}
......@@ -71,12 +71,32 @@ namespace Edu.Cache.User
{
TimeSpan ts = GetExpirTime(JwtExpirTime);
redis.StringSet(cacheKey, Data, ts);
}
catch (Exception)
{
}
}
/// <summary>
/// 获取缓存
/// </summary>
/// <param name="cacheKey"></param>
/// <param name="Data"></param>
/// <param name="JwtExpirTime"></param>
public static object Get(string cacheKey, object Data, int JwtExpirTime)
{
try
{
object info = redis.StringGet<object>(cacheKey);
return info;
}
catch (Exception)
{
return "";
}
}
/// <summary>
/// 账号仓储层对象
/// </summary>
......@@ -88,7 +108,7 @@ namespace Edu.Cache.User
/// <param name="Id">账号Id</param>
/// <param name="apiRequestFromEnum">请求来源</param>
/// <returns></returns>
public static UserInfo GetUserLoginInfo(object Id, ApiRequestFromEnum apiRequestFromEnum= ApiRequestFromEnum.WebAdmin)
public static UserInfo GetUserLoginInfo(object Id, ApiRequestFromEnum apiRequestFromEnum = ApiRequestFromEnum.WebAdmin)
{
UserInfo userInfo = null;
if (Id != null)
......@@ -100,7 +120,7 @@ namespace Edu.Cache.User
}
catch (Exception ex)
{
Common.Plugin.LogHelper.Write(ex, "GetUserLoginInfo");
Common.Plugin.LogHelper.Write(ex, "GetUserLoginInfo");
}
if (userInfo == null)
{
......
......@@ -461,6 +461,21 @@ namespace Edu.Common
}
}
/// <summary>
/// 连续缺课多少课时
/// </summary>
public static int AbsentHours
{
get
{
int.TryParse(ReadConfigKey("AbsentHours"), out int AbsentHours);
if (AbsentHours == 0)
{
AbsentHours = 12;
}
return AbsentHours;
}
}
/// <summary>
/// 消息推送AppId
......
......@@ -47,6 +47,11 @@ namespace Edu.Common.Enum.Course
/// 耗材出库
/// </summary>
[EnumField("耗材出库")]
SuppliesStockOut = 7
SuppliesStockOut = 7,
/// <summary>
/// 学费收入
/// </summary>
[EnumField("学费收入")]
Tuition = 8
}
}
......@@ -9,7 +9,7 @@ namespace Edu.Common.WeChatPayAPIv3.Model.WxPayCallback
/// <summary>
/// 返回状态码,错误码,SUCCESS为清算机构接收成功,其他错误码为失败。
/// </summary>
public string code { set; get; } = "SUCCESS";
public string code { set; get; } = "FAIL";//"SUCCESS";
/// <summary>
/// 返回信息,如非空,为错误原因。
......
......@@ -20,7 +20,7 @@ namespace Edu.Common.WeChatPayAPIv3.Model
/// 密钥,用商户平台上设置的APIv3密钥【微信商户平台—>账户设置—>API安全—>设置APIv3密钥】,记为key;
/// 官方资料:https://kf.qq.com/faq/180830E36vyQ180830AZFZvu.html
/// </summary>
public static string APIV3Key => "WECHATPAY2-SHA256-RSA2048";
public static string APIV3Key => "8A6453965FB561BC90CC4CB290F26469";
/// <summary>
/// 直连商户的商户号,由微信支付生成并下发。
......
......@@ -79,12 +79,14 @@ namespace Edu.Common.WeChatPayAPIv3
var client = new HttpClient(new WxPayRequestHandler(_mchid, _serialNo, _privateKey));
// var bodyJson = new StringContent(req.ToJson(), Encoding.UTF8, "application/json");
var bodyJson = new StringContent(Common.Plugin.JsonHelper.Serialize(req), Encoding.UTF8, "application/json");
var resp = await client.PostAsync(url, bodyJson);
// 注意!!! 这个resp只是http的结果,需要把接口具体返回的值读取出来,如果接口报错的话,这地方可以看到具体的错误信息,我就是在这里入坑的。
var respStr = await resp.Content.ReadAsStringAsync();
// 如果下单成功,就解析返回的结果,把prepay_id解析出来
// var viewModel = respStr.ToObject<WxPayRespModel>();
Plugin.LogHelper.WriteInfo(respStr);
var viewModel = Common.Plugin.JsonHelper.DeserializeObject<WxPayRespModel>(respStr);
return viewModel;
}
......@@ -99,6 +101,7 @@ namespace Edu.Common.WeChatPayAPIv3
var client = new HttpClient(new WxPayRequestHandler(_mchid, _serialNo, _privateKey));
var resp = await client.GetAsync(url);
var respStr = await resp.Content.ReadAsStringAsync();
Plugin.LogHelper.WriteInfo("查询订单的支付结果信息:"+respStr);
var payModel = Common.Plugin.JsonHelper.DeserializeObject<WxPayStatusRespModel>(respStr);// respStr.ToObject<WxPayStatusRespModel>();
return payModel;
}
......@@ -170,6 +173,7 @@ namespace Edu.Common.WeChatPayAPIv3
var client = new HttpClient(new WxPayRequestHandler(_mchid, _serialNo, _privateKey));
var resp = await client.GetAsync(url);
var respStr = await resp.Content.ReadAsStringAsync();
Plugin.LogHelper.WriteInfo("查询订单的退款结果信息:" + respStr);
var payModel = Common.Plugin.JsonHelper.DeserializeObject<QueryRefundsOrderRespModel>(respStr); //respStr.ToObject<QueryRefundsOrderRespModel>();
return payModel;
}
......
......@@ -5,7 +5,7 @@ using VT.FW.DB;
namespace Edu.Model.Entity.Course
{
/// <summary>
/// 教室管理实体类
/// 班级学员签到实体类
/// </summary>
[Serializable]
[DB(ConnectionName = "DefaultConnection")]
......@@ -78,6 +78,16 @@ namespace Edu.Model.Entity.Course
/// </summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// 当前抵扣课时
/// </summary>
public decimal CurrentDeductionHours { get; set; }
/// <summary>
/// 是否连续缺课12课时
/// </summary>
public int IsAbsentHours { get; set; }
/// <summary>
/// 补课状态(1-正常,2-已处理,3-未处理)
/// </summary>
......
......@@ -71,5 +71,10 @@ namespace Edu.Model.Entity.Course
/// 币种id
/// </summary>
public int CurrencyId { get; set; }
/// <summary>
/// ClientID=74 的时候是学费收款账户id
/// </summary>
public int ClientID { get; set; }
}
}
......@@ -190,5 +190,10 @@ namespace Edu.Model.Entity.Course
/// 补课课时
/// </summary>
public int MakeUpHours { get; set; }
/// <summary>
/// 学生头像
/// </summary>
public string StuIcon { get; set; }
}
}
......@@ -5,7 +5,10 @@ using Edu.Model.Entity.Course;
namespace Edu.Model.ViewModel.Course
{
public class RB_Class_Check_ViewModel: RB_Class_Check
/// <summary>
/// 班级学员签到视图实体类
/// </summary>
public class RB_Class_Check_ViewModel : RB_Class_Check
{
/// <summary>
/// 【查询使用】
......@@ -35,5 +38,69 @@ namespace Edu.Model.ViewModel.Course
/// 学员名称
/// </summary>
public string GuestName { get; set; }
/// <summary>
/// 学员状态
/// </summary>
public int GuestState { get; set; }
/// <summary>
/// 学员状态
/// </summary>
public string GuestStateStr
{
get
{
string str = "";
switch (this.GuestState)
{
case 1: str = "正常"; break;
case 2: str = "退学"; break;
case 3: str = "申请退学中"; break;
case 4: str = "驳回申请"; break;
case 5: str = "停课"; break;
}
return str;
}
}
/// <summary>
/// 班级名称
/// </summary>
public string ClassName { get; set; }
/// <summary>
/// 课程名称
/// </summary>
public string CourseName { get; set; }
/// <summary>
/// 教室名称
/// </summary>
public string RoomName { get; set; }
/// <summary>
/// 老师名称
/// </summary>
public string TeacherName { get; set; }
/// <summary>
/// 处理状态字符串
/// </summary>
public string MakeUpStatusStr
{
get
{
string str = "";
switch (this.MakeUpStatus)
{
case 1:str = "正常";break;
case 2: str = "已处理"; break;
case 3: str = "未处理"; break;
}
return str;
}
}
}
}
......@@ -2,6 +2,7 @@
using Edu.Common.Enum;
using Edu.Common.Enum.Course;
using Edu.Model.CacheModel;
using Edu.Model.Entity.Course;
using Edu.Model.ViewModel.Course;
using Edu.Model.ViewModel.User;
using Edu.Repository.Course;
......@@ -82,11 +83,6 @@ namespace Edu.Module.Course
/// </summary>
private readonly RB_Class_FinanceRepository classFinanceRepository = new RB_Class_FinanceRepository();
/// <summary>
/// 班级签到仓储层对象
/// </summary>
private readonly RB_Class_CheckRepository class_CheckRepository = new RB_Class_CheckRepository();
/// <summary>
/// 课程基础配置
/// </summary>
......@@ -425,7 +421,7 @@ namespace Edu.Module.Course
int CompleteProgress = 0;//进度数
var classModel = classRepository.GetEntity(classId);
//班级完成的总分钟数
var FinishMinutes = class_CheckRepository.GetClassFinishMinutesRepository(classId.ToString())?.FirstOrDefault()?.FinishMinutes ?? 0;
var FinishMinutes = classCheckRepository.GetClassFinishMinutesRepository(classId.ToString())?.FirstOrDefault()?.FinishMinutes ?? 0;
if (FinishMinutes > 0)
{
//基础课时分钟数
......@@ -972,7 +968,7 @@ namespace Edu.Module.Course
{
list.Add(new
{
UserIcon = "",
UserIcon = item.StuIcon,
item.Id,
SexStr = item.Sex == 1 ? "男" : "女",
item.GuestName,
......@@ -1076,6 +1072,18 @@ namespace Edu.Module.Course
return flag;
}
/// <summary>
/// 获取签到记录分页列表
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="rowsCount"></param>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_Class_Check_ViewModel> GetClassCheckPageModule(int pageIndex, int pageSize, out long rowsCount, RB_Class_Check_ViewModel query)
{
return classCheckRepository.GetClassCheckPageRepository(pageIndex, pageSize, out rowsCount, query);
}
/// <summary>
/// 新增签到
......@@ -1088,58 +1096,146 @@ namespace Edu.Module.Course
{
//基础课时分钟数
var BasicMinutes = class_ConfigRepository.GetClassConfigRepository(new RB_Class_Config_ViewModel() { Group_Id = list[0].Group_Id })?.BasicMinutes ?? 45;
var totalMinutes = classCheckRepository.CalcPlanMinutesRepository(new RB_Class_Plan_ViewModel()
{
ClassId = list[0].ClassId,
ClassDate = list[0].ClassDate,
});
//写日志
bool flag = true;
foreach (var item in list)
{
if (flag)
{
var guestModel = order_GuestRepository.GetEntity(item.OrderGuestId);
if (!(guestModel.GuestState == 1 || guestModel.GuestState == 3))
{
item.CurrentDeductionHours = 0;
}
else
{
item.CurrentDeductionHours = totalMinutes / BasicMinutes;
}
if (item.ClassCheckId > 0)
{
flag = classCheckRepository.Update(item);
Dictionary<string, object> fileds = new Dictionary<string, object>()
{
{ nameof(RB_Class_Check_ViewModel.CheckStatus),item.CheckStatus},
{ nameof(RB_Class_Check_ViewModel.StudyNum),item.StudyNum},
{ nameof(RB_Class_Check_ViewModel.CurrentDeductionHours),item.CurrentDeductionHours},
};
List<WhereHelper> wheres = new List<WhereHelper>()
{
new WhereHelper (nameof(RB_Class_Check_ViewModel.ClassCheckId),item.ClassCheckId)
};
flag = classCheckRepository.Update(fileds, wheres);
}
else
{
flag = classCheckRepository.Insert(item) > 0;
item.MakeUpStatus = 1;
var newId = classCheckRepository.Insert(item);
item.ClassCheckId = newId;
flag = newId > 0;
}
if (flag && item.CheckStatus == 1)
{
flag = CalcGuestHoursModule(guestModel, item);
}
}
}
return flag;
}
/// <summary>
/// 计算学员缺课课时
/// </summary>
/// <param name="guestModel"></param>
/// <param name="checkModel"></param>
/// <returns></returns>
public bool CalcGuestHoursModule(RB_Order_Guest guestModel, RB_Class_Check_ViewModel checkModel)
{
bool flag = true;
if (guestModel.GuestState == 1)
{
decimal NoFinishHours = 0;
//获取以前所有签到列表【倒叙】
var checkList = classCheckRepository.GetClassCheckListRepository(new RB_Class_Check_ViewModel()
{
ClassId = checkModel.ClassId,
OrderGuestId = checkModel.OrderGuestId,
EndDate=Common.ConvertHelper.FormatDate(checkModel.ClassDate)
}).OrderByDescending(qitem => qitem.ClassDate).ToList();
for (var i = 0; i < checkList.Count; i++)
{
if ((checkList[i].CheckStatus == 1 )&&(checkList[i].MakeUpStatus == 3|| checkList[i].MakeUpStatus == 1))
{
NoFinishHours += checkList[i].CurrentDeductionHours;
}
if (flag )
else
{
//var guestModel = order_GuestRepository.GetEntity(item.OrderGuestId);
//if (guestModel.GuestState == 1)
//{
// //学员完成课时
// var stuCheckList = class_CheckRepository.GetGuestFinishMinutesRepository(item.OrderGuestId.ToString());
// //学员缺勤课时
// var stuNoCheckList = class_CheckRepository.GetGuestNoFinishMinutesRepository(item.OrderGuestId.ToString());
// //总签到上课分钟数
// var totalFinishMinutes = stuCheckList?.Sum(qitem => qitem.FinishMinutes) ?? 0;
// //缺勤分钟数
// var totalNoFinishMinutes = stuNoCheckList?.Sum(qitem => qitem.FinishMinutes) ?? 0;
// //完成课时数
// var FinishHours = Convert.ToInt32(totalFinishMinutes) / BasicMinutes;
// //缺勤课时
// var NoFinishHours = Convert.ToInt32(totalNoFinishMinutes) / BasicMinutes;
// Dictionary<string, object> fileds = new Dictionary<string, object>()
// {
// {nameof(RB_Order_Guest_ViewModel.CompleteHours),FinishHours },
// {nameof(RB_Order_Guest_ViewModel.MakeUpHours ),NoFinishHours },
// };
// if (NoFinishHours >= 12)
// {
// fileds.Add(nameof(RB_Order_Guest_ViewModel.GuestState), 5);
// }
// List<WhereHelper> wheres = new List<WhereHelper>()
// {
// new WhereHelper (nameof(RB_Order_Guest_ViewModel.Id),item.OrderGuestId),
// };
// flag = order_GuestRepository.Update(fileds, wheres);
//}
break;
}
}
Dictionary<string, object> fileds = new Dictionary<string, object>();
Dictionary<string, object> checkFileds = new Dictionary<string, object>();
//缺勤课时超过12课时更新学员状态为【停课】
if (NoFinishHours >= Common.Config.AbsentHours)
{
fileds.Add(nameof(RB_Order_Guest_ViewModel.GuestState), 5);
checkFileds.Add(nameof(RB_Class_Check_ViewModel.IsAbsentHours), 1);
checkFileds.Add(nameof(RB_Class_Check_ViewModel.MakeUpStatus), 3);
}
if (fileds != null && fileds.Count > 0 && checkFileds != null && checkFileds.Count > 0)
{
List<WhereHelper> wheres = new List<WhereHelper>()
{
new WhereHelper (nameof(RB_Order_Guest_ViewModel.Id),guestModel.Id),
};
flag = order_GuestRepository.Update(fileds, wheres);
List<WhereHelper> checkWheres = new List<WhereHelper>()
{
new WhereHelper (nameof(RB_Class_Check_ViewModel.ClassCheckId),checkModel.ClassCheckId),
};
flag = classCheckRepository.Update(checkFileds, checkWheres);
}
}
return flag;
}
/// <summary>
/// 设置修改学员补课状态
/// </summary>
/// <param name="MakeUpStatus"></param>
/// <param name="ClassCheckId"></param>
/// <param name="GuestId"></param>
/// <returns></returns>
public virtual bool SetMakeUpStatusModule(int MakeUpStatus, int ClassCheckId, int GuestId)
{
bool flag = false;
Dictionary<string, object> fileds = new Dictionary<string, object>()
{
{nameof(RB_Class_Check_ViewModel.MakeUpStatus), MakeUpStatus }
};
List<WhereHelper> checkWheres = new List<WhereHelper>()
{
new WhereHelper (nameof(RB_Class_Check_ViewModel.ClassCheckId),ClassCheckId),
};
flag = classCheckRepository.Update(fileds, checkWheres);
if (MakeUpStatus == 2)
{
Dictionary<string, object> guestFileds = new Dictionary<string, object>()
{
{ nameof(RB_Order_Guest_ViewModel.GuestState), 1 }
};
List<WhereHelper> wheres = new List<WhereHelper>()
{
new WhereHelper (nameof(RB_Order_Guest_ViewModel.Id),GuestId),
};
flag = order_GuestRepository.Update(guestFileds, wheres);
}
return flag;
}
......@@ -1156,7 +1252,6 @@ namespace Edu.Module.Course
return class_PlanRepository.GetClassPlanLogPageListRepository(pageIndex, pageSize, out rowsCount, query);
}
/// <summary>
/// 获取班级上课计划
/// </summary>
......@@ -1180,10 +1275,8 @@ namespace Edu.Module.Course
return classCheckRepository.GetClassCheckListRepository(query);
}
/// <summary>
/// 获取教室列表
/// 获取班级签到列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
......@@ -1192,7 +1285,6 @@ namespace Edu.Module.Course
return classCheckRepository.GetClassCheckList(query);
}
/// <summary>
/// 获取班级上课计划列表
/// </summary>
......@@ -1213,7 +1305,6 @@ namespace Edu.Module.Course
return studentRepository.GetStudentListRepository(query);
}
#region 班级收支信息
/// <summary>
/// 获取班级收支信息列表
......@@ -1591,7 +1682,6 @@ namespace Edu.Module.Course
#endregion
#region 教师上课挂件查询
/// <summary>
/// 获取班级上课时间
......@@ -1613,25 +1703,24 @@ namespace Edu.Module.Course
return class_TimeRepository.GetClassTimeByClassId(ClassId, Group_Id);
}
/// <summary>
/// 获取班级上课时间
/// </summary>
/// <param name="classIds"></param>
/// <returns></returns>
public List<RB_Class_Time_Extend> GetClassTimeByTId(int TId, int Group_Id)
/// <summary>
/// 获取班级上课时间
/// </summary>
/// <param name="classIds"></param>
/// <returns></returns>
public List<RB_Class_Time_Extend> GetClassTimeByTId(int TId, int Group_Id)
{
return class_TimeRepository.GetClassTimeByTId(TId, Group_Id);
}
public int GetNowClassHours(RB_Class_Time_Extend model)
public int GetNowClassHours(RB_Class_Time_Extend model)
{
int classHours = 0;
//班级完成的总分钟数
var FinishMinutes = class_CheckRepository.GetClassFinishMinutesRepository(model.ClassId.ToString())?.FirstOrDefault()?.FinishMinutes ?? 0;
var FinishMinutes = classCheckRepository.GetClassFinishMinutesRepository(model.ClassId.ToString())?.FirstOrDefault()?.FinishMinutes ?? 0;
//基础课时分钟数
var BasicMinutes = class_ConfigRepository.GetClassConfigRepository(new RB_Class_Config_ViewModel() { Group_Id = model.Group_Id })?.BasicMinutes ?? 45;
var nowHours = model.NewEndPlanDateTime.Value.Subtract(model.NewPlanDateTime.Value).TotalSeconds;
if (FinishMinutes > 0)
{
......@@ -1643,7 +1732,6 @@ namespace Edu.Module.Course
classHours = Convert.ToInt32(FinishMinutes / BasicMinutes);
}
return classHours;
}
......@@ -1655,7 +1743,6 @@ namespace Edu.Module.Course
/// <returns></returns>
public bool UpdateTimeSuiPai(string SuiPai, int Id)
{
Dictionary<string, object> fileds = new Dictionary<string, object>()
{
{ nameof(RB_Class_Time_ViewModel.SuiPai),SuiPai},
......@@ -1672,7 +1759,6 @@ namespace Edu.Module.Course
/// <returns></returns>
public bool UpdateTimeClassStatus(int classStatus, int Id)
{
Dictionary<string, object> fileds = new Dictionary<string, object>()
{
{ nameof(RB_Class_Time_ViewModel.ClassStatus),classStatus},
......
......@@ -71,7 +71,10 @@ namespace Edu.Module.Course
/// </summary>
private readonly RB_Online_Trade_DetailRepository OnlineTradeDetailRepository = new RB_Online_Trade_DetailRepository();
/// <summary>
/// 财务配置
/// </summary>
private readonly RB_Finance_ConfigRepository finance_ConfigRepository = new RB_Finance_ConfigRepository();
/// <summary>
/// 获取学员信息
......@@ -324,6 +327,19 @@ namespace Edu.Module.Course
#region 合同订单信息
/// <summary>
/// 获取财务配置列表
/// </summary>
/// <param name="dmodel"></param>
/// <returns></returns>
public List<RB_Finance_Config_ViewModel> GetFinanceConfigList(RB_Finance_Config_ViewModel dmodel)
{
return finance_ConfigRepository.GetList(dmodel);
}
/// <summary>
/// 新增合同的付款记录
/// </summary>
......
......@@ -1525,6 +1525,13 @@ namespace Edu.Module.Course
{
LogContent += ",总课时由【" + gModel.TotalHours + "】修改为【" + dmodel.TotalHours + "】";
}
if (gModel.StuIcon != dmodel.StuIcon)
{
LogContent += ",学生头像由【" + gModel.StuIcon + "】修改为【" + dmodel.StuIcon + "】";
}
gModel.StuIcon = dmodel.StuIcon;
gModel.TotalHours = dmodel.TotalHours;
gModel.UpdateTime = dmodel.UpdateTime;
......@@ -1543,6 +1550,19 @@ namespace Edu.Module.Course
School_Id = dmodel.School_Id,
SourceId = gModel.OrderId
});
if (!string.IsNullOrWhiteSpace(dmodel.StuIcon))//更新学生表中的头像
{
var orderGuestModel = student_OrderGuestRepository.GetStrOrderGuestListRepository(new RB_Student_OrderGuest_ViewModel { ClassId = gModel.ClassId, OrderId = gModel.OrderId, GuestId = gModel.Id }).FirstOrDefault();
if (orderGuestModel != null && orderGuestModel.Student_Id > 0)
{
Dictionary<string, object> fileds = new Dictionary<string, object>()
{
{nameof(RB_Student_ViewModel.StuIcon),dmodel.StuIcon},
};
studentRepository.Update(fileds, new WhereHelper(nameof(RB_Student_ViewModel.StuId), orderGuestModel.Student_Id));
}
}
}
}
else
......@@ -1603,12 +1623,13 @@ namespace Edu.Module.Course
School_Id = classmodel.School_Id,
Status = DateStateEnum.Normal,
StuBirth = dmodel.BirthDate,
StuIcon = "",
StuIcon = dmodel.StuIcon,
StuName = dmodel.GuestName,
StuSex = dmodel.Sex - 1,
StuTel = dmodel.Mobile,
UpdateBy = dmodel.CreateBy,
UpdateTime = DateTime.Now
UpdateTime = DateTime.Now,
});
int AccountId = accountRepository.Insert(new Model.Entity.User.RB_Account()
{
......@@ -1650,7 +1671,7 @@ namespace Edu.Module.Course
Group_Id = dmodel.Group_Id,
LogContent = LogContent,
School_Id = dmodel.School_Id,
SourceId = dmodel.OrderId
SourceId = dmodel.OrderId,
});
}
}
......
......@@ -3,11 +3,15 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using Edu.Model.Entity.Course;
using Edu.Model.Entity.User;
using Edu.Model.ViewModel.Course;
using VT.FW.DB.Dapper;
namespace Edu.Repository.Course
{
/// <summary>
/// 学员签到仓储层
/// </summary>
public class RB_Class_CheckRepository : BaseRepository<RB_Class_Check>
{
/// <summary>
......@@ -19,9 +23,13 @@ namespace Edu.Repository.Course
{
StringBuilder builder = new StringBuilder();
builder.AppendFormat(@"
SELECT A.*,IFNULL(B.GuestName,'') AS GuestName
SELECT A.*,IFNULL(B.GuestName,'') AS GuestName,IFNULL(C.ClassName,'') AS ClassName,IFNULL(D.CourseName,'') AS CourseName,IFNULL(E.RoomName,'') AS RoomName,IFNULL(F.TeacherName,'') AS TeacherName
FROM RB_Class_Check AS A LEFT JOIN rb_order_guest AS B ON A.OrderGuestId=B.Id
WHERE 1=1 ");
LEFT JOIN rb_class AS C ON A.ClassId=C.ClassId
LEFT JOIN rb_course AS D ON C.CouseId=D.CourseId
LEFT JOIN rb_class_room AS E ON A.ClassRoomId=E.RoomId
LEFT JOIN rb_teacher AS F ON A.TeacherId=F.TId
WHERE 1=1 AND A.Status=0 ");
if (query != null)
{
if (query.Group_Id > 0)
......@@ -40,6 +48,10 @@ WHERE 1=1 ");
{
builder.AppendFormat(" AND A.{0} in({1}) ", nameof(RB_Class_Check_ViewModel.ClassId), query.Q_ClassIds);
}
if (query.OrderGuestId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.OrderGuestId), query.OrderGuestId);
}
if (!string.IsNullOrWhiteSpace(query.StartDate))
{
builder.AppendFormat(" AND DATE_FORMAT(A.{0},'%Y-%m-%d')>=DATE_FORMAT('{1}','%Y-%m-%d') ", nameof(RB_Class_Check_ViewModel.ClassDate), query.StartDate);
......@@ -49,13 +61,105 @@ WHERE 1=1 ");
builder.AppendFormat(" AND DATE_FORMAT(A.{0},'%Y-%m-%d')<=DATE_FORMAT('{1}','%Y-%m-%d') ", nameof(RB_Class_Check_ViewModel.ClassDate), query.EndDate);
}
}
return Get<RB_Class_Check_ViewModel>(builder.ToString()).ToList();
}
/// <summary>
/// 获取签到记录分页列表
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="rowsCount"></param>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_Class_Check_ViewModel> GetClassCheckPageRepository(int pageIndex,int pageSize,out long rowsCount, RB_Class_Check_ViewModel query)
{
var parameters = new DynamicParameters();
StringBuilder builder = new StringBuilder();
builder.AppendFormat(@"
SELECT A.*,IFNULL(B.GuestName,'') AS GuestName,IFNULL(B.GuestState,0) AS GuestState,IFNULL(C.ClassName,'') AS ClassName
,IFNULL(D.CourseName,'') AS CourseName,IFNULL(E.RoomName,'') AS RoomName,IFNULL(F.TeacherName,'') AS TeacherName
FROM RB_Class_Check AS A LEFT JOIN rb_order_guest AS B ON A.OrderGuestId=B.Id
LEFT JOIN rb_class AS C ON A.ClassId=C.ClassId
LEFT JOIN rb_course AS D ON C.CouseId=D.CourseId
LEFT JOIN rb_class_room AS E ON A.ClassRoomId=E.RoomId
LEFT JOIN rb_teacher AS F ON A.TeacherId=F.TId
WHERE 1=1 AND A.Status=0 ");
builder.AppendFormat(" AND A.{0} IN(2,3) ", nameof(RB_Class_Check_ViewModel.MakeUpStatus));
if (query != null)
{
if (query.Group_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.Group_Id), query.Group_Id);
}
if (query.School_Id > 0)
{
//builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.School_Id), query.School_Id);
}
if (query.ClassId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.ClassId), query.ClassId);
}
if (!string.IsNullOrEmpty(query.Q_ClassIds))
{
builder.AppendFormat(" AND A.{0} in({1}) ", nameof(RB_Class_Check_ViewModel.ClassId), query.Q_ClassIds);
}
if (query.OrderGuestId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.OrderGuestId), query.OrderGuestId);
}
if (!string.IsNullOrWhiteSpace(query.StartDate))
{
builder.AppendFormat(" AND DATE_FORMAT(A.{0},'%Y-%m-%d')>=DATE_FORMAT('{1}','%Y-%m-%d') ", nameof(RB_Class_Check_ViewModel.ClassDate), query.StartDate);
}
if (!string.IsNullOrWhiteSpace(query.EndDate))
{
builder.AppendFormat(" AND DATE_FORMAT(A.{0},'%Y-%m-%d')<=DATE_FORMAT('{1}','%Y-%m-%d') ", nameof(RB_Class_Check_ViewModel.ClassDate), query.EndDate);
}
if (query.CheckStatus > -1)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.CheckStatus), query.CheckStatus);
}
if (query.IsAbsentHours > -1)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.IsAbsentHours), query.IsAbsentHours);
}
if (query.MakeUpStatus > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.MakeUpStatus), query.MakeUpStatus);
}
if (!string.IsNullOrEmpty(query.GuestName))
{
builder.AppendFormat(" AND B.{0} LIKE @GuestName ", nameof(RB_Order_Guest.GuestName));
parameters.Add("GuestName", "%" + query.GuestName.Trim() + "%");
}
if (!string.IsNullOrEmpty(query.ClassName))
{
builder.AppendFormat(" AND C.{0} LIKE @ClassName ", nameof(RB_Class.ClassName));
parameters.Add("ClassName", "%" + query.ClassName.Trim() + "%");
}
if (!string.IsNullOrEmpty(query.CourseName))
{
builder.AppendFormat(" AND D.{0} LIKE @CourseName ", nameof(RB_Course.CourseName));
parameters.Add("CourseName", "%" + query.CourseName.Trim() + "%");
}
if (!string.IsNullOrEmpty(query.TeacherName))
{
builder.AppendFormat(" AND F.{0} LIKE @TeacherName ", nameof(RB_Teacher.TeacherName));
parameters.Add("TeacherName", "%" + query.TeacherName.Trim() + "%");
}
if (!string.IsNullOrEmpty(query.RoomName))
{
builder.AppendFormat(" AND E.{0} LIKE @RoomName ", nameof(RB_Class_Room.RoomName));
parameters.Add("RoomName", "%" + query.RoomName.Trim() + "%");
}
}
builder.AppendFormat(" ORDER BY A.{0} DESC ", nameof(RB_Class_Check_ViewModel.ClassDate));
return GetPage<RB_Class_Check_ViewModel>(pageIndex, pageSize, out rowsCount, builder.ToString(),parameters).ToList();
}
/// <summary>
/// 获取教室列表
/// 获取签到列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
......@@ -155,28 +259,41 @@ GROUP BY B.OrderGuestId
}
/// <summary>
/// 学员缺勤分钟数
/// 计算上课计划分钟数
/// </summary>
/// <param name="guestIds">学员编号</param>
/// <param name="query"></param>
/// <returns></returns>
public List<GuestFinishMinute_ViewModel> GetGuestNoFinishMinutesRepository(string guestIds)
public int CalcPlanMinutesRepository(RB_Class_Plan_ViewModel query )
{
int result = 0;
string where = "";
if (query.ClassId > 0)
{
where+=string.Format(" AND B.ClassId={0} ", query.ClassId);
}
if (query.ClassDate != null)
{
where += string.Format(" AND B.ClassDate='{0}' ", query.ClassDate);
}
StringBuilder builder = new StringBuilder();
builder.AppendFormat(@"
SELECT B.OrderGuestId AS GuestId,SUM(IFNULL(B.FinishMinutes,0)) AS FinishMinutes
SELECT SUM(FinishMinutes)
FROM
(
SELECT B.ClassDate,A.OrderGuestId
,TIMESTAMPDIFF(MINUTE,(DATE_FORMAT(CONCAT('2021-01-01 ',C.StartTime,':00'),'%Y-%m-%d %H:%i')),(DATE_FORMAT(CONCAT('2021-01-01 ',C.EndTime,':00'), '%Y-%m-%d %H:%i'))) AS FinishMinutes
FROM rb_class_check AS A INNER JOIN rb_class_plan AS B ON A.ClassDate=B.ClassDate AND A.ClassId=B.ClassId AND B.`Status`=0
INNER JOIN rb_class_time AS C ON B.ClassPlanId=C.ClassPlanId
WHERE A.CheckStatus=1 AND A.OrderGuestId IN({0})
) AS B
GROUP BY B.OrderGuestId
", guestIds);
return Get<GuestFinishMinute_ViewModel>(builder.ToString()).ToList();
SELECT TIMESTAMPDIFF(MINUTE,(DATE_FORMAT(CONCAT('2021-01-01 ',C.StartTime,':00'),'%Y-%m-%d %H:%i')),(DATE_FORMAT(CONCAT('2021-01-01 ',C.EndTime,':00'), '%Y-%m-%d %H:%i'))) AS FinishMinutes
FROM rb_class_plan AS B INNER JOIN rb_class_time AS C ON B.ClassPlanId=C.ClassPlanId
WHERE 1=1 AND B.`Status`=0 {0}
) AS A
", where);
var obj = base.ExecuteScalar(builder.ToString());
if (obj != null)
{
Int32.TryParse(obj.ToString(), out result);
}
return result;
}
/// <summary>
/// 班级签到完成学习分钟数
/// </summary>
......@@ -207,9 +324,8 @@ GROUP BY A.ClassId
}
/// <summary>
/// 获取教室列表
/// 获取班级签到列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
......
......@@ -754,6 +754,70 @@ namespace Edu.WebApi.Controllers.Course
}
/// <summary>
/// 获取缺课分页列表
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult GetAbsentPage()
{
var pageModel = Common.Plugin.JsonHelper.DeserializeObject<ResultPageModel>(RequestParm.Msg.ToString());
var query = new RB_Class_Check_ViewModel()
{
CheckStatus = 1,
IsAbsentHours = 1,
MakeUpStatus = base.ParmJObj.GetInt("MakeUpStatus"),
GuestName=base.ParmJObj.GetStringValue("GuestName"),
ClassName= base.ParmJObj.GetStringValue("ClassName"),
CourseName = base.ParmJObj.GetStringValue("CourseName"),
TeacherName = base.ParmJObj.GetStringValue("TeacherName"),
RoomName = base.ParmJObj.GetStringValue("RoomName"),
StartDate=base.ParmJObj.GetStringValue("StartDate"),
EndDate = base.ParmJObj.GetStringValue("EndDate"),
};
query.Group_Id = base.UserInfo.Group_Id;
List<object> result = new List<object>();
var list = classModule.GetClassCheckPageModule(pageModel.PageIndex, pageModel.PageSize, out long rowsCount, query);
foreach (var item in list)
{
result.Add(new
{
item.ClassCheckId,
item.OrderGuestId,
item.GuestName,
item.GuestState,
item.GuestStateStr,
item.ClassId,
item.ClassName,
item.CourseName,
item.School_Id,
item.TeacherId,
item.TeacherName,
item.ClassRoomId,
item.RoomName,
ClassDate=Common.ConvertHelper.FormatDate(item.ClassDate),
item.MakeUpStatus,
item.MakeUpStatusStr
});
}
pageModel.Count = rowsCount;
pageModel.PageData = result;
return ApiResult.Success(data: pageModel);
}
/// <summary>
/// 修改补课状态
/// </summary>
/// <returns></returns>
public ApiResult SetMakeUpStatus()
{
int MakeUpStatus = base.ParmJObj.GetInt("MakeUpStatus");
int ClassCheckId = base.ParmJObj.GetInt("ClassCheckId");
int GuestId = base.ParmJObj.GetInt("GuestId");
bool flag= classModule.SetMakeUpStatusModule(MakeUpStatus, ClassCheckId, GuestId);
return flag ? ApiResult.Success() : ApiResult.Failed();
}
/// <summary>
/// 获取班级日志
/// </summary>
......@@ -1460,6 +1524,23 @@ namespace Edu.WebApi.Controllers.Course
bool retult = classModule.UpdateTimeClassVideo(extModel.VideoUrl, extModel.ClassTimeId);
return retult ? ApiResult.Success("课堂视频更新成功") : ApiResult.Failed("课堂视频更新失败");
}
/// <summary>
/// 获取学员列表
/// </summary>
/// <returns></returns>
[HttpPost]
[Microsoft.AspNetCore.Authorization.AllowAnonymous]
public ApiResult GetStudentByClassId()
{
var classId = base.ParmJObj.GetInt("ClassId");
var schoolId = 0;
var Group_Id = base.ParmJObj.GetInt("Group_Id", 100000);
var data = classModule.GetClassStudentListModule(classId, schoolId, Group_Id);
return ApiResult.Success(data: data);
}
#endregion
}
......
......@@ -883,6 +883,7 @@ namespace Edu.WebApi.Controllers.Course
x.VolunteerMajor,
x.Price,
x.StudyRemark,
x.StuIcon
});
return ApiResult.Success("", pageModel);
}
......@@ -920,7 +921,8 @@ namespace Edu.WebApi.Controllers.Course
Price=base.ParmJObj.GetDecimal("Price"),
StudyRemark=base.ParmJObj.GetStringValue("StudyRemark"),
BirthDate=base.ParmJObj.GetDateTime("BirthDate"),
TotalHours=base.ParmJObj.GetInt("TotalHours")
TotalHours=base.ParmJObj.GetInt("TotalHours"),
StuIcon = base.ParmJObj.GetStringValue("StuIcon"),
};
if (dmodel.OrderId <= 0)
{
......
......@@ -46,7 +46,7 @@ namespace Edu.WebApi.Controllers.WeChatPay
/// 订单处理类对象
/// </summary>
private readonly OrderModule orderModule = AOP.AOPHelper.CreateAOPObject<OrderModule>();
private readonly object _lock = new object();
/// <summary>
/// 统一下单接口
/// </summary>
......@@ -64,7 +64,7 @@ namespace Edu.WebApi.Controllers.WeChatPay
var helper = new WxPayHelper(WxPayConst.appid, WxPayConst.mchid, WxPayConst.serialNo, WxPayConst.privateKey);
var notify_url = Config.sTenpayNotifyUrl;//ConfigurationManager.AppSettings["notify_url"]; //这个放在配置文件,从配置文件读取比较灵活,或者写到数据库中
Task<WxPayRespModel> payodel= helper.UnionGenerateOrder(orderModle.CourseName, Convert.ToInt32(orderModle.Money * 100), orderNumber, notify_url, orderModle.OrderId.ToString());
Task<WxPayRespModel> payodel = helper.UnionGenerateOrder(orderModle.CourseName, Convert.ToInt32(orderModle.Money * 100), orderNumber, notify_url, orderModle.OrderId.ToString());
#region APP生成下单所需的参数,看个人实际需求,也可以APP自己生成所需的参数
......@@ -72,7 +72,7 @@ namespace Edu.WebApi.Controllers.WeChatPay
#endregion
return ApiResult.Success(data: signModel) ;
return ApiResult.Success(data: signModel);
}
......@@ -84,40 +84,23 @@ namespace Edu.WebApi.Controllers.WeChatPay
[HttpPost]
[HttpGet]
[AllowAnonymous]
public async Task<WxPayCallbackRespModel> WxPayCallback()
public async Task<WxPayCallbackRespModel> WxPayCallback(WxPayNotifyModel wxPayNotifyModel)
{
#region 获取字符串流
//System.IO.Stream s = HttpContext.Current.Request.InputStream;
//int count = 0;
//byte[] buffer = new byte[1024];
//StringBuilder builder = new StringBuilder();
//while ((count = s.Read(buffer, 0, 1024)) > 0)
//{
// builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
//}
//s.Flush();
//s.Close();
//s.Dispose();
var buffer = new MemoryStream();
Request.Body.CopyTo(buffer);
#endregion
//我没有使用官方的那种验证数据安全性的方法,我解密出来数据之后,直接拿着订单号再去查询一下订单状态,然后再更新到数据库中。我嫌麻烦……
// var str = Encoding.UTF8.GetString(buffer);
var str = Encoding.UTF8.GetString(buffer.GetBuffer());
LogHelper.WriteInfo("订单回调信息" + str);
var viewModel = new WxPayCallbackRespModel();
try
{
var wxPayNotifyModel = Common.Plugin.JsonHelper.DeserializeObject<WxPayNotifyModel>(str); //str.ToObject<WxPayNotifyModel>();
// var wxPayNotifyModel = Common.Plugin.JsonHelper.DeserializeObject<WxPayNotifyModel>(Request.Body.ToString()); //str.ToObject<WxPayNotifyModel>();
var resource = wxPayNotifyModel?.resource ?? new WxPayResourceModel();
var decryptStr = AesGcmHelper.AesGcmDecrypt(resource.associated_data, resource.nonce, resource.ciphertext, WxPayConst.APIV3Key);
var decryptModel = Common.Plugin.JsonHelper.DeserializeObject<WxPayResourceDecryptModel>(decryptStr); //decryptStr.ToObject<WxPayResourceDecryptModel>();
LogHelper.WriteInfo("订单回调信息decryptStr" + decryptStr);
var payModel = Common.Plugin.JsonHelper.DeserializeObject<WxPayResourceDecryptModel>(decryptStr); //decryptStr.ToObject<WxPayResourceDecryptModel>();
if (string.IsNullOrEmpty(decryptModel.out_trade_no))
if (payModel.trade_state == "SUCCESS")
{
viewModel.code = "SUCCESS";
viewModel.message = "";
}
if (string.IsNullOrEmpty(payModel.out_trade_no))
{
viewModel.code = "FAIL";
viewModel.message = "数据解密失败";
......@@ -125,135 +108,178 @@ namespace Edu.WebApi.Controllers.WeChatPay
}
else
{
var payModel = await QueryOrder(decryptModel.out_trade_no);
if (payModel != null && payModel.trade_state == "SUCCESS")//生成财务单据
{
{ //然后进行数据库更新处理……等等其他操作
UpdateFinance(payModel);//生成财务单据以及生成支付记录
viewModel.code = "SUCCESS";
viewModel.message = "";
}
}
}
catch (Exception ex)
{
viewModel.code = "FAIL";
viewModel.message = "数据解密失败";
}
return viewModel;
}
int contractId = Convert.ToInt32(payModel.out_trade_no[17..]);
var orderModle = educationContractModule.GetEducationContractModule(contractId);
var orderModel = orderModule.GetClassOrderInfo(orderModle.OrderId);
/// <summary>
/// 生成财务单据以及生成支付记录
/// </summary>
/// <param name="payModel"></param>
/// <returns></returns>
[AllowAnonymous]
public async Task UpdateFinance(WxPayResourceDecryptModel payModel)
{
LogHelper.WriteInfo("我是回调" + System.DateTime.Now);
int contractId = Convert.ToInt32(payModel.out_trade_no[17..]);
bool isAdd = false;
if (!Cache.User.UserReidsCache.Exists(Cache.CacheKey.WeChatPay_Callback_Key + payModel.out_trade_no))
{
LogHelper.WriteInfo(payModel.out_trade_no + "我是回调:" + System.DateTime.Now);
Cache.User.UserReidsCache.Set(Cache.CacheKey.WeChatPay_Callback_Key + payModel.out_trade_no, payModel.out_trade_no, 1800);
isAdd = true;
Cache.User.UserReidsCache.Set(Cache.CacheKey.WeChatPay_Callback_Key + payModel.out_trade_no, payModel.out_trade_no, 1800);
var oldOrderRecordModel = educationContractModule.GetOrderRecordList(new RB_Finance_OrderRecord { ContractId = contractId, OutTradeNo = payModel.out_trade_no }).FirstOrDefault();
if (oldOrderRecordModel == null || oldOrderRecordModel.ID == 0)
{
isAdd = true;
}
if (isAdd)
{
LogHelper.WriteInfo(payModel.out_trade_no + "我要新增财务单据啦...." + System.DateTime.Now);
var orderModle = educationContractModule.GetEducationContractModule(contractId);
var orderModel = orderModule.GetClassOrderInfo(orderModle.OrderId);
var financeConfig = educationContractModule.GetFinanceConfigList(new Model.ViewModel.Course.RB_Finance_Config_ViewModel { Group_Id = orderModle.Group_Id, Type = Common.Enum.Course.FinanceConfigTypeEnum.Tuition }).FirstOrDefault();
if (financeConfig == null)
{
financeConfig = new Model.ViewModel.Course.RB_Finance_Config_ViewModel();
}
var userInfo = employeeModule.GetEmployeeListModule(new Model.ViewModel.User.Employee_ViewModel { Id = orderModel.EnterID, Group_Id = orderModel.Group_Id }).ToList().FirstOrDefault();
var OriginalFee = Math.Round((Convert.ToDecimal(Config.SettlementRate) / 100) * (Convert.ToDecimal(payModel.amount.payer_total) / 100), 2, MidpointRounding.AwayFromZero);//手续费
RB_Online_Trade_Detail model = new RB_Online_Trade_Detail();
RB_Finance_OrderRecord orderRecordModel = new RB_Finance_OrderRecord
{
ID = 0,
Type = 1,
FinanceId = 0,
OrderId = orderModle.OrderId,
ContractId = orderModle.Id,
CreateDate = System.DateTime.Now,
RB_Group_Id = orderModle.Group_Id,
RB_School_Id = orderModle.School_Id,
OutTradeNo = payModel.out_trade_no,
TransactionId = payModel.transaction_id,
TotalPrice = Convert.ToDecimal(payModel.amount.payer_total) / 100,
ServiceFee = OriginalFee
};
#region 财务单据数据组装
var detailList = new List<object>();
detailList.Add(new
{
CostTypeId = financeConfig?.CostTypeId ?? 533,
Number = 1,
OriginalMoney = Convert.ToDecimal(payModel.amount.payer_total) / 100,
UnitPrice = Convert.ToDecimal(payModel.amount.payer_total) / 100,
Remark = orderModle.StudentName + orderModle.CourseName + payModel.out_trade_no
});
var financeObj = new
{
IsPublic = 1,
BType = 1,//item.AccountType,
AccountId = financeConfig?.ClientID ?? 54,
WBMoney = Convert.ToDecimal(payModel.amount.payer_total) / 100,
TradeDate = System.DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd"),
AccountNumber = System.DateTime.Now.AddDays(-1).ToString("yyyyMMdd"),
TemplateId = financeConfig?.TempleteId ?? 139,
OrderSource = 17,
Remark = System.DateTime.Now.ToString("yyyy年MM月dd日") + "自动生成财务单据",
detailList,
OriginalFee,
CreateBy = userInfo.Id,
RemitterName = orderModle.StudentName,
RB_Branch_Id = userInfo.School_Id,
RB_Group_Id = userInfo.Group_Id,
RB_Depart_Id = userInfo.Dept_Id,
RB_CreateByName = userInfo.EmployeeName,
RB_DepartName = userInfo.DeptName,
RB_BranchName = userInfo.SchoolName,
RB_GroupName = userInfo.GroupName,
FinanceType = 2,
GuestId = orderModle.GuestId,
OrderId = orderModle.OrderId,
TCIDList = orderModel.ClassId > 0 ? new List<int>() { orderModel.ClassId } : new List<int>(),
};
#endregion
var userInfo = employeeModule.GetEmployeeListModule(new Model.ViewModel.User.Employee_ViewModel { Id = orderModel.EnterID, Group_Id = orderModel.Group_Id }).ToList().FirstOrDefault();
var OriginalFee = Math.Round(Convert.ToDecimal((Convert.ToDecimal(Config.SettlementRate) / 100) * (payModel.amount.payer_total / 100)), 2, MidpointRounding.AwayFromZero);//手续费
RB_Online_Trade_Detail model = new RB_Online_Trade_Detail();
RB_Finance_OrderRecord orderRecordModel = new RB_Finance_OrderRecord
string sign = EncryptionHelper.AesEncrypt(JsonHelper.Serialize(financeObj), Config.FinanceKey);
var resultInfo = new
{
msg = sign,
};
string apiResult = Common.Plugin.HttpHelper.HttpPost(Config.ReadConfigKey("IncomeFinanceApi"), JsonHelper.Serialize(resultInfo), "");
JObject parmsJob = JObject.Parse(apiResult);
string resultCode = parmsJob.GetStringValue("resultCode");
int frid = parmsJob.GetInt("data", 0);
if (resultCode == "1" && frid > 0)//新增记录
{
orderRecordModel.FinanceId = frid;
model = new RB_Online_Trade_Detail
{
ID = 0,
Type = 1,
FinanceId = 0,
OrderSource = 18,
OrderId = orderModle.OrderId,
ContractId = orderModle.Id,
CreateDate = System.DateTime.Now,
Pay_Order = "",
Trade_Order = payModel.out_trade_no,
Third_Order = payModel.transaction_id,
Money = Convert.ToDecimal(payModel.amount.payer_total) / 100,
Pay_Way = 1,
Interface_Company = 0,
Version = "",
Mch_Id = WxPayConst.mchid,
User_Id = orderModle.GuestId.ToString(),
Is_follow = 0,
AppId = WxPayConst.appid,
OpenId = payModel?.payer?.openid ?? "",
Currency_Type = payModel.amount.payer_currency,
Institution_Type = "",
Card_Type = 0,
Remarks = "教育订单信息财务单据:" + frid,
Pay_Result = 0,
Pay_Date = !string.IsNullOrWhiteSpace(payModel?.success_time ?? "") ? DateTime.SpecifyKind(Convert.ToDateTime(payModel.success_time), DateTimeKind.Utc) : Convert.ToDateTime("1990-01-01"),
Payer_Id = orderModle.GuestId,
Payer_Type = 0,
Data_Source = frid,
RB_Group_Id = orderModle.Group_Id,
RB_School_Id = orderModle.School_Id,
OutTradeNo = payModel.out_trade_no,
TransactionId = payModel.transaction_id,
TotalPrice = Convert.ToDecimal((payModel.amount.payer_total / 100)),
ServiceFee = OriginalFee
};
RB_Branch_Id = orderModle.School_Id,
IsRefund = 0,
RefundTrade_Order = "",
RefundMoney = 0,
RefundStatus = 0,
FinanceId = 0,
var detailList = new List<object>();
detailList.Add(new
{
CostTypeId = 533,
Number = 1,
OriginalMoney = Convert.ToDecimal((payModel.amount.payer_total / 100)),
UnitPrice = Convert.ToDecimal((payModel.amount.payer_total / 100)),
Remark = orderModle.StudentName + orderModle.CourseName + payModel.out_trade_no
});
var financeObj = new
{
IsPublic = 0,
BType = 2,//item.AccountType,
AccountId = 74,
WBMoney = Convert.ToDecimal((payModel.amount.payer_total / 100)),
TradeDate = System.DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd"),
AccountNumber = System.DateTime.Now.AddDays(-1).ToString("yyyyMMdd"),
TemplateId = 139,
OrderSource = 17,
Remark = System.DateTime.Now.ToString("yyyy年MM月dd日") + "自动生成财务单据",
detailList,
OriginalFee,
CreateBy = userInfo.Id,
RemitterName = orderModle.StudentName,
RB_Branch_Id = userInfo.School_Id,
RB_Group_Id = userInfo.Group_Id,
RB_Depart_Id = userInfo.Dept_Id,
RB_CreateByName = userInfo.EmployeeName,
RB_DepartName = userInfo.DeptName,
RB_BranchName = userInfo.SchoolName,
RB_GroupName = userInfo.GroupName,
FinanceType = 2,
GuestId = orderModle.GuestId,
OrderId = orderModle.OrderId,
TCIDList = orderModel.ClassId > 0 ? new List<int>() { orderModel.ClassId } : new List<int>(),
};
string sign = EncryptionHelper.AesEncrypt(JsonHelper.Serialize(financeObj), Config.FinanceKey);
var resultInfo = new
{
msg = sign,
};
string apiResult = Common.Plugin.HttpHelper.HttpPost(Config.ReadConfigKey("PaymentFinanceApi"), JsonHelper.Serialize(resultInfo), "");
JObject parmsJob = JObject.Parse(apiResult);
string resultCode = parmsJob.GetStringValue("resultCode");
int frid = parmsJob.GetInt("data", 0);
if (resultCode == "1" && frid > 0)//新增记录
{
orderRecordModel.FinanceId = frid;
model = new RB_Online_Trade_Detail
{
ID = 0,
Type = 1,
OrderSource = 18,
OrderId = orderModle.OrderId,
Pay_Order = "",
Trade_Order = payModel.out_trade_no,
Third_Order = payModel.transaction_id,
Money = Convert.ToDecimal((payModel.amount.payer_total / 100)),
Pay_Way = 1,
Interface_Company = 0,
Version = "",
Mch_Id = WxPayConst.mchid,
User_Id = orderModle.GuestId.ToString(),
Is_follow = 0,
AppId = WxPayConst.appid,
OpenId = payModel?.payer?.openid ?? "",
Currency_Type = payModel.amount.payer_currency,
Institution_Type = "",
Card_Type = 0,
Remarks = "教育订单信息财务单据:" + frid,
Pay_Result = 0,
Pay_Date = !string.IsNullOrWhiteSpace(payModel?.success_time ?? "") ? Convert.ToDateTime(payModel.success_time) : Convert.ToDateTime("1990-01-01"),
Payer_Id = orderModle.GuestId,
Payer_Type = 0,
Data_Source = frid,
RB_Group_Id = orderModle.Group_Id,
RB_Branch_Id = orderModle.School_Id,
IsRefund = 0,
RefundTrade_Order = "",
RefundMoney = 0,
RefundStatus = 0,
FinanceId = 0,
};
}
educationContractModule.SetEducationContractFinance(model, orderRecordModel);
}
//然后进行数据库更新处理……等等其他操作
bool result = educationContractModule.SetEducationContractFinance(model, orderRecordModel);
}
Cache.User.UserReidsCache.Set(Cache.CacheKey.WeChatPay_Callback_Key + payModel.out_trade_no, payModel.out_trade_no, 1);
}
catch (Exception ex)
{
viewModel.code = "FAIL";
viewModel.message = "数据解密失败";
else {
LogHelper.WriteInfo("存在Key" + System.DateTime.Now);
}
return viewModel;
}
[AllowAnonymous]
public async Task<WxPayStatusRespModel> QueryOrder(string orderNumber)
{
......@@ -296,40 +322,32 @@ namespace Edu.WebApi.Controllers.WeChatPay
[HttpPost]
[HttpGet]
[AllowAnonymous]
public async Task<RefundsCallbackRespModel> RefundsCallback()
public async Task<RefundsCallbackRespModel> RefundsCallback(RefundsCallbackModel wxPayNotifyModel)
{
#region 获取字符串流
var buffer = new MemoryStream();
Request.Body.CopyTo(buffer);
#endregion
//我没有使用官方的那种验证数据安全性的方法,我解密出来数据之后,直接拿着商户退款订单号再去查询一下订单状态,然后再更新到数据库中。我嫌麻烦……
var str = Encoding.UTF8.GetString(buffer.GetBuffer());
var wxPayNotifyModel = Common.Plugin.JsonHelper.DeserializeObject<RefundsCallbackModel>(str);
var resource = wxPayNotifyModel?.resource ?? new RefundsCallbackResourceModel();
var decryptStr = AesGcmHelper.AesGcmDecrypt(resource.associated_data, resource.nonce, resource.ciphertext, WxPayConst.APIV3Key);
var decryptModel = Common.Plugin.JsonHelper.DeserializeObject<RefundsCallbackDecryptModel>(decryptStr); //decryptStr.ToObject<RefundsCallbackDecryptModel>();
var payModel = Common.Plugin.JsonHelper.DeserializeObject<RefundsCallbackDecryptModel>(decryptStr); //decryptStr.ToObject<RefundsCallbackDecryptModel>();
var viewModel = new RefundsCallbackRespModel();
if (string.IsNullOrEmpty(decryptModel.out_trade_no))
if (string.IsNullOrEmpty(payModel.out_trade_no))
{
viewModel.code = "FAIL";
viewModel.message = "数据解密失败";
}
else
{
var payModel = await QueryRefunds(decryptModel.out_refund_no);
if (payModel != null && payModel.status == "SUCCESS")//生成财务单据
// var payModel = await QueryRefunds(decryptModel.out_refund_no);
if (payModel != null && payModel.refund_status == "SUCCESS")//生成财务单据
{
int contractId = Convert.ToInt32(payModel.out_trade_no[17..]);
var orderModle = educationContractModule.GetEducationContractModule(contractId);
var orderModel = orderModule.GetClassOrderInfo(orderModle.OrderId);
var oldOrderRecordModel = educationContractModule.GetOrderRecordList(new RB_Finance_OrderRecord { ContractId = contractId, OutTradeNo = payModel.out_trade_no }).FirstOrDefault();
var userInfo = employeeModule.GetEmployeeListModule(new Model.ViewModel.User.Employee_ViewModel { Id = orderModel.EnterID, Group_Id = orderModel.Group_Id }).ToList().FirstOrDefault();
var OriginalFee = Math.Round(Convert.ToDecimal((Convert.ToDecimal(Config.SettlementRate) / 100) * (payModel.amount.payer_total / 100)), 2, MidpointRounding.AwayFromZero);//手续费
var OriginalFee = Math.Round(Convert.ToDecimal((Convert.ToDecimal(Config.SettlementRate) / 100) * (Convert.ToDecimal(payModel.amount.payer_total) / 100)), 2, MidpointRounding.AwayFromZero);//手续费
RB_Online_Trade_Detail model = new RB_Online_Trade_Detail();
RB_Finance_OrderRecord orderRecordModel = new RB_Finance_OrderRecord
{
......@@ -341,13 +359,16 @@ namespace Edu.WebApi.Controllers.WeChatPay
CreateDate = System.DateTime.Now,
RB_Group_Id = orderModle.Group_Id,
RB_School_Id = orderModle.School_Id,
OutTradeNo = payModel.out_trade_no,
OutTradeNo = payModel.out_refund_no,
OrderRecordId = oldOrderRecordModel?.ID ?? 0,
TransactionId = payModel.refund_id,
TotalPrice = Convert.ToDecimal((payModel.amount.payer_total / 100)),
TotalPrice = Convert.ToDecimal(payModel.amount.payer_total) / 100,
ServiceFee = OriginalFee
};
educationContractModule.SetEducationContractFinance(model, orderRecordModel);
bool result = educationContractModule.SetEducationContractFinance(model, orderRecordModel);
viewModel.code = "SUCCESS";
viewModel.message = "";
}
//然后进行数据库更新处理……等等其他操作
}
......@@ -375,9 +396,13 @@ namespace Edu.WebApi.Controllers.WeChatPay
int contractId = Convert.ToInt32(payModel.out_trade_no[17..]);
var orderModle = educationContractModule.GetEducationContractModule(contractId);
var orderModel = orderModule.GetClassOrderInfo(orderModle.OrderId);
var financeConfig = educationContractModule.GetFinanceConfigList(new Model.ViewModel.Course.RB_Finance_Config_ViewModel { Group_Id = orderModle.Group_Id, Type = Common.Enum.Course.FinanceConfigTypeEnum.Tuition }).FirstOrDefault();
if (financeConfig == null)
{
financeConfig = new Model.ViewModel.Course.RB_Finance_Config_ViewModel();
}
var userInfo = employeeModule.GetEmployeeListModule(new Model.ViewModel.User.Employee_ViewModel { Id = orderModel.EnterID, Group_Id = orderModel.Group_Id }).ToList().FirstOrDefault();
var OriginalFee = Math.Round(Convert.ToDecimal((Convert.ToDecimal(Config.SettlementRate) / 100) * (payModel.amount.payer_total / 100)), 2, MidpointRounding.AwayFromZero);//手续费
var OriginalFee = Math.Round((Convert.ToDecimal(Config.SettlementRate) / 100) * (Convert.ToDecimal(payModel.amount.payer_total) / 100), 2, MidpointRounding.AwayFromZero);//手续费
RB_Online_Trade_Detail model = new RB_Online_Trade_Detail();
RB_Finance_OrderRecord orderRecordModel = new RB_Finance_OrderRecord
{
......@@ -391,14 +416,14 @@ namespace Edu.WebApi.Controllers.WeChatPay
RB_School_Id = orderModle.School_Id,
OutTradeNo = payModel.out_trade_no,
TransactionId = payModel.transaction_id,
TotalPrice = Convert.ToDecimal((payModel.amount.payer_total / 100)),
TotalPrice = Convert.ToDecimal(payModel.amount.payer_total) / 100,
ServiceFee = OriginalFee
};
var detailList = new List<object>();
detailList.Add(new
{
CostTypeId = 533,
CostTypeId = financeConfig?.CostTypeId ?? 533,
Number = 1,
OriginalMoney = Convert.ToDecimal((payModel.amount.payer_total / 100)),
UnitPrice = Convert.ToDecimal((payModel.amount.payer_total / 100)),
......@@ -407,13 +432,13 @@ namespace Edu.WebApi.Controllers.WeChatPay
var financeObj = new
{
IsPublic = 0,
BType = 2,//item.AccountType,
AccountId = 74,
IsPublic = 1,
BType = 1,//item.AccountType,
AccountId = financeConfig?.ClientID ?? 54,
WBMoney = Convert.ToDecimal((payModel.amount.payer_total / 100)),
TradeDate = System.DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd"),
AccountNumber = System.DateTime.Now.AddDays(-1).ToString("yyyyMMdd"),
TemplateId = 139,
TemplateId = financeConfig?.TempleteId ?? 139,
OrderSource = 17,
Remark = System.DateTime.Now.ToString("yyyy年MM月dd日") + "自动生成财务单据",
detailList,
......@@ -444,6 +469,9 @@ namespace Edu.WebApi.Controllers.WeChatPay
if (resultCode == "1" && frid > 0)//新增记录
{
orderRecordModel.FinanceId = frid;
// var Pay_Date = !string.IsNullOrWhiteSpace(payModel?.success_time ?? "") ? Convert.ToDateTime(payModel.success_time) : Convert.ToDateTime("1990-01-01");
DateTime myDt = DateTime.SpecifyKind(Convert.ToDateTime(payModel.success_time), DateTimeKind.Utc);
model = new RB_Online_Trade_Detail
{
ID = 0,
......@@ -467,7 +495,7 @@ namespace Edu.WebApi.Controllers.WeChatPay
Card_Type = 0,
Remarks = "教育订单信息财务单据:" + frid,
Pay_Result = 0,
Pay_Date = !string.IsNullOrWhiteSpace(payModel?.success_time ?? "") ? Convert.ToDateTime(payModel.success_time) : Convert.ToDateTime("1990-01-01"),
Pay_Date = myDt,
Payer_Id = orderModle.GuestId,
Payer_Type = 0,
Data_Source = frid,
......
......@@ -34,7 +34,7 @@ namespace Edu.WebApi.Timers
}
/// <summary>
/// 防止重
/// 防止重复提交
/// </summary>
private static int inTimer = 0;
private static int inTimer2 = 0;
......@@ -91,6 +91,7 @@ namespace Edu.WebApi.Timers
/// <param name="e"></param>
public static void DealDuty(object sender, System.Timers.ElapsedEventArgs e)
{
double addhours = 1.5;
if (Interlocked.Exchange(ref inTimer2, 1) == 0)
{
var list = dutyPlanModule.GetDutyPlanPageModule(1, 20, out _, new Model.ViewModel.Duty.RB_Duty_Plan_ViewModel()
......@@ -104,8 +105,8 @@ namespace Edu.WebApi.Timers
{
foreach (var subItem in item.PlanDetails)
{
var endTime = Convert.ToDateTime((Common.ConvertHelper.FormatDate(item.Date) + " " + subItem.EndTime)).AddHours(2);
if (subItem.Status== Common.Enum.Duty.DutyStatusEnum.NoStart && endTime < DateTime.Now)
var endTime = Convert.ToDateTime((Common.ConvertHelper.FormatDate(item.Date) + " " + subItem.EndTime)).AddHours(addhours);
if (subItem.Status == Common.Enum.Duty.DutyStatusEnum.NoStart && endTime < DateTime.Now)
{
dutyPlanModule.UpdateNoDutyModule(subItem.Id);
}
......@@ -113,7 +114,7 @@ namespace Edu.WebApi.Timers
}
}
var list2= dutyPlanModule.GetDutyPlanPageModule(1, 20, out _, new Model.ViewModel.Duty.RB_Duty_Plan_ViewModel()
var list2 = dutyPlanModule.GetDutyPlanPageModule(1, 20, out _, new Model.ViewModel.Duty.RB_Duty_Plan_ViewModel()
{
QDutyStatus = 1,
QEndDate = Common.ConvertHelper.FormatDate(DateTime.Now)
......@@ -122,7 +123,7 @@ namespace Edu.WebApi.Timers
{
foreach (var subItem in item.PlanDetails)
{
var endTime = Convert.ToDateTime((Common.ConvertHelper.FormatDate(item.Date) + " " + subItem.EndTime)).AddHours(2);
var endTime = Convert.ToDateTime((Common.ConvertHelper.FormatDate(item.Date) + " " + subItem.EndTime)).AddHours(addhours);
if (subItem.Status == Common.Enum.Duty.DutyStatusEnum.DutyIng && endTime < DateTime.Now)
{
dutyPlanModule.UpdateDutyFinishedModule(subItem.Id);
......@@ -132,6 +133,5 @@ namespace Edu.WebApi.Timers
Interlocked.Exchange(ref inTimer2, 0);
}
}
}
}
}
\ No newline at end of file
{
"ConnectionStrings": {
"DefaultConnection": "server=192.168.20.214;user id=reborn;password=Reborn@2018;database=reborn_edu;CharSet=utf8mb4; Convert Zero Datetime=true; ",
"DefaultConnectionPName": "MySql.Data.MySqlClient",
"FinanceConnection": "server=192.168.20.214;user id=reborn;password=Reborn@2018;database=test_reborn_finance;CharSet=utf8mb4; Convert Zero Datetime=true; ",
"FinanceConnectionPName": "MySql.Data.MySqlClient",
"DataStatisticsConnection": "server=192.168.20.214;user id=reborn;password=Reborn@2018;database=reborn_datastatistics;CharSet=utf8mb4; Convert Zero Datetime=true; ",
"DataStatisticsConnectionPName": "MySql.Data.MySqlClient",
"LogConnection": "server=192.168.20.214;user id=reborn;password=Reborn@2018;database=reborn_sys;CharSet=utf8mb4; Convert Zero Datetime=true; ",
"LogConnectionPName": "MySql.Data.MySqlClient"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"SettlementRate": "0.60",
"JwtSecretKey": "@VIITTOREBORN*2018",
"JwtExpirTime": 86400,
"IsSendMsg": 2,
"AllowedHosts": "*",
"OpenValidation": "False",
"UploadSiteUrl": "http://192.168.1.36:8120",
"ViewFileSiteUrl": "https://viitto-1301420277.cos.ap-chengdu.myqcloud.com",
"ErpViewFileSiteUrl": "http://imgfile.oytour.com",
"Mongo": "mongodb://47.96.25.130:27017",
"MongoDBName": "Edu",
"WkHtmlToPdfPath": "D:/wkhtmltopdf/bin/",
"FinanceKey": "FinanceMallInsertToERPViitto2020",
"PaymentFinanceApi": "http://192.168.1.13:8083/api/Mall/InsertFinanceBatchForMallIn",
"IncomeFinanceApi": "http://192.168.20.9:8083/api/Mall/InsertFinanceBatchForMallOut",
"sTenpayNotifyUrl": "http://eduapi.oytour.com/api/WeChatPay/WxPayCallback", //下单回调地址
"sTenpayNotifyRefundUrl": "http://eduapi.oytour.com/api/WeChatPay/Refunds", //退款回调地址
"FinanceDateBase": "test_reborn_finance",
"RabbitMqConfig": {
"HostName": "47.96.25.130",
"VirtualHost": "/",
"Port": 5672,
"UserName": "guest",
"Password": "viitto2019",
"QueenName": "vt_sys_message_test"
},
"RedisSetting": {
"RedisServer": "47.96.23.199",
"RedisPort": "6379",
"RedisPwd": "Viitto2018"
},
"VirtualDirectory": "WebFile",
//未填写 未打分 下降比例
"OKRMatterValue": "30,100,100",
//是否是线上环境
"IsOnline": false,
//退课流程编号
"BackClassFlowId": 1,
//分区校长岗位编号
"SchoolPostId": 3,
//教务长
"JiaoWuZhang": 8,
//留学就业部门主管审核编号[王涛]
"StudyAbroadDirectorId": 64,
//留学就业部门负责人审核编号[姚顺先]
"StudyAbroadManagerId": 52,
//合同默认抬头
"ContractDefaultTitle": "JH-DZ-CD-",
//消息推送AppId
"PushAppId": "JiaHeJiaoYu",
//是否推送消息
"IsPushMessage": "1",
//超过下班时间60分钟不能打卡
"MoreThanMinutes": 60
"ConnectionStrings": {
"DefaultConnection": "server=192.168.20.214;user id=reborn;password=Reborn@2018;database=reborn_edu;CharSet=utf8mb4; Convert Zero Datetime=true; ",
"DefaultConnectionPName": "MySql.Data.MySqlClient",
"FinanceConnection": "server=192.168.20.214;user id=reborn;password=Reborn@2018;database=test_reborn_finance;CharSet=utf8mb4; Convert Zero Datetime=true; ",
"FinanceConnectionPName": "MySql.Data.MySqlClient",
"DataStatisticsConnection": "server=192.168.20.214;user id=reborn;password=Reborn@2018;database=reborn_datastatistics;CharSet=utf8mb4; Convert Zero Datetime=true; ",
"DataStatisticsConnectionPName": "MySql.Data.MySqlClient",
"LogConnection": "server=192.168.20.214;user id=reborn;password=Reborn@2018;database=reborn_sys;CharSet=utf8mb4; Convert Zero Datetime=true; ",
"LogConnectionPName": "MySql.Data.MySqlClient"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"SettlementRate": "0.60",
"JwtSecretKey": "@VIITTOREBORN*2018",
"JwtExpirTime": 86400,
"IsSendMsg": 2,
"AllowedHosts": "*",
"OpenValidation": "False",
"UploadSiteUrl": "http://192.168.1.36:8120",
"ViewFileSiteUrl": "https://viitto-1301420277.cos.ap-chengdu.myqcloud.com",
"ErpViewFileSiteUrl": "http://imgfile.oytour.com",
"Mongo": "mongodb://47.96.25.130:27017",
"MongoDBName": "Edu",
"WkHtmlToPdfPath": "D:/wkhtmltopdf/bin/",
"FinanceKey": "FinanceMallInsertToERPViitto2020",
"PaymentFinanceApi": "http://192.168.1.13:8083/api/Mall/InsertFinanceBatchForMallIn",
"IncomeFinanceApi": "http://192.168.20.9:8083/api/Mall/InsertFinanceBatchForMallOut",
"sTenpayNotifyUrl": "http://eduapi.oytour.com/api/WeChatPay/WxPayCallback", //下单回调地址
"sTenpayNotifyRefundUrl": "http://eduapi.oytour.com/api/WeChatPay/Refunds", //退款回调地址
"FinanceDateBase": "test_reborn_finance",
"RabbitMqConfig": {
"HostName": "47.96.25.130",
"VirtualHost": "/",
"Port": 5672,
"UserName": "guest",
"Password": "viitto2019",
"QueenName": "vt_sys_message_test"
},
"RedisSetting": {
"RedisServer": "47.96.23.199",
"RedisPort": "6379",
"RedisPwd": "Viitto2018"
},
"VirtualDirectory": "WebFile",
//未填写 未打分 下降比例
"OKRMatterValue": "30,100,100",
//是否是线上环境
"IsOnline": false,
//退课流程编号
"BackClassFlowId": 1,
//分区校长岗位编号
"SchoolPostId": 3,
//教务长
"JiaoWuZhang": 8,
//留学就业部门主管审核编号[王涛]
"StudyAbroadDirectorId": 64,
//留学就业部门负责人审核编号[姚顺先]
"StudyAbroadManagerId": 52,
//合同默认抬头
"ContractDefaultTitle": "JH-DZ-CD-",
//消息推送AppId
"PushAppId": "JiaHeJiaoYu",
//是否推送消息
"IsPushMessage": "1",
//超过下班时间60分钟不能打卡
"MoreThanMinutes": 60,
//连续缺课课时
"AbsentHours": 12
}
\ No newline at end of file
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