Exemple #1
0
        private void ExecuteServiceItem(IRepositoryContext <Transfer> context, string userName, IDictionary <string, object> data, object targetUserId)
        {
            IDictionary <string, object> row = new Dictionary <string, object>();
            var level = data["UE_level"].ToInt();//GetMessageData("UE_level", message).ToInt();

            row["UserGradeId"]  = "72be65e6-3a64-414d-972e-1a3d4a36f400";
            row["UserTypeId"]   = "71BE65E6-3A64-414D-972E-1A3D4A365666";
            row["UserId"]       = targetUserId; //user["Id"];
            row["Name"]         = "服务中心会员";
            row["RegionId"]     = 0;
            row["ExtraDate"]    = "";
            row["CreateTime"]   = DateTime.Now;
            row["ModifiedTime"] = "0001-01-01 00:00:00.0000000";
            row["Remark"]       = "from qefgj database.";
            row["SortOrder"]    = 1000;
            row["Status"]       = data["UE_status"]; //GetMessageData("Status", message);
            row["SrcId"]        = data["UE_ID"];     //GetMessageData("SrcId", message);

            row["ParentId"]     = 0;
            row["UserRegionId"] = 0;
            row["CheckUserId"]  = 0;
            row["CircleId"]     = 0;
            row["CheckTime"]    = DateTime.Now;

            var qty = data["yj_total"].ToDecimal(); //GetMessageData("yj_total", message).ToDecimal();

            row["AchieveQty"] = qty;
            TimeOutTryAgain(() =>
            {
                context.Execute("User_UserTypeIndex", row);
                this.Log($"Execute For UserTypeIndex Center Achievement :{row.CollToString()} SUCCESS.");
            });
        }
Exemple #2
0
 /// <summary>
 /// 处理推荐关系
 /// </summary>
 /// <param name="contextFrom"></param>
 /// <param name="contextTo"></param>
 /// <param name="sql">获取源数据sql</param>
 /// <param name="targetUserId">目标用户id</param>
 private void DealRecommendInfo(IRepositoryContext <Transfer> contextFrom, IRepositoryContext <Transfer> contextTo, string sql, object targetUserId)
 {
     using (var reader = contextFrom.ExecuteReader(sql))
     {
         var  parents  = new List <UserRecommend>();
         int  level    = 1;
         long parentId = 0;
         while (reader.Read())
         {
             //var toUser = _usersTo[(reader["username"].ToString()];//_usersTo.FirstOrDefault(d => d["UserName"].Equals(reader["username"]));
             if (!_usersTo.TryGetValue(reader["username"].ToTLower(), out IDictionary <string, object> toUser))
             {
                 continue;
             }
             //if (toUser != null)
             //{
             var ur = new UserRecommend {
                 UserId = toUser["Id"].ToLong(), ParentLevel = level++
             };
             parents.Add(ur);
             parentId = ur.UserId;
             //    }
         }
         var parentMap = parents.ToJson();
         sql = $"UPDATE User_User SET ParentMap='{parentMap}',ParentId={parentId} WHERE Id={targetUserId}";
         this.Log($"Executing UserRecommend:{sql}");
         contextTo.Execute(sql);
         this.Log($"Execute User Recommend :[{sql}] SUCCESS.");
     }
 }
Exemple #3
0
        /// <summary>
        /// 执行用户及账号逻辑
        /// </summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        private void ExecuteForUserAndAccount(IRepositoryContext <Transfer> context, Message message)
        {
            // execute for user
            var userId = context.ExecuteInsert(message.TargetTable, ObjectToString(message.Data)).ToLong();
            // execute for account
            var ItemDatas = message.Data;
            Func <string, object> getMessageData = name =>
            {
                object res;
                if (message.Data.ContainsKey(name))
                {
                    res = message.Data[name];
                }
                else if (message.ExtendData.ContainsKey(name))
                {
                    res = message.ExtendData[name];
                }
                else
                {
                    res = null;
                }
                return(res);
            };

            foreach (var type in types)
            {
                IDictionary <string, object> row = new Dictionary <string, object>();
                if (type.Name.IsNullOrEmpty())
                {
                    row["Amount"] = 0;
                }
                else
                {
                    if (type.Name.Equals("UE_cp"))
                    {
                        row["Amount"] = getMessageData(type.Name).ToDecimal() * 850;
                    }
                    else
                    {
                        row["Amount"] = getMessageData(type.Name);
                    }
                }
                row["Currency"]      = type.Currency;
                row["CreateTime"]    = DateTime.Now;
                row["ExtraDate"]     = "";
                row["FreezeAmount"]  = 0;
                row["HistoryAmount"] = 0;
                row["ModifiedTime"]  = "0001-01-01 00:00:00.0000000";
                row["MoneyTypeId"]   = type.MoneyType;
                row["Remark"]        = "from qefgj database.";
                row["SortOrder"]     = 1000;
                row["Status"]        = getMessageData("Status");
                row["UserId"]        = userId;
                row["SrcId"]         = getMessageData("SrcId");
                context.Execute("Finance_Account", ObjectToString(row));
            }
        }
Exemple #4
0
        public void Write(IRepositoryContext <Transfer> context, Action <ExecuteResult> writeFinish)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            try
            {
                DateTime dtLast     = DateTime.Now;
                int      checkTimes = 0;
                Action   checkWrite = () =>
                {
                    if ((checkTimes == 0) || (DateTime.Now - dtLast).Minutes >= 1)
                    {
                        checkTimes++;
                        dtLast = DateTime.Now;
                        this.Log($"Executing Write: nothing to execute. try for {checkTimes} minutes.Queue current({_queue.Count})");
                    }
                };
                while (true)
                {
                    if (_queue.Count == 0)
                    {
                        checkWrite();
                        continue;
                    }
                    checkTimes = 0;
                    var message = _queue.Dequeue();
                    if (message != null)
                    {
                        try
                        {
                            context.Execute(message.TargetTable, ObjectToString(message.Data));
                            this.Log($"Execute Write:{message} SUCCESS.");
                        }
                        catch (Exception ex)
                        {
                            if (message.NeedTry(ex.Message))
                            {
                                _queue.Enqueue(message);
                                this.Log($"Execute Write:{message} Failed.Retrying...", ex);
                            }
                            else
                            {
                                _queue.FailureMessages.Add(message);
                                this.Log($"Execute Write:{message} Failed.Enter for Failure Message.", ex);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                this.Log("Execute Write Error", ex);
            }
        }
Exemple #5
0
        private void SubUserCenterProc(IRepositoryContext <Transfer> contextTo, IDictionary <string, IDictionary <string, object> > usersFrom)
        {
            TimeOutTryAgain(() =>
            {
                string sql;
                int count = 0;
                foreach (var item in usersFrom)
                {
                    var account = item.Value["UE_account"].ToTLower();
                    var drpd    = item.Value["UE_drpd"].ToTLower();
                    if (!_usersTo.TryGetValue(account, out IDictionary <string, object> user))
                    {
                        this.Log($"SubUserCenterProc UE_account:{account}不存在于目标库中");
                        continue;
                    }
                    if (!_usersTo.TryGetValue(drpd, out IDictionary <string, object> userCenter))
                    {
                        this.Log($"SubUserCenterProc UE_drpd:{drpd}不存在于目标库中");
                        continue;
                    }
                    if (count == 0)
                    {
                        contextTo.BeginTransaction();
                    }

                    sql = $"UPDATE User_User SET ServiceCenterUserId={userCenter["Id"]} WHERE Id={user["Id"]}";
                    contextTo.Execute(sql);
                    try
                    {
                        count++;
                        if (count == 1000)
                        {
                            SubRelationAllProcSubmitTransaction(contextTo);
                            count = 0;
                        }
                    }
                    catch (Exception ex)
                    {
                        this.Log($"SubUserCenterProc({sql}, {user["Id"]}); exception:", ex);
                        contextTo.RollbackTransaction();
                        contextTo.DisposeTransaction();
                        contextTo.Close();
                    }
                    this.Log($"SubUserCenterProc:{sql}");
                }
                if (count > 0)
                {
                    SubRelationAllProcSubmitTransaction(contextTo);
                }

                this.Log($"SubUserCenterProc execute ({Thread.CurrentThread.ManagedThreadId}) finish {usersFrom.Count()} records.");
            });
        }
Exemple #6
0
        /// <summary>
        /// 执行用户及账号逻辑
        /// </summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        private void ExecuteForUserAndAccount(IRepositoryContext <Transfer> context, Message message)
        {
            long userId = 0;

            TimeOutTryAgain(() =>
            {
                // execute for user
                userId = context.ExecuteInsert(message.TargetTable, message.Data).ToLong();
            });

            // execute for account
            var ItemDatas = message.Data;

            foreach (var type in types)
            {
                IDictionary <string, object> row = new Dictionary <string, object>();
                if (type.Name.IsNullOrEmpty())
                {
                    row["Amount"] = 0;
                }
                else
                {
                    if (type.Name.Equals("UE_cp"))
                    {
                        row["Amount"] = GetMessageData(type.Name, message).ToDecimal() * 850;
                    }
                    else
                    {
                        row["Amount"] = GetMessageData(type.Name, message);
                    }
                }
                row["Currency"]      = type.Currency;
                row["CreateTime"]    = DateTime.Now;
                row["ExtraDate"]     = "";
                row["FreezeAmount"]  = 0;
                row["HistoryAmount"] = 0;
                row["ModifiedTime"]  = "0001-01-01 00:00:00.0000000";
                row["MoneyTypeId"]   = type.MoneyType;
                row["Remark"]        = "from qefgj database.";
                row["SortOrder"]     = 1000;
                row["Status"]        = GetMessageData("Status", message);
                row["UserId"]        = userId;
                row["SrcId"]         = GetMessageData("SrcId", message);
                context.Execute("Finance_Account", row);
            }

            TimeOutTryAgain(() =>
            {
                ExecuteForUserTypeIndex(context, message, userId);
            });
        }
Exemple #7
0
        /// <summary>
        /// 处理安置关系
        /// </summary>
        /// <param name="contextFrom"></param>
        /// <param name="contextTo"></param>
        /// <param name="sql">源数据sql</param>
        /// <param name="targetUserId">目标用户</param>
        private void DealRelation(IRepositoryContext <Transfer> contextFrom, IRepositoryContext <Transfer> contextTo, string sql, object targetUserId, object position, object userFromId)
        {
            using (var reader = contextFrom.ExecuteReader(sql))
            {
                var          parents  = new List <UserRelation>();
                int          level    = 1;
                long         parentId = 0;
                UserRelation ur       = null;
                while (reader.Read())
                {
                    if (!_usersTo.TryGetValue(reader["username"].ToTLower(), out IDictionary <string, object> toUser))
                    {
                        continue;
                    }

                    //var toUser = _usersTo.FirstOrDefault(d => d["UserName"].Equals(reader["username"]));
                    //if (toUser != null)
                    //{
                    ur = new UserRelation {
                        UserId = toUser["Id"].ToLong(), ParentLevel = level++, Location = reader["location"].ToInt()
                    };
                    parents.Add(ur);
                    parentId = ur.UserId;
                    //}
                }
                if (ur == null)
                {
                    return;
                }
                var parentMap = parents.ToJson();

                IDictionary <string, object> row = new Dictionary <string, object>();
                row["Level"]     = level;
                row["Location"]  = position; //ur.Location;
                row["ParentId"]  = ur.UserId;
                row["UserId"]    = targetUserId;
                row["ParentMap"] = parentMap;
                row["SrcId"]     = userFromId;//reader["userId"];

                contextTo.Execute("User_PlacementRelation", row);
                this.Log($"Execute Relation :{row.CollToString()} SUCCESS.");
            }
        }
Exemple #8
0
        /// <summary>
        /// 业绩数据
        /// </summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        private void ExecuteAchievement(IRepositoryContext <Transfer> context, Message message)
        {
            InitData(context);

            var username = GetMessageData("UserName", message).ToTLower();

            if (!_userInfo.TryGetValue(username, out IDictionary <string, object> user))
            {
                this.Log($"未找到{username}的用户信息,服务中心业绩数据无法导入。");
                return;
            }

            IDictionary <string, object> row = new Dictionary <string, object>();
            var level = GetMessageData("UE_level", message).ToInt();

            row["UserGradeId"]  = "72be65e6-3a64-414d-972e-1a3d4a36f400";
            row["UserTypeId"]   = "71BE65E6-3A64-414D-972E-1A3D4A365666";
            row["UserId"]       = user["Id"];
            row["Name"]         = "服务中心会员";
            row["RegionId"]     = 0;
            row["ExtraDate"]    = "";
            row["CreateTime"]   = DateTime.Now;
            row["ModifiedTime"] = "0001-01-01 00:00:00.0000000";
            row["Remark"]       = "from qefgj database.";
            row["SortOrder"]    = 1000;
            row["Status"]       = GetMessageData("Status", message);
            row["SrcId"]        = GetMessageData("SrcId", message);

            row["ParentId"]     = 0;
            row["UserRegionId"] = 0;
            row["CheckUserId"]  = 0;
            row["CircleId"]     = 0;
            row["CheckTime"]    = DateTime.Now;

            var qty = GetMessageData("yj_total", message).ToDecimal();

            row["AchieveQty"] = qty;
            TimeOutTryAgain(() =>
            {
                context.Execute("User_UserTypeIndex", row);
                this.Log($"Execute For UserTypeIndex Center Achievement :{row.CollToString()} SUCCESS.");
            });
        }
        /// <summary>
        /// 业绩数据
        /// </summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        private void ExecuteAchievement(IRepositoryContext <Transfer> context, Message message)
        {
            InitData(context);

            var username = GetMessageData("UserName", message).ToTLower();

            if (!_userLevelInfo.TryGetValue(username, out IDictionary <string, object> userLevel))
            {
                this.Log($"未找到{username}的安置关系信息,业绩数据无法导入。");
                return;
            }

            //var userLevel = _userLevelInfo.FirstOrDefault(u => u["UserName"].Equals(username));
            //if (userLevel == null)
            //{
            //    this.Log($"未找到{username}的安置关系信息,业绩数据无法导入。");
            //    return;
            //}

            IDictionary <string, object> row = new Dictionary <string, object>();

            row["ModuleId"]          = "5ABF19F3-9E71-4D27-AD0C-D1340D9CB81B";
            row["UserId"]            = userLevel["Id"];
            row["Level"]             = userLevel["Level"];
            row["LValue"]            = GetMessageData("left_duipen_total", message).ToDecimal();
            row["RValue"]            = GetMessageData("right_duipen_total", message).ToDecimal();
            row["TouchedValue"]      = 0;
            row["TouchedTime"]       = "0001-01-01 00:00:00.0000000";
            row["TouchedReturnTime"] = "0001-01-01 00:00:00.0000000";
            row["LTeamNum"]          = GetMessageData("left_num", message).ToLong();
            row["RTeamNum"]          = GetMessageData("right_num", message).ToLong();
            row["LLeftValue"]        = GetMessageData("left_duipen", message).ToDecimal();
            row["RLeftValue"]        = GetMessageData("right_duipen", message).ToDecimal();
            row["SrcId"]             = GetMessageData("SrcId", message);

            TimeOutTryAgain(() =>
            {
                context.Execute("FenRun_LevelTouchValue", row);
                this.Log($"Execute For Achievement :{row.CollToString()} SUCCESS.");
            });
        }
Exemple #10
0
        /// <summary>
        /// 多个字段对应目标一个字段
        /// </summary>
        /// <param name="context"></param>
        /// <param name="targetTable"></param>
        /// <param name="items"></param>
        /// <param name="manyToOneKeys"></param>
        private void ExecuteSpecialManyToOne(IRepositoryContext <Transfer> context, string targetTable, IDictionary <string, object> items, List <string> manyToOneKeys, IDictionary <string, List <object> > manyToOneDefaults)
        {
            if (manyToOneKeys != null && manyToOneKeys.Count > 0)
            {
                Dictionary <string, List <object> > values = new Dictionary <string, List <object> >();
                foreach (var key in manyToOneKeys)
                {
                    if (!items.ContainsKey(key))
                    {
                        throw new ArgumentException($"指定的多值字段{key},在数据项中不存在");
                    }
                    values[key] = items[key] as List <object>;
                }
                List <IDictionary <string, object> > resItems = new List <IDictionary <string, object> >();
                int count = 0;
                // 产生目标数
                foreach (var value in values)
                {
                    count += value.Value.Count;
                }
                // 产生毛数据
                for (int i = 0; i < count; ++i)
                {
                    var item = new Dictionary <string, object>();
                    foreach (var iKey in items.Keys)
                    {
                        item[iKey] = items[iKey];
                    }
                    resItems.Add(item);
                }

                if (manyToOneDefaults != null && manyToOneDefaults.Count > 0)
                {
                    foreach (var item in manyToOneDefaults)
                    {
                        if (item.Value.Count != resItems.Count)
                        {
                            throw new ArgumentOutOfRangeException($"给定多对一列{item.Key}的默认值行数不匹配");
                        }
                        int index = 0;
                        foreach (var resItem in resItems)
                        {
                            resItem[item.Key] = item.Value[index++];
                        }
                    }
                }

                // 精确修复
                foreach (var item in resItems)
                {
                    int i = 0;
                    foreach (var key in item.Keys)
                    {
                        if (i == values[key].Count)
                        {
                            i = 0;
                        }
                        item[key] = values[key][i++];
                    }
                }

                foreach (var item in resItems)
                {
                    context.Execute(targetTable, ObjectToString(item));
                }
            }
        }
Exemple #11
0
        public void Write(IRepositoryContext<Transfer> context, Action<ExecuteResult> writeFinish)
        {
            if (context == null)
                throw new ArgumentNullException(nameof(context));

            try
            {
                DateTime dtLast = DateTime.Now;
                int checkTimes = 0;
                long elapseMinutes = 0;
                Func<bool> checkWrite = () =>
                {
                    elapseMinutes = (DateTime.Now - dtLast).Minutes;
                    if ((checkTimes == 0) || elapseMinutes >= 1)
                    {
                        checkTimes++;
                        dtLast = DateTime.Now;
                        this.Log($"Executing Write({Name}): nothing to execute. try for {checkTimes} minutes.Queue current({_queue.Count})");
                    }
                    return _context.CurrentTableConfig.NoMessageToQuit != 0 && _context.CurrentTableConfig.NoMessageToQuit < checkTimes; // 是否满足中止条件
                };
                while (true)
                {
                    if (_queue.Count == 0)
                    {
                        if (checkWrite())
                            break;
                        continue;
                    }
                    checkTimes = 0;
                    var message = _queue.Dequeue();
                    if (message != null)
                    {
                        try
                        {
                            switch (message.MessageType)
                            {
                                case MessageType.Normal:
                                    context.Execute(message.TargetTable, message.Data);
                                    break;
                                case MessageType.UserDefine:
                                    ExecuteForUserDefineBusiness(context, message);
                                    break;
                            }
                            //message.ManyToKeys != null && message.ManyToKeys.Count > 0)                                
                            //ExecuteSpecialManyToOne(context, message.TargetTable, message.Data, message.ManyToKeys);
                            this.Log($"Execute Write({Name}):{message} SUCCESS.");
                        }
                        catch (Exception ex)
                        {
                            if (message.NeedTry(ex.Message))
                            {
                                _queue.Enqueue(message);
                                this.Log($"Execute Write({Name}):{message} Failed.Retrying...", ex);
                            }
                            else
                            {
                                _queue.FailureMessages.Add(message);
                                this.Log($"Execute Write({Name}):{message} Failed.Enter for Failure Message.", ex);
                            }
                        }
                    }
                }
                writeFinish?.Invoke(new ExecuteResult { Message = $"Execute Write({Name}) Finished by timeout {elapseMinutes} minutes.", State = ExecuteState.Success });
            }
            catch (Exception ex)
            {
                this.Log($"Execute Write({Name}) Error", ex);
                writeFinish?.Invoke(new ExecuteResult { Exception = ex, Message = $"Execute Write({Name}) Error:", State = ExecuteState.Fail });
            }
        }