using Edu.AOP.CustomerAttribute;
using Edu.Cache.User;
using Edu.Common;
using Edu.Common.Enum.Course;
using Edu.Common.Enum.EduTask;
using Edu.Common.Enum.Finance;
using Edu.Common.Plugin;
using Edu.Model.Entity.Contract;
using Edu.Model.Entity.Course;
using Edu.Model.Entity.EduTask;
using Edu.Model.Entity.Sell;
using Edu.Model.ViewModel.Contract;
using Edu.Model.ViewModel.Course;
using Edu.Model.ViewModel.EduTask;
using Edu.Model.ViewModel.Grade;
using Edu.Model.ViewModel.Sell;
using Edu.Module.Course;
using Edu.Repository.Contract;
using Edu.Repository.Course;
using Edu.Repository.EduTask;
using Edu.Repository.Grade;
using Edu.Repository.Log;
using Edu.Repository.Sell;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using VT.FW.DB;
namespace Edu.Module.EduTask
{
///
/// 订单转班、分拆处理类
///
public class OrderChangeModule
{
///
/// 订单转班、分拆仓储层对象
///
private readonly RB_Order_ChangeRepository order_ChangeRepository = new RB_Order_ChangeRepository();
///
/// 教务单据仓储层对象
///
private readonly RB_Education_ReceiptRepository education_ReceiptRepository = new RB_Education_ReceiptRepository();
///
/// 订单仓储层对象
///
private readonly RB_OrderRepository orderRepository = new RB_OrderRepository();
///
/// 班级仓储层对象
///
private readonly RB_ClassRepository classRepository = new RB_ClassRepository();
///
/// 课程仓储层对象
///
private readonly RB_CourseRepository courseRepository = new RB_CourseRepository();
///
/// 订单处理类对象
///
private readonly OrderModule orderModule = new OrderModule();
///
/// 课程签到记录表
///
private readonly RB_Class_CheckRepository classCheckRepository = new RB_Class_CheckRepository();
///
/// 订单学员仓储层对象
///
private readonly RB_Order_GuestRepository guestRepository = new RB_Order_GuestRepository();
///
/// 用户日志
///
private readonly RB_User_ChangeLogRepository changeLogRepository = new RB_User_ChangeLogRepository();
///
/// 上课计划+上课时间仓储对象
///
private readonly RB_Class_PlanRepository class_PlanRepository = new RB_Class_PlanRepository();
///
/// 合同仓储层对象
///
private readonly RB_Education_ContractRepository education_ContractRepository = new RB_Education_ContractRepository();
///
/// 订单拆分仓储层对象
///
private readonly RB_Order_SplitDetailsRepository splitDetailsRepository = new RB_Order_SplitDetailsRepository();
///
/// 新增订单转班
///
///
///
[TransactionCallHandler]
public virtual bool SetOrderChangeModule(RB_Order_Change_ViewModel model,string receiptFile, out string message)
{
message = "";
bool flag = false;
var newId = order_ChangeRepository.Insert(model);
model.Id = newId;
flag = newId > 0;
if (flag)
{
var educationReceipt = new RB_Education_Receipt()
{
Id = 0,
Title = "订单转班申请",
ReceiptType = Common.Enum.Finance.ReceiptTypeEnum.OrderTransClass,
RelationId = newId,
OrderId = model.SourceOrderId,
ClassId = model.NewClassId,
Group_Id = model.Group_Id,
School_Id = model.School_Id,
CreateBy = model.CreateBy,
CreateTime = model.CreateTime,
UpdateBy = model.UpdateBy,
UpdateTime = model.UpdateTime,
VerifyStatus = Common.Enum.EduTask.EduTaskRrocessStatus.NotAudit,
IsCreate = 0,
EffectiveDate = model.EffectiveDate,
ReceiptFile= receiptFile
};
flag = education_ReceiptRepository.SetEducationReceiptRepository(educationReceipt, out message);
Dictionary guestFileds = new Dictionary()
{
{nameof(RB_Order_Guest_ViewModel.GuestState),(int)GuestStateEnum.TransferClassesApplyIng}
};
if (flag)
{
flag = guestRepository.Update(guestFileds, new WhereHelper(nameof(RB_Order_Guest_ViewModel.Id), model.OrderGuestId));
}
}
return flag;
}
///
/// 学员完成学习分钟数
///
/// 学员编号
///
public GuestFinishMinute_ViewModel GetGuestFinishMinutesModule(string guestIds)
{
var model = classCheckRepository.GetGuestFinishMinutesRepository(guestIds)?.FirstOrDefault();
if (model == null)
{
model = new GuestFinishMinute_ViewModel();
}
return model;
}
///
/// 计算当前时间到订单生效时间有效课时数
///
///
///
public decimal GetClassPlanTimeHoursModule(int ClassId, string StartTime, string EndTime)
{
var list = class_PlanRepository.GetClassPlanListExtRepository(new RB_Class_Plan_ViewModel()
{
ClassId = ClassId,
StartTime = StartTime,
EndTime = EndTime
});
return list?.Sum(qitem => qitem.TimeHour) ?? 0;
}
///
/// 定时更新转班订单数据
///
public void GetChangeOrderListModule()
{
var list = education_ReceiptRepository.GetEducationReceiptListRepository(new EducationReceiptQuery()
{
ReceiptType = (int)ReceiptTypeEnum.OrderTransClass,
VerifyStatus = (int)EduTaskRrocessStatus.AuditThrough,
QEffectiveDate = Common.ConvertHelper.FormatDate(DateTime.Now)
});
if (list != null && list.Count > 0)
{
foreach (var item in list)
{
if (item.IsCreate == 0)
{
UpdateOrderChangeModule(item);
}
}
}
}
///
/// 订单转班处理类方法
///
///
public bool UpdateOrderChangeModule(RB_Education_Receipt receiptModel)
{
bool flag = false;
if (receiptModel.RelationId > 0)
{
var orderChangeModel = order_ChangeRepository.GetEntity(receiptModel.RelationId);
if (orderChangeModel != null && orderChangeModel.Id > 0)
{
//if (orderChangeModel.EffectiveDate < DateTime.Now)
//{
// return false;
//}
var oldOrderModel = orderRepository.GetEntity(orderChangeModel.SourceOrderId);
var classList = classRepository.GetClassListRepository(new RB_Class_ViewModel()
{
Q_ClassIds = orderChangeModel.NewClassId + "," + oldOrderModel.ClassId
});
var oldClassModel = classList?.Where(qitem => qitem.ClassId == oldOrderModel.ClassId)?.FirstOrDefault() ?? new RB_Class_ViewModel();
var newClassModel = classList?.Where(qitem => qitem.ClassId == orderChangeModel.NewClassId)?.FirstOrDefault() ?? new RB_Class_ViewModel();
var newCourseModel = courseRepository.GetEntity(orderChangeModel.NewCourseId);
var userInfo = UserReidsCache.GetUserLoginInfo(oldOrderModel.EnterID);
var guestClassHours = GetGuestFinishMinutesModule(orderChangeModel.OrderGuestId.ToString());
var guestModel = guestRepository.GetEntity(orderChangeModel.OrderGuestId);
//计算课时单价
//老订单应收
//单个人员的课时单价
var unitPrice = (oldOrderModel.Income + oldOrderModel.PlatformTax) / oldOrderModel.GuestNum / guestModel.TotalHours;
//单人已完成应收
var singleFinishPrice = Math.Round(guestClassHours.FinishClassHours * unitPrice, 2);
//单人应收
var singlePreferPrice = Math.Round(guestModel.TotalHours * unitPrice, 2);
//原订单应收=原订单应收-单人应收+单人完成
decimal oldPreferPrice = oldOrderModel.PreferPrice - singlePreferPrice + singleFinishPrice;
//新订单应收和退款一致
decimal newPreferPrice = singlePreferPrice - singleFinishPrice;
#region 生成新订单
var orderModel = new RB_Order_ViewModel()
{
OrderId = 0,
ClassId = orderChangeModel.NewClassId,//班级编号
GuestNum = 1,
OrderSource = oldOrderModel.OrderSource,
OrderType = oldOrderModel.OrderType,
Class_Price = newCourseModel.SellPrice,//单价
Unit_Price = newCourseModel.SellPrice,//成交单价
PreferPrice = newPreferPrice,//应收,
Income = 0,
HelpEnterId = 0,
GeneralOccupation = "",
EduOccupation = "",
SaleRemark = orderChangeModel.Remarks,//销售备注
SourceId = 0,
IsLessPrice = 0,
LessPrice = 0,
PerLessMoney=0,
DiscountMoney=0,
PerDiscountMoney=0,
OrderNature = oldOrderModel.OrderNature,
OldPreferPrice = newPreferPrice,//应收,
CourseId = orderChangeModel.NewCourseId,
StartClassHours = 0,
UpOrderId = 0,
VisitorReserveId = 0,
JoinType = Common.Enum.Sale.OrderJoinTypeEnum.TransOrder,
TargetJoinType = Common.Enum.Sale.OrderJoinTypeEnum.Normal,
EffectTime = orderChangeModel.EffectiveDate,
};
orderModel.SourceOrderId = orderChangeModel.SourceOrderId;
orderModel.Group_Id = userInfo.Group_Id;
orderModel.School_Id = userInfo.School_Id;
orderModel.Dept_Id = userInfo.DeptId;
orderModel.OrderForm = OrderFormEnum.Computer;
orderModel.EnterID = userInfo.Id;
orderModel.OrderState = OrderStateEnum.Normal;
orderModel.TradeWay = TradeWayEnum.OnLine;
orderModel.CreateBy = userInfo.Id;
orderModel.CreateTime = DateTime.Now;
orderModel.UpdateBy = userInfo.Id;
orderModel.UpdateTime = DateTime.Now;
orderModel.OldGuestId = orderChangeModel.OrderGuestId;
if (oldOrderModel.FirstOrderId ==0)
{
orderModel.FirstOrderId = oldOrderModel.OrderId;
}
else
{
orderModel.FirstOrderId = oldOrderModel.FirstOrderId;
}
flag = orderModule.SetClassOrderCommonModule(orderModel, userInfo, false, out string message);
#endregion
if (flag)
{
if (oldOrderModel.FirstOrderId > 0)
{
//添加关联记录
splitDetailsRepository.Insert(new RB_Order_SplitDetails()
{
OldOrderId = orderModel.FirstOrderId,
S_OrderId = oldOrderModel.OrderId,
S_JoinType = oldOrderModel.JoinType,
S_ClassId = oldOrderModel.ClassId,
T_OrderId = orderModel.OrderId,
T_JoinType = orderModel.JoinType,
T_ClassId = orderModel.ClassId,
CreateBy = orderModel.CreateBy,
CreateTime = DateTime.Now
});
}
#region 修改老订单 【目标订单和应收】
Dictionary fileds = new Dictionary()
{
{nameof(RB_Order_ViewModel.TargetOrderId),orderModel.OrderId },
{nameof(RB_Order_ViewModel.PreferPrice),oldPreferPrice },
{nameof(RB_Order_ViewModel.TargetJoinType),(int) Common.Enum.Sale.OrderJoinTypeEnum.TransOrder },
{nameof(RB_Order_ViewModel.FirstOrderId),orderModel.FirstOrderId },
};
flag = orderRepository.Update(fileds, new WhereHelper(nameof(RB_Order_ViewModel.OrderId), orderChangeModel.SourceOrderId));
#endregion
#region 修改老学员课时相关
Dictionary guestFileds = new Dictionary()
{
{nameof(RB_Order_Guest_ViewModel.TotalHours),guestClassHours.FinishClassHours },
{nameof(RB_Order_Guest_ViewModel.GuestState),(int)GuestStateEnum.Graduate },
};
if (flag)
{
flag = guestRepository.Update(guestFileds, new WhereHelper(nameof(RB_Order_Guest_ViewModel.Id), orderChangeModel.OrderGuestId));
}
#endregion
#region 新增老订单合同和新的转班合同
oldOrderModel.PreferPrice = oldPreferPrice;
var oldContract =education_ContractRepository.GetList(new RB_Education_Contract_ViewModel()
{
OrderId = orderChangeModel.SourceOrderId,
GuestId = orderChangeModel.OrderGuestId,
Status=-1,
}).Where(qitem => qitem.Status == 0 || qitem.Status == 1 || qitem.Status == 2)?.FirstOrDefault();
//创建老订单合同
CreateContract(oldOrderModel, newCourseModel, oldContract, orderChangeModel.OrderGuestId);
//创建新订单合同
CreateContract(orderModel, newCourseModel, oldContract, orderModel.NewGuestId);
#endregion
#region 生成财务单据
if (flag)
{
var changeModel = new OrderChangeFinace()
{
ChangeType = 1,
InCome = newPreferPrice,
GuestId = guestModel.Id,
GuestName = guestModel.GuestName,
UserInfo = userInfo,
ClassId = oldOrderModel.ClassId,
ClassName = oldClassModel.ClassName,
Class_School_Id = oldClassModel.School_Id,
SName = oldClassModel.SchoolName,
OrderId = oldOrderModel.OrderId,
};
var RelevanceFrId = CreateExpenditure(changeModel, out string msg1);
var changeModel2 = new OrderChangeFinace()
{
ChangeType = 1,
InCome = newPreferPrice,
GuestId = orderModel.NewGuestId,
GuestName = guestModel.GuestName,
UserInfo = userInfo,
ClassId = orderModel.ClassId,
ClassName = newClassModel.ClassName,
Class_School_Id = newClassModel.School_Id,
SName = newClassModel.SchoolName,
OrderId = orderModel.OrderId,
ReFinanceId = RelevanceFrId
};
var InCome = CreateInCome(changeModel2, out string msg2);
flag = RelevanceFrId > 0 && InCome > 0;
}
#endregion
}
if (flag)
{
Dictionary fileds = new Dictionary()
{
{nameof(RB_Education_Receipt.IsCreate),1}
};
flag = education_ReceiptRepository.Update(fileds, new WhereHelper(nameof(RB_Education_Receipt.Id), receiptModel.Id));
}
}
}
return flag;
}
///
/// 转班、分拆收入
///
public int CreateInCome(OrderChangeFinace change, out string msg)
{
msg = "";
#region 新增财务单据
var detailList = new List