diff --git a/Edu.Common/Config.cs b/Edu.Common/Config.cs
index 0770f44f3d6d4fe3f70181f38ea9867246641cc2..a61d11559697153d09f05bb67e0290ca91d7e749 100644
--- a/Edu.Common/Config.cs
+++ b/Edu.Common/Config.cs
@@ -541,5 +541,51 @@ namespace Edu.Common
             }
         }
 
+
+        /// <summary>
+        /// 甲鹤教育接口请求地址
+        /// </summary>
+        public static string DmcMallApi
+        {
+            get
+            {
+                return ReadConfigKey("DmcMallApi");
+            }
+        }
+
+
+        /// <summary>
+        /// 甲鹤教育商户id
+        /// </summary>
+        public static string JHTenantId
+        {
+            get
+            {
+                return ReadConfigKey("JHTenantId");
+            }
+        }
+
+
+        /// <summary>
+        /// 甲鹤教育小程序id
+        /// </summary>
+        public static string JHMallBaseId
+        {
+            get
+            {
+                return ReadConfigKey("JHMallBaseId");
+            }
+        }
+
+        /// <summary>
+        /// 电商加密
+        /// </summary>
+        public static string MallJwtSecretKey
+        {
+            get
+            {
+                return ReadConfigKey("MallJwtSecretKey");
+            }
+        }
     }
 }
\ No newline at end of file
diff --git a/Edu.Common/Enum/ApiRequestFromEnum.cs b/Edu.Common/Enum/ApiRequestFromEnum.cs
index 1d7e533cb804c880c2a4b348174e523831601ebb..b44531752846ed8b932a569257fbbb700ff230ba 100644
--- a/Edu.Common/Enum/ApiRequestFromEnum.cs
+++ b/Edu.Common/Enum/ApiRequestFromEnum.cs
@@ -38,6 +38,13 @@ namespace Edu.Common.Enum
         [EnumField("ERP")]
         ERP =6,
 
+        /// <summary>
+        /// Mall【生成Token使用】
+        /// </summary>
+        [EnumField("Mall")]
+        Mall = 7,
+
+
         /// <summary>
         /// App学生端
         /// </summary>
diff --git a/Edu.Common/Enum/Course/FinanceConfigTypeEnum.cs b/Edu.Common/Enum/Course/FinanceConfigTypeEnum.cs
index 02f0e388289a9247e596c8eb0919445e66851f0e..a95e73b58228cd72e5cb6bc3a4d321bf411a859b 100644
--- a/Edu.Common/Enum/Course/FinanceConfigTypeEnum.cs
+++ b/Edu.Common/Enum/Course/FinanceConfigTypeEnum.cs
@@ -52,6 +52,18 @@ namespace Edu.Common.Enum.Course
         /// 学费收入
         /// </summary>
         [EnumField("学费收入")]
-        Tuition = 8
+        Tuition = 8,
+        /// <summary>
+        /// 活动收入(电商)
+        /// </summary>
+        [EnumField("活动收入")]
+        ActivityIncome = 9,
+
+        /// <summary>
+        /// 活动退款(电商)
+        /// </summary>
+        [EnumField("活动退款")]
+        ActivityExpenditure = 10,
+
     }
 }
diff --git a/Edu.Model/CacheModel/UserInfo.cs b/Edu.Model/CacheModel/UserInfo.cs
index 51c1c27c786f4326cd37155880cc5315204475e2..a661b439345d7ecfb06febe446bf3eb43713e02b 100644
--- a/Edu.Model/CacheModel/UserInfo.cs
+++ b/Edu.Model/CacheModel/UserInfo.cs
@@ -67,6 +67,22 @@ namespace Edu.Model.CacheModel
         /// </summary>
         public string ErpToken { get; set; }
 
+        /// <summary>
+        /// 电商-token
+        /// </summary>
+        public string MallToken { get; set; }
+
+        /// <summary>
+        /// 电商-JHTenantId
+        /// </summary>
+        public string JHTenantId { get; set; }
+
+        /// <summary>
+        /// 电商-JHMallBaseId
+        /// </summary>
+        public string JHMallBaseId { get; set; }
+
+
         /// <summary>
         /// 菜单列表
         /// </summary>
diff --git a/Edu.Model/ViewModel/Question/RB_Question_RoomUseLog_ViewModel.cs b/Edu.Model/ViewModel/Question/RB_Question_RoomUseLog_ViewModel.cs
index 797fcae087f9714704e3dd2a35e4523b596e5140..ac9acfbb1fe9371f02b59c03c531c8ef7a67532b 100644
--- a/Edu.Model/ViewModel/Question/RB_Question_RoomUseLog_ViewModel.cs
+++ b/Edu.Model/ViewModel/Question/RB_Question_RoomUseLog_ViewModel.cs
@@ -45,5 +45,20 @@ namespace Edu.Model.ViewModel.Question
         /// 间隔多少个15分钟
         /// </summary>
         public int IntervalNum { get; set; }
+
+        /// <summary>
+        /// 课程名称
+        /// </summary>
+        public string CourseName { get; set; }
+
+        /// <summary>
+        /// 课程进度
+        /// </summary>
+        public decimal CompleteProgress { get; set; }
+
+        /// <summary>
+        /// 学生
+        /// </summary>
+        public string StudentName { get; set; }
     }
 }
diff --git a/Edu.Module.Course/ClassModule.cs b/Edu.Module.Course/ClassModule.cs
index e0a78ec7c243214e19b1e57767b94d7b9680602c..01f026fd585475379af76e6f60ee52563163315e 100644
--- a/Edu.Module.Course/ClassModule.cs
+++ b/Edu.Module.Course/ClassModule.cs
@@ -1372,7 +1372,7 @@ namespace Edu.Module.Course
         public object GetClassPlanLogPageListModule(int pageIndex, int pageSize, out long rowsCount, RB_Class_Plan_ViewModel query)
         {
             List<object> result = new List<object>();
-            var list= class_PlanRepository.GetClassPlanLogPageListRepository(pageIndex, pageSize, out rowsCount, query);
+            var list = class_PlanRepository.GetClassPlanLogPageListRepository(pageIndex, pageSize, out rowsCount, query);
             if (list != null && list.Count > 0)
             {
                 List<RB_Class_Check_ViewModel> checkLogList = new List<RB_Class_Check_ViewModel>();
@@ -1421,7 +1421,7 @@ namespace Edu.Module.Course
                         MonthStr = item.ClassDate.ToString("MM"),
                         DayStr = item.ClassDate.ToString("dd"),
                         YearStr = item.ClassDate.ToString("yyyy"),
-                        TimeList=time
+                        TimeList = time
                     };
                     result.Add(planCheckObj);
                 }
@@ -1490,7 +1490,29 @@ namespace Edu.Module.Course
         /// <returns></returns>
         public List<RB_Class_Plan_ViewModel> GetClassPlanList_V2(RB_Class_Plan_ViewModel query)
         {
-            return class_PlanRepository.GetClassPlanList_V2(query);
+            var list = class_PlanRepository.GetClassPlanList_V2(query);
+
+
+            if (list != null && list.Any())
+            {
+                string ClassIds = string.Join(",", list.Distinct().Select(x => x.ClassId));
+                var orderStudentList = order_GuestRepository.GetList(new RB_Order_Guest_ViewModel()
+                {
+                    ClassIds = ClassIds,
+                    Group_Id = query.Group_Id,
+                    School_Id = -1
+                }).Where(x => x.GuestState == 1).ToList();
+
+                if (orderStudentList != null && orderStudentList.Any())
+                {
+                    foreach (var item in list)
+                    {
+                        item.GuestList = new List<RB_Order_Guest_ViewModel>();
+                        item.GuestList = orderStudentList.Where(x => x.ClassId == item.ClassId).ToList();
+                    }
+                }
+            }
+            return list;
         }
 
         /// <summary>
diff --git a/Edu.WebApi/Controllers/Course/ClassRoomController.cs b/Edu.WebApi/Controllers/Course/ClassRoomController.cs
index fe4afe259f08c031acb65563d9c601412e77c976..b95a88a4b3e3c1b76cc4cbc7846e41a5504014aa 100644
--- a/Edu.WebApi/Controllers/Course/ClassRoomController.cs
+++ b/Edu.WebApi/Controllers/Course/ClassRoomController.cs
@@ -277,7 +277,7 @@ namespace Edu.WebApi.Controllers.Course
                         InfoTime = item.CreateTime,
                         Type = item.ErrorType == 0 ? 1 : 2,
                         ClassStatus = -1,
-                        IntervalNum = IntervalNum
+                        IntervalNum = IntervalNum,
                     });
                 }
                 foreach (var item in timeList)
@@ -291,17 +291,22 @@ namespace Edu.WebApi.Controllers.Course
                     var planModel = roomList.Where(x => x.ClassPlanId == item.ClassPlanId).FirstOrDefault();
                     if (planModel != null && planModel.ClassPlanId > 0)
                     {
+                        var roomModel = roomList.Where(x => x.ClassPlanId == item.ClassPlanId).FirstOrDefault();
                         resultList.Add(new Model.ViewModel.Question.RB_Question_RoomUseLog_ViewModel
                         {
                             Id = item.ClassTimeId,
-                            Title = roomList.Where(x => x.ClassPlanId == item.ClassPlanId).FirstOrDefault()?.ClassName,
-                            Content = roomList.Where(x => x.ClassPlanId == item.ClassPlanId).FirstOrDefault()?.TeacherName,
+                            Title = roomModel?.ClassName,
+                            Content = roomModel?.TeacherName,
                             StartTime = item.StartTime,
                             EndTime = item.EndTime,
                             InfoTime = Convert.ToDateTime(planModel.ClassDate.ToString("yyyy-MM-dd ") + item.StartTime),
                             Type = 0,
                             ClassStatus = item.ClassStatus,
-                            IntervalNum = IntervalNum
+                            IntervalNum = IntervalNum,
+                            CourseName = roomModel?.CourseName,
+                            CompleteProgress = roomModel?.CompleteProgress ?? 0,
+                            StudentName = (roomModel != null && roomModel.GuestList != null && roomModel.GuestList.Any()) ? string.Join(",", roomModel.GuestList.Select(x => x.GuestName)) : ""
+
                         });
                     }
                 }
diff --git a/Edu.WebApi/Controllers/User/LoginController.cs b/Edu.WebApi/Controllers/User/LoginController.cs
index 36639b072a9f58f39d8ef92dea6bc88fd14a6326..3bfd2436545c02698134004f3dd0b5ac625fd2cd 100644
--- a/Edu.WebApi/Controllers/User/LoginController.cs
+++ b/Edu.WebApi/Controllers/User/LoginController.cs
@@ -2,7 +2,9 @@
 using System.Collections.Generic;
 using System.Linq;
 using Edu.Cache.User;
+using Edu.Common;
 using Edu.Common.API;
+using Edu.Common.Enum;
 using Edu.Common.Enum.User;
 using Edu.Common.Plugin;
 using Edu.Model.CacheModel;
@@ -108,6 +110,59 @@ namespace Edu.WebApi.Controllers.User
                 string token = WebApiTokenHelper.CreateToken(Common.GlobalKey.JWT_User_Key, eduUserInfo);
                 string erpToken = WebApiTokenHelper.CreateToken(Common.GlobalKey.JWT_ERP_User_Key, erpUserInfo);
 
+
+
+
+
+
+                #region 获取甲鹤教育Token
+                string JHTenantId = Config.JHTenantId;
+                string JHMallBaseId = Config.JHMallBaseId;
+
+
+                IUserInfoToken mallJHUserInfo = new ErpTokenUserInfo()
+                {
+                    requestFrom = Common.Enum.ApiRequestFromEnum.Mall,
+                    uid = JHTenantId,
+                    groupId = model.Group_Id
+                };
+              
+                #region JWT
+
+               // string mallToken = WebApiTokenHelper.CreateToken(Common.GlobalKey.JWT_Mall_User_Key, mallJHUserInfo);
+
+                #endregion
+
+                #endregion
+
+
+
+
+                #region 获取甲鹤教育Token
+
+
+                #region JWT
+                JWT.IDateTimeProvider provider2 = new JWT.UtcDateTimeProvider();
+                var now2 = provider2.GetNow().AddMinutes(-1);
+                var unixEpoch2 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); // or use JwtValidator.UnixEpoch
+                var secondsSinceEpoch2 = Math.Round((now2 - unixEpoch2).TotalSeconds);
+                var payload2 = new Dictionary<string, object>
+                                {
+                                        {"iat",secondsSinceEpoch2 },
+                                        {"exp",secondsSinceEpoch2+Config.JwtExpirTime},
+                                        {"mall_userInfoJH",mallJHUserInfo }
+                                };
+                JWT.Algorithms.IJwtAlgorithm algorithm2 = new JWT.Algorithms.HMACSHA256Algorithm();
+                JWT.IJsonSerializer serializer2 = new JWT.Serializers.JsonNetSerializer();
+                JWT.IBase64UrlEncoder urlEncoder2 = new JWT.JwtBase64UrlEncoder();
+                JWT.IJwtEncoder encoder2 = new JWT.JwtEncoder(algorithm2, serializer2, urlEncoder2);
+                string secret2 = Config.MallJwtSecretKey;
+                string malltokenJH = encoder2.Encode(payload2, secret2);
+                #endregion
+
+                #endregion
+
+
                 var treeList = menuModule.GetPostMenuTreeModule(new Model.ViewModel.System.RB_Menu_ViewModel()
                 {
                     MenuType = accountType
@@ -130,6 +185,9 @@ namespace Edu.WebApi.Controllers.User
                     SchoolName = model.SchoolName,
                     Token = token,
                     ErpToken = erpToken,
+                    MallToken = malltokenJH,
+                    JHMallBaseId = JHMallBaseId,
+                    JHTenantId = JHTenantId,
                     MenuList = treeList,
                     UserCenterList = userCenterList,
                     GroupLogo = model.GroupLogo,
diff --git a/Edu.WebApi/Controllers/WeChatPay/WeChatPayController.cs b/Edu.WebApi/Controllers/WeChatPay/WeChatPayController.cs
index a6a006f6780fed6e4d208424b5dace9cbee40998..44844a6b37c96f9f8b606e3f7fdc8385fa434d26 100644
--- a/Edu.WebApi/Controllers/WeChatPay/WeChatPayController.cs
+++ b/Edu.WebApi/Controllers/WeChatPay/WeChatPayController.cs
@@ -149,7 +149,7 @@ namespace Edu.WebApi.Controllers.WeChatPay
                 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();
+                var oldOrderRecordModel = educationContractModule.GetOrderRecordList(new RB_Finance_OrderRecord { ContractId = contractId, OutTradeNo = payModel.out_trade_no, Type = 1 }).FirstOrDefault();
                 if (oldOrderRecordModel == null || oldOrderRecordModel.ID == 0)
                 {
                     isAdd = true;
@@ -338,7 +338,7 @@ namespace Edu.WebApi.Controllers.WeChatPay
                 contractId = Convert.ToInt32(outTradeNo[17..]);
             }
             var orderModle = educationContractModule.GetEducationContractModule(contractId);
-            var orderRecordModel = educationContractModule.GetOrderRecordList(new RB_Finance_OrderRecord { ContractId = contractId, OutTradeNo = outTradeNo }).FirstOrDefault();
+            var orderRecordModel = educationContractModule.GetOrderRecordList(new RB_Finance_OrderRecord { ContractId = contractId, OutTradeNo = outTradeNo, Type = 2 }).FirstOrDefault();
             if (orderRecordModel == null)
             {
                 return ApiResult.Failed("未查询到当前商户订单号对应的支付记录");
@@ -433,7 +433,7 @@ namespace Edu.WebApi.Controllers.WeChatPay
                 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();
+                var oldOrderRecordModel = educationContractModule.GetOrderRecordList(new RB_Finance_OrderRecord { ContractId = contractId, OutTradeNo = payModel.out_trade_no, Type = 2 }).FirstOrDefault();
                 if (oldOrderRecordModel == null || oldOrderRecordModel.ID == 0)
                 {
                     isAdd = true;
@@ -442,7 +442,7 @@ namespace Edu.WebApi.Controllers.WeChatPay
                 {
                     var orderModle = educationContractModule.GetEducationContractModule(contractId);
                     var orderModel = orderModule.GetClassOrderInfoModule(orderModle.OrderId);
-                    var payOrderRecordModel = educationContractModule.GetOrderRecordList(new RB_Finance_OrderRecord { ContractId = contractId, OutTradeNo = payModel.out_trade_no }).FirstOrDefault();
+                    var payOrderRecordModel = educationContractModule.GetOrderRecordList(new RB_Finance_OrderRecord { ContractId = contractId, OutTradeNo = payModel.out_trade_no, Type = 1 }).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) * (Convert.ToDecimal(payModel.amount.payer_total) / 100)), 2, MidpointRounding.AwayFromZero);//手续费
                     RB_Online_Trade_Detail model = new RB_Online_Trade_Detail();