Bläddra i källkod

京东账号增加工作时间设置;

dodo hold 2 år sedan
förälder
incheckning
55fd3c3662

+ 9 - 1
molilian.api/Controllers/admin/JdUnionController.cs

@@ -143,12 +143,20 @@ namespace molilian.api.Controllers
                 case "enable_coupon":
                 case "status":
                     bool bVal = val.Equals("True");
-                    result = new DBContext.Table("tk_pool")
+                    result = new DBContext.Table("jd_pool")
                            .Add(name, bVal)
                            .Add("last_time", DateTime.Now)
                            .Where("id=@id", new { id })
                            .Update();
                     break;
+                case "time_range":
+                    int.TryParse(val, out int iVal);
+                    result = new DBContext.Table("jd_pool")
+                           .Add(name, iVal)
+                           .Add("last_time", DateTime.Now)
+                           .Where("id=@id", new { id })
+                           .Update();
+                    break;
                 default:
                     return new APIResult(new { data = new { success = false, msg = "更新失败,未授权操作" } });
             }

+ 4 - 0
molilian.api/Controllers/admin/TaobaoController.cs

@@ -627,6 +627,7 @@ namespace molilian.api.Controllers
 
                     var combinedKeys = keys.Union(message_keys).ToList();
                     combinedKeys.RemoveAll(item => item == "fail");
+                    combinedKeys.RemoveAll(item => item == "OK");
 
                     foreach (var keyname in combinedKeys)
                     {
@@ -642,6 +643,7 @@ namespace molilian.api.Controllers
 
                     foreach (var keyname in reason_keys)
                     {
+                        if ("没有优惠券".Equals(keyname)) continue;
                         cacheKey = $":{total_key}:{accountName}:{keyname}:{_report_date}";
                         int value = TkLogCore.GetTotal(cacheKey, false);
                         if (value < 50) continue;
@@ -683,6 +685,7 @@ namespace molilian.api.Controllers
 
                 var combinedKeys = keys.Union(message_keys).ToList();
                 combinedKeys.RemoveAll(item => item == "fail");
+                combinedKeys.RemoveAll(item => item == "OK");
 
 
                 foreach (var keyname in combinedKeys)
@@ -699,6 +702,7 @@ namespace molilian.api.Controllers
 
                 foreach (var keyname in reason_keys)
                 {
+                    if ("没有优惠券".Equals(keyname)) continue;
                     cacheKey = $":{total_key}:{accountName}:{keyname}:{_report_date}";
                     int value = TkLogCore.GetTotal(cacheKey);
                     if (value == 0) continue;

+ 10 - 0
molilian.api/Controllers/public/TaskController.cs

@@ -263,6 +263,16 @@ namespace molilian.api.Controllers
                     AlimamaPlus.AllDailyLogs(intervalDay);
                 }
             }
+
+            //tool_total
+            //jd_parse_total
+            //total
+            //coupon_total
+            //parse_total
+
+
+
+
             catch (Exception ex)
             {
                 string message = $"【报表接口异常】DailyLogs\n{ex.Message}\n{ex.StackTrace}";

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
molilian.api/Properties/PublishProfiles/https___ccr.ccs.tencentyun.com_shaobin.pubxml.user


+ 1 - 1
molilian.api/Properties/launchSettings.json

@@ -15,7 +15,7 @@
         "CenterDB": "",
         "CenterRedis": "",
       },
-      "environmentVariables2": {
+      "environmentVariables1": {
         "ASPNETCORE_ENVIRONMENT": "Development",
         "EndPoint": "cadmin",
         "NtfyServer": "https://ntfy.yunhui800.com/5Sq9BytXXM5WDY3G",

+ 8 - 2
molilian.core/Core/admin/ChartDataCore.cs

@@ -41,6 +41,7 @@ namespace molilian.core
 
                 var combinedKeys = keys.Union(message_keys).ToList();
                 combinedKeys.RemoveAll(item => item == "fail");
+                combinedKeys.RemoveAll(item => item == "OK");
 
                 foreach (var keyname in combinedKeys)
                 {
@@ -61,9 +62,10 @@ namespace molilian.core
 
                 foreach (var keyname in reason_keys)
                 {
+                    if ("没有优惠券".Equals(keyname)) continue;
                     cacheKey = $":{total_key}:{accountName}:{keyname}:{report_date}";
                     int value = TkLogCore.GetTotal(cacheKey);
-                    if (value < 50) continue;
+                    //if (value < 50) continue;
                     result.data2.Add(new ChartDataItem
                     {
                         name = keyname,
@@ -111,6 +113,8 @@ namespace molilian.core
 
                 foreach (var keyname in reason_keys)
                 {
+                    if ("没有优惠券".Equals(keyname)) continue;
+
                     cacheKey = $":{total_key}:{accountName}:{keyname}:{report_date}";
                     int value = TkLogCore.GetTotal(cacheKey);
                     //if (value < 50) continue;
@@ -162,9 +166,11 @@ namespace molilian.core
 
                 foreach (var keyname in reason_keys)
                 {
+                    if ("没有优惠券".Equals(keyname)) continue;
+
                     cacheKey = $":{total_key}:{accountName}:{keyname}:{report_date}";
                     int value = TkLogCore.GetTotal(cacheKey, false);
-                    if (value < 50) continue;
+                    //if (value < 50) continue;
                     result.data2.Add(new ChartDataItem
                     {
                         name = keyname,

+ 17 - 4
molilian.core/Core/taoke/JdPoolCore.cs

@@ -48,11 +48,11 @@ namespace molilian.core
         }
 
 
-        public static JdPoolDTO? GetOne(int id)
+        public static JdPoolDTO? GetOne(int id, JdAction action)
         {
             var list = List();
             if (!list.Any()) return null;
-            return list.Where(e => e.id == id).FirstOrDefault();
+            return list.Where(e => e.id == id && IsNotExceedDailyIncomeLimit(e, action)).FirstOrDefault();
         }
 
         //internal static void SaveIncomeAmt(int accountId, decimal income_amt)
@@ -132,7 +132,7 @@ namespace molilian.core
                         node.redis_server = "8.138.110.158:6379,password=pKBiS4ka2IpXayIdcx00,defaultDatabase=0,idleTimeout=20000,preheat=3,tryit=2,ssl=false,prefix=webhook";
                         break;
                     case "coupon1":
-                        node.redis_server = "c1api.molilian.com:6379,password=pKBiS4ka2IpXayIdcx00,defaultDatabase=0,idleTimeout=20000,preheat=3,tryit=2,ssl=false,prefix=webhook";
+                        node.redis_server = "c1api.molilian.com:6379,password=pKBiS4ka2IpXayIdcx00,defaultDatabase=0,idleTimeout=20000,preheat=3,tryit=2,ssl=false,prefix=coupon";
                         break;
                     default: return 0;
                 }
@@ -177,7 +177,9 @@ namespace molilian.core
                     if (!item.enable_coupon) return false;
                     break;
             }
-            //return true;
+
+            // 使用初始化参数创建工作时间表
+            if (!new WorkSchedule(item.time_range).IsWorkHour()) return false;
 
             if (item.daily_calls_limit > 0)
             {
@@ -206,6 +208,17 @@ namespace molilian.core
                         .Where("status=@status", new { status = 1 })
                         .Select<JdPoolDTO>();
                     if (list == null) return default;
+
+
+                    _calls = new Dictionary<string, int>();
+                    foreach (var item in list)
+                    {
+                        string key = $"{item.id}:{DateTime.Now:yyyyMMddHH}";
+                        _calls.TryAdd(key, item.current_hourly_calls);
+
+                        key = $"{item.id}:{DateTime.Now:yyyyMMddHH}";
+                        _calls.TryAdd(key, item.current_daily_calls);
+                    }
                     RedisHelper.Set(cache_key, list, 30 * 86400);
                 }
             }

+ 29 - 1
molilian.core/Core/taoke/TkLogCore.cs

@@ -662,6 +662,10 @@ namespace molilian.core
                 RedisHelper.IncrBy($":total:{accountName}:{message}:{DateTime.Now:yyyyMM}");
                 RedisHelper.IncrBy($":total:{accountName}:{message}:{DateTime.Now:yyyyMMdd}");
                 RedisHelper.IncrBy($":total:{accountName}:{message}:{DateTime.Now:yyyyMMddHH}");
+
+                RedisHelper.IncrBy($":total:{accountName}:message:{message}:{DateTime.Now:yyyyMM}");
+                RedisHelper.IncrBy($":total:{accountName}:message:{message}:{DateTime.Now:yyyyMMdd}");
+                RedisHelper.IncrBy($":total:{accountName}:message:{message}:{DateTime.Now:yyyyMMddHH}");
             }
 
             if (!string.IsNullOrEmpty(reason))
@@ -673,6 +677,11 @@ namespace molilian.core
                 RedisHelper.IncrBy($":total:{accountName}:{reason}:{DateTime.Now:yyyyMM}");
                 RedisHelper.IncrBy($":total:{accountName}:{reason}:{DateTime.Now:yyyyMMdd}");
                 RedisHelper.IncrBy($":total:{accountName}:{reason}:{DateTime.Now:yyyyMMddHH}");
+
+
+                RedisHelper.IncrBy($":total:{accountName}:reason:{reason}:{DateTime.Now:yyyyMM}");
+                RedisHelper.IncrBy($":total:{accountName}:reason:{reason}:{DateTime.Now:yyyyMMdd}");
+                RedisHelper.IncrBy($":total:{accountName}:reason:{reason}:{DateTime.Now:yyyyMMddHH}");
             }
 
         }
@@ -750,6 +759,9 @@ namespace molilian.core
                 RedisHelper.IncrBy($":parse_total:{accountName}:{message}:{DateTime.Now:yyyyMM}");
                 RedisHelper.IncrBy($":parse_total:{accountName}:{message}:{DateTime.Now:yyyyMMdd}");
                 RedisHelper.IncrBy($":parse_total:{accountName}:{message}:{DateTime.Now:yyyyMMddHH}");
+                RedisHelper.IncrBy($":parse_total:{accountName}:message:{message}:{DateTime.Now:yyyyMM}");
+                RedisHelper.IncrBy($":parse_total:{accountName}:message:{message}:{DateTime.Now:yyyyMMdd}");
+                RedisHelper.IncrBy($":parse_total:{accountName}:message:{message}:{DateTime.Now:yyyyMMddHH}");
             }
 
             if (!string.IsNullOrEmpty(reason))
@@ -761,6 +773,10 @@ namespace molilian.core
                 RedisHelper.IncrBy($":parse_total:{accountName}:{reason}:{DateTime.Now:yyyyMM}");
                 RedisHelper.IncrBy($":parse_total:{accountName}:{reason}:{DateTime.Now:yyyyMMdd}");
                 RedisHelper.IncrBy($":parse_total:{accountName}:{reason}:{DateTime.Now:yyyyMMddHH}");
+
+                RedisHelper.IncrBy($":parse_total:{accountName}:reason:{reason}:{DateTime.Now:yyyyMM}");
+                RedisHelper.IncrBy($":parse_total:{accountName}:reason:{reason}:{DateTime.Now:yyyyMMdd}");
+                RedisHelper.IncrBy($":parse_total:{accountName}:reason:{reason}:{DateTime.Now:yyyyMMddHH}");
             }
         }
 
@@ -792,6 +808,9 @@ namespace molilian.core
                 RedisHelper.IncrBy($":promotion_total:{accountName}:{message}:{DateTime.Now:yyyyMM}");
                 RedisHelper.IncrBy($":promotion_total:{accountName}:{message}:{DateTime.Now:yyyyMMdd}");
                 RedisHelper.IncrBy($":promotion_total:{accountName}:{message}:{DateTime.Now:yyyyMMddHH}");
+                RedisHelper.IncrBy($":promotion_total:{accountName}:message:{message}:{DateTime.Now:yyyyMM}");
+                RedisHelper.IncrBy($":promotion_total:{accountName}:message:{message}:{DateTime.Now:yyyyMMdd}");
+                RedisHelper.IncrBy($":promotion_total:{accountName}:message:{message}:{DateTime.Now:yyyyMMddHH}");
             }
 
             if (!string.IsNullOrEmpty(reason))
@@ -803,6 +822,9 @@ namespace molilian.core
                 RedisHelper.IncrBy($":promotion_total:{accountName}:{reason}:{DateTime.Now:yyyyMM}");
                 RedisHelper.IncrBy($":promotion_total:{accountName}:{reason}:{DateTime.Now:yyyyMMdd}");
                 RedisHelper.IncrBy($":promotion_total:{accountName}:{reason}:{DateTime.Now:yyyyMMddHH}");
+                RedisHelper.IncrBy($":promotion_total:{accountName}:reason:{reason}:{DateTime.Now:yyyyMM}");
+                RedisHelper.IncrBy($":promotion_total:{accountName}:reason:{reason}:{DateTime.Now:yyyyMMdd}");
+                RedisHelper.IncrBy($":promotion_total:{accountName}:reason:{reason}:{DateTime.Now:yyyyMMddHH}");
             }
         }
 
@@ -839,6 +861,9 @@ namespace molilian.core
                 RedisHelper.IncrBy($":coupon_total:{accountName}:{message}:{DateTime.Now:yyyyMM}");
                 RedisHelper.IncrBy($":coupon_total:{accountName}:{message}:{DateTime.Now:yyyyMMdd}");
                 RedisHelper.IncrBy($":coupon_total:{accountName}:{message}:{DateTime.Now:yyyyMMddHH}");
+                RedisHelper.IncrBy($":coupon_total:{accountName}:message:{message}:{DateTime.Now:yyyyMM}");
+                RedisHelper.IncrBy($":coupon_total:{accountName}:message:{message}:{DateTime.Now:yyyyMMdd}");
+                RedisHelper.IncrBy($":coupon_total:{accountName}:message:{message}:{DateTime.Now:yyyyMMddHH}");
             }
 
             if (!string.IsNullOrEmpty(reason))
@@ -850,6 +875,9 @@ namespace molilian.core
                 RedisHelper.IncrBy($":coupon_total:{accountName}:{reason}:{DateTime.Now:yyyyMM}");
                 RedisHelper.IncrBy($":coupon_total:{accountName}:{reason}:{DateTime.Now:yyyyMMdd}");
                 RedisHelper.IncrBy($":coupon_total:{accountName}:{reason}:{DateTime.Now:yyyyMMddHH}");
+                RedisHelper.IncrBy($":coupon_total:{accountName}:reason:{reason}:{DateTime.Now:yyyyMM}");
+                RedisHelper.IncrBy($":coupon_total:{accountName}:reason:{reason}:{DateTime.Now:yyyyMMdd}");
+                RedisHelper.IncrBy($":coupon_total:{accountName}:reason:{reason}:{DateTime.Now:yyyyMMddHH}");
             }
 
         }
@@ -931,7 +959,7 @@ namespace molilian.core
                         node.redis_server = "8.138.110.158:6379,password=pKBiS4ka2IpXayIdcx00,defaultDatabase=0,idleTimeout=20000,preheat=3,tryit=2,ssl=false,prefix=webhook";
                         break;
                     case "coupon1":
-                        node.redis_server = "c1api.molilian.com:6379,password=pKBiS4ka2IpXayIdcx00,defaultDatabase=0,idleTimeout=20000,preheat=3,tryit=2,ssl=false,prefix=webhook";
+                        node.redis_server = "c1api.molilian.com:6379,password=pKBiS4ka2IpXayIdcx00,defaultDatabase=0,idleTimeout=20000,preheat=3,tryit=2,ssl=false,prefix=coupon";
                         break;
                     default: return [];
                 }

+ 2 - 2
molilian.core/Core/taoke/UnionCouponCore.cs

@@ -207,8 +207,8 @@ namespace molilian.core
                 if (result.success && result.couponAmount == 0)
                 {
                     result.success = false;
-                    result.message = "放弃转链";
-                    result.reason = "没有优惠券";
+                    result.message = "没有优惠券";
+                    result.reason = "";
                 }
             }
             catch (Exception ex)

+ 14 - 56
molilian.core/Core/taoke/UnionParseCore.cs

@@ -150,48 +150,6 @@ namespace molilian.core
             try
             {
                 string reason = string.Empty;
-                //============================== 放弃转链-平台错误 ==============================
-                //bool is_other = await AlimamaPlus.OtherPlatformAsync(content);
-                //if (is_other)
-                //{
-                //    result.success = false;
-                //    result.message = "放弃转链";
-                //    result.reason = "初步筛选";
-                //    result.itemName = "";
-                //    result.deeplink_url = "";
-
-                //    _ = TkLogCore.ParseLogAsync(result);
-                //    return TaobaoParseOutput(result, swData, new
-                //    {
-                //        result.success,
-                //        result.message,
-                //        result.content,
-                //        result.itemName,
-                //        result.deeplink_url,
-                //    });
-                //}
-
-
-
-                ////一眼要排除
-                //if (content.Contains("bmlxkyy.com"))
-                //{
-                //    result.success = false;
-                //    result.message = "放弃转链";
-                //    result.reason = "初步筛选";
-                //    result.itemName = "";
-                //    result.deeplink_url = "";
-
-                //    _ = TkLogCore.ParseLogAsync(result);
-                //    return TaobaoParseOutput(result, swData, new
-                //    {
-                //        result.success,
-                //        result.message,
-                //        result.content,
-                //        result.itemName,
-                //        result.deeplink_url,
-                //    });
-                //}
 
                 var config = TkConfigCore.Get();
                 var arr = config.tk_whitelist_regular.Split('\n')
@@ -463,20 +421,20 @@ namespace molilian.core
                     return JdParseOutput(result);
                 }
 
-//                bool is_ignore2 = JdUnionPlus.FlowControlIgnoreRequest(config, out reason);
-//#if DEBUG
-//                is_ignore2 = false;
-//#endif
-//                if (accountid == 0 && is_ignore2)
-//                {
-//                    result.success = false;
-//                    result.message = "放弃转链";
-//                    result.reason = reason;
-//                    _ = TkLogCore.ParseLogAsync(result);
-//                    return JdParseOutput(result);
-//                }
-
-                var account = accountid > 0 ? JdPoolCore.GetOne(accountid) : JdPoolCore.GetOne(JdPoolCore.JdAction.parse);
+                //                bool is_ignore2 = JdUnionPlus.FlowControlIgnoreRequest(config, out reason);
+                //#if DEBUG
+                //                is_ignore2 = false;
+                //#endif
+                //                if (accountid == 0 && is_ignore2)
+                //                {
+                //                    result.success = false;
+                //                    result.message = "放弃转链";
+                //                    result.reason = reason;
+                //                    _ = TkLogCore.ParseLogAsync(result);
+                //                    return JdParseOutput(result);
+                //                }
+
+                var account = accountid > 0 ? JdPoolCore.GetOne(accountid, JdPoolCore.JdAction.parse) : JdPoolCore.GetOne(JdPoolCore.JdAction.parse);
                 if (account == null)
                 {
                     result.success = false;

+ 3 - 2
molilian.core/DTO/jd/JdPoolDTO.cs

@@ -30,8 +30,8 @@
         public string nodeName { get; set; } = string.Empty;
         public string end_point { get; set; } = string.Empty;
         public decimal current_amt { get; set; } = 0;
-        public decimal current_daily_calls { get; set; } = 0;
-        public decimal current_hourly_calls { get; set; } = 0;
+        public int current_daily_calls { get; set; } = 0;
+        public int current_hourly_calls { get; set; } = 0;
         public decimal daily_income_limit { get; set; } = 0;
         public int daily_calls_limit { get; set; } = 0;
         public int hourly_calls_limit { get; set; } = 0;
@@ -39,6 +39,7 @@
         public bool enable_parse { get; set; } = false;
         public bool enable_coupon { get; set; } = false;
         public bool enable_sync_order { get; set; } = false;
+        public int time_range { get; set; } = 0;
 
     }
 }

+ 2 - 2
molilian.core/Plus/Alimama/coupon.cs

@@ -24,8 +24,8 @@ namespace molilian.core
                 if (result.couponAmount == 0)
                 {
                     result.success = false;
-                    result.message = "放弃转链";
-                    result.reason = "没有优惠券";
+                    result.message = "没有优惠券";
+                    result.reason = "";
                     result.deeplink_url = string.Empty;
                 }
                 else

+ 12 - 2
molilian.core/Plus/Alimama/crawler.cs

@@ -144,6 +144,7 @@ namespace molilian.core
             var accounts = TkPoolCore.List();
             using var conn = all_node ? CenterHub.GetOpenConnection() : DBContext.GetOpenConnection();
             string tableName = all_node ? "center_daily_logs" : "daily_logs";
+            string tableName2 = all_node ? "center_daily_chat_data" : "daily_chat_data";
 
             foreach (var account in accounts)
             {
@@ -209,7 +210,7 @@ namespace molilian.core
             }
             var exist2 = new DBContext.Table(conn, tableName)
                  .Fields("id,log_date")
-                 .Get<dynamic>("log_date=@log_date AND channel=@channel AND accountId=@accountId",
+                 .Get<dynamic>("log_date=@log_date AND accountId=@accountId",
                  new { log_date, channel = channelId, accountId = 0 });
 
             var createArgs2 = new DBContext.Table(conn, tableName)
@@ -222,7 +223,7 @@ namespace molilian.core
 
             if (exist2 == null)
             {
-                createArgs2.Add("channel", channelId)
+                createArgs2.Add("channel", 0)
                     .Add("accountId", 0)
                     .Add("accountName", "all")
                     .Add("log_date", log_date)
@@ -234,6 +235,15 @@ namespace molilian.core
                 createArgs2.Where("id=@id", new { exist2.id }).Update();
             }
 
+            //jd_parse_total
+            //tool_total
+            //total
+            //coupon_total
+            //parse_total
+
+            var chatData = ChartDataCore.GetTaobaoData($"{prefix}total", "", $"{log_date:yyyyMMdd}");
+            //tableName2
+
         }
 
         public static void ApiCallStatistics(int intervalDay, TkChannelEnum channel, string prefix = "")

+ 0 - 8
molilian.core/Plus/Alimama/parse_2.cs

@@ -135,14 +135,6 @@ namespace molilian.core
                 return true;
             }
 
-            //if (uri.Host.Equals("m.tb.cn", StringComparison.OrdinalIgnoreCase) &&
-            //    uri.AbsolutePath.StartsWith("/h.") &&
-            //    string.IsNullOrEmpty(uri.Query) && // No query parameters
-            //    !url.Contains("?tk=")) // No "tk" parameter
-            //{
-            //    return true;
-
-            //}
             return false;
         }
 

+ 5 - 2
molilian.core/Plus/JDUnion/JdUnionPlus.cs

@@ -223,6 +223,7 @@ namespace molilian.core
                 result.channel_type = ChannelTypeEnum.jd;
                 result.message = "放弃转链";
                 result.reason = "纯口令";
+                result.accountId = 0;
                 result.accountName = string.Empty;
                 result.content = content;
                 result.shortLinkurl = url;
@@ -243,8 +244,8 @@ namespace molilian.core
                 result.channel_type = ChannelTypeEnum.jd;
                 result.message = "放弃转链";
                 result.reason = "其他推广链接";
-                result.accountName = string.Empty;
                 result.accountId = 0;
+                result.accountName = string.Empty;
                 result.content = content;
                 result.shortLinkurl = url;
                 result.deeplink_url = GetDeeplink(url);
@@ -262,6 +263,7 @@ namespace molilian.core
                 result.channel_type = ChannelTypeEnum.jd;
                 result.message = "放弃转链";
                 result.reason = "非标链接";
+                result.accountId = 0;
                 result.accountName = string.Empty;
                 result.content = content;
                 result.shortLinkurl = url;
@@ -269,13 +271,14 @@ namespace molilian.core
                 return result;
             }
 
-            if (FlowControlIgnoreRequest(_config, out string reason))
+            if (!result.ip.StartsWith("127.0.0") && FlowControlIgnoreRequest(_config, out string reason))
             {
                 result.success = false;
                 result.link_type = LinkTypeEnum.unknown;
                 result.channel_type = ChannelTypeEnum.jd;
                 result.message = "放弃转链";
                 result.reason = reason;
+                result.accountId = 0;
                 result.accountName = string.Empty;
                 result.content = content;
                 result.shortLinkurl = url;

+ 2 - 2
molilian.core/Plus/JDUnion/coupon.cs

@@ -51,8 +51,8 @@ namespace molilian.core
             if (dtkResult.couponAmount == 0)
             {
                 result.success = false;
-                result.message = "放弃转链";
-                result.reason = "没有优惠券";
+                result.message = "没有优惠券";
+                result.reason = "";
                 return result;
             }
 

+ 47 - 0
molilian.core/Plus/WorkSchedule.cs

@@ -0,0 +1,47 @@
+using dodohold.core;
+
+
+namespace molilian.core
+{
+    public class WorkSchedule
+    {
+        private int workHours;
+        public WorkSchedule(int initialWorkHours = 0) => workHours = initialWorkHours;
+
+        // 检查指定小时是否为工作时间
+        public bool IsWorkHour(int? hour = null)
+        {
+            int checkHour = hour ?? DateTime.Now.Hour;
+
+            // 处理小于0或大于24的情况
+            if (checkHour < 0)
+            {
+                checkHour = Math.Abs(checkHour) % 24;
+            }
+            else if (checkHour >= 24)
+            {
+                checkHour = checkHour % 24;
+            }
+            return (workHours & (1 << checkHour)) != 0;
+        }
+
+        // 获取工作时间的二进制表示
+        public int GetWorkHours()
+        {
+            return workHours;
+        }
+
+        // 设置工作时间的二进制表示
+        public void SetWorkHours(int hours)
+        {
+            workHours = hours;
+        }
+
+        // 打印工作时间
+        public void PrintWorkHours()
+        {
+            Console.WriteLine(Convert.ToString(workHours, 2).PadLeft(24, '0'));
+        }
+    }
+
+}

Vissa filer visades inte eftersom för många filer har ändrats