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."); }); }
/// <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."); } }
/// <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)); } }
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); } }
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."); }); }
/// <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); }); }
/// <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."); } }
/// <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."); }); }
/// <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)); } } }
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 }); } }