/// <summary> /// 添加修改后的信息 /// </summary> /// <param name="updateUserAssetRatioInfos"></param> /// <returns></returns> private bool InsertAssetUserRatioInfo(UpdateUserAssetRatioInfos updateUserAssetRatioInfos) { try { //判断是否存在 string sqlQuery = $"select count(*) from UpdateAssetUserRatioInfo where UserAssetRatioId='{updateUserAssetRatioInfos.UserAssetRatioId}'"; object count = SqlHelper.SqlHelper.ExecuteScalar(sqlQuery); if (count == null) { return(false); } if ((int)count > 0) { return(true); } string sql = $"insert into UpdateAssetUserRatioInfo(UserId, DealAmount, AssetId,UserAssetRatioId,Capital,Numerator,OriginalUserAssetRatioId,Denominator)values('{updateUserAssetRatioInfos.UserId}',{updateUserAssetRatioInfos.DealAmount},'{updateUserAssetRatioInfos.AssetId}','{updateUserAssetRatioInfos.UserAssetRatioId}',{updateUserAssetRatioInfos.Capital},{updateUserAssetRatioInfos.Numerator},'{updateUserAssetRatioInfos.OriginalUserAssetRatioId}',{updateUserAssetRatioInfos.Denominator})"; return(SqlHelper.SqlHelper.ExecuteNoneQuery(sql) > 0); } catch (Exception e) { //记录失败插入的数据 Logger.LoadData(@"UD_UpdateAssetUserRation\UpdateUserAssetInfoError_" + updateUserAssetRatioInfos.UserAssetRatioId + ".txt", updateUserAssetRatioInfos.ToJson()); return(false); } }
private async void btn_HandleThings_Click(object sender, EventArgs e) { //执行数量 try { ShowUpdateAssetUserInfo updateAssetUserInfo = new ShowUpdateAssetUserInfo(); DateTime dtDkTime = Convert.ToDateTime(this.txb_updateTime.Text.Trim()); string tbNameByUser = ConfigurationManager.AppSettings["AssetUserAssetRatios"]; string tbNameByAsset = ConfigurationManager.AppSettings["AssetUserRelation"]; //获取需要执行的数据 this.lbl_showmsg.Text = "正在准备数据......"; this.btn_HandleThings.Enabled = false; List <string> userInfos = this.txb_handleUserIds.Text.Trim().Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries).ToList(); List <UserReleaseAmount> listUserReleaseAmounts = userInfos.Select(t => t.Split(',')).Select(userInfo => new UserReleaseAmount { Amount = Convert.ToInt64(userInfo[1]), UserId = userInfo[0] }).ToList(); //List<string> userIds = listUserReleaseAmounts.Select(x => x.UserId).ToList(); //获取赎回订单 //List<string> redemOrderIds = new List<string>(); //修改所有的赎回订单数量 //备份修改之前的所有赎回订单数据 //int count = 0; //List<UserRedemptionInfo> listRedemptionInfos = this.GetUserRedemptionOrders(userIds).ToList(); //updateAssetUserInfo.RedemptionTotalNums = listRedemptionInfos.Count; //this.lbl_showmsg.Text = "开始修改这批用户的所有赎回订单数据,需执行数量为" + listRedemptionInfos.Count; //foreach (UserRedemptionInfo itemRedemption in listRedemptionInfos) //{ // bool redeemResult = await this.UpdateYemRedeemInfo(itemRedemption.UserId, itemRedemption.OrderId, itemRedemption.AlreadyDealtAmount, 0, 0, 1); // if (redeemResult) // { // count = count + 1; // } //} //updateAssetUserInfo.RedemptionSuccessNums = count; //this.lbl_showmsg.Text = "该次修改成功的赎回订单数据为" + count; //获取所有的资产数据 List <OnSellAssetDto> onSellAssetInfos = this.GetOnSellAssetInfos(); //修改比例关系并且插入数据库 //备份之前的比例关系 this.lbl_showmsg.Text = "开始修改比例以及插入信息数据......"; ConcurrentBag <int> concurrentBag = new ConcurrentBag <int>(); //显示结果 //Dictionary<string, int> dicInfos = new Dictionary<string, int>(); int countDo = listUserReleaseAmounts.Count; this.txb_UserNums.Text = countDo.ToString(); ConcurrentBag <UpdateUserAssetRatio> concurrentBagUpdateInfos = new ConcurrentBag <UpdateUserAssetRatio>(); List <Task> listTasks = new List <Task>(); for (int i = 0; i < this.threadNums; i++) { Task task = Task.Run(async() => { while (listUserReleaseAmounts.Count > 0) { UserReleaseAmount userReleaseAmount = null; int nums = 0; lock (this.objLock) { if (listUserReleaseAmounts.Count > 0) { userReleaseAmount = listUserReleaseAmounts[0]; if (userReleaseAmount != null) { //dicInfos.Add(userReleaseAmount.UserId, 0); //显示信息 listUserReleaseAmounts.Remove(userReleaseAmount); } } } if (userReleaseAmount != null) { //执行 string userId = userReleaseAmount.UserId; long redeemAmount = userReleaseAmount.Amount; //赎回金额 //拉取所有的用户比例关系 List <UserAssetRatio> userAssetRatios = await this.GetSortUserAssetRatios(userId, tbNameByUser); //拉取所有的已经成功的userassetRatioids //List<string> successUserAssetRatioIds = this.redisHelperSpecial.GetRedisSuccessInsertUserAssetRatioIdsAsync(userId); //userAssetRatios.RemoveAll(x => successUserAssetRatioIds.Contains(x.UserAssetRatioId)); Logger.LoadData(@"UD_log\logInfo" + Guid.NewGuid().ToGuidString() + ".txt", "需要执行的数量:" + userAssetRatios.Count); foreach (UserAssetRatio userAssetRatio in userAssetRatios) { if (redeemAmount == 0) { break; } List <UpdateUserAssetRatioInfos> addUserAssetRatioInfoses = new List <UpdateUserAssetRatioInfos>(); //执行操作 OnSellAssetDto onSellItem = onSellAssetInfos.FirstOrDefault(p => p.OnSellAssetId == userAssetRatio.AssetId); if (onSellItem == null) { continue; } long userPresentValue = this.GetUserPrentValue1(userAssetRatio, dtDkTime); if (userPresentValue > 0) { if (redeemAmount >= userPresentValue) { redeemAmount -= userPresentValue; addUserAssetRatioInfoses.Add(new UpdateUserAssetRatioInfos //给新用户 { UserId = userAssetRatio.UserId, AssetId = userAssetRatio.AssetId, DealAmount = userPresentValue, Capital = userAssetRatio.Capital, UserAssetRatioId = userAssetRatio.UserAssetRatioId, OriginalUserAssetRatioId = userAssetRatio.OriginalUserAssetRatioId, Denominator = onSellItem.PresentValue, Numerator = userPresentValue //待确认 }); //修改部分东西 userAssetRatio.IsDeleted = true; userAssetRatio.Reserve = "1"; userAssetRatio.Denominator = onSellItem.PresentValue; //updateUserAssetRatioInfoses.Add(new ModifyUserAssetRatioRequest //{ // AssetId = userAssetRatio.AssetId, // Capital = userAssetRatio.Capital, // Denominator = onSellItem.PresentValue, // Numerator = userAssetRatio.Numerator, // IsInvestSuccess = userAssetRatio.IsInvestSuccess, // IsNotifyTradingSuccess = userAssetRatio.IsNotifyTradingSuccess, // IsReturned = userAssetRatio.IsReturned, // Status = userAssetRatio.Status, // UserAssetRatioId = userAssetRatio.UserAssetRatioId, // UserId = userAssetRatio.UserId, // IsDeleted = true, // Reserve = "1", // OriginalUserAssetRatioId = userAssetRatio.OriginalUserAssetRatioId //}); //老用户 } else if (redeemAmount < userPresentValue) { //计算赎回本金 long capital = this.GetCapital(redeemAmount, userPresentValue, userAssetRatio.Capital); addUserAssetRatioInfoses.Add(new UpdateUserAssetRatioInfos //给老用户 { UserId = userAssetRatio.UserId, AssetId = userAssetRatio.AssetId, DealAmount = redeemAmount, Capital = capital, UserAssetRatioId = userAssetRatio.UserAssetRatioId, OriginalUserAssetRatioId = userAssetRatio.OriginalUserAssetRatioId, Denominator = onSellItem.PresentValue, Numerator = redeemAmount //待确认 }); userAssetRatio.Capital -= capital; //剩余本金 userAssetRatio.Numerator = userPresentValue - redeemAmount; userAssetRatio.Denominator = onSellItem.PresentValue; userAssetRatio.Status = 2; userAssetRatio.IsReturned = false; userAssetRatio.IsInvestSuccess = true; userAssetRatio.IsNotifyTradingSuccess = true; userAssetRatio.Reserve = "1"; //updateUserAssetRatioInfoses.Add(new ModifyUserAssetRatioRequest //{ // AssetId = userAssetRatio.AssetId, // Capital = userAssetRatio.Capital, // Denominator = onSellItem.PresentValue, // Numerator = userPresentValue - redeemAmount, // IsInvestSuccess = true, // IsNotifyTradingSuccess = true, // IsReturned = false, // Status = 2, // UserAssetRatioId = userAssetRatio.UserAssetRatioId, // UserId = userAssetRatio.UserId, // IsDeleted = false, // Reserve = "1", // OriginalUserAssetRatioId = userAssetRatio.OriginalUserAssetRatioId //}); //老用户 redeemAmount = 0; } //插入数据库及更新 addUserAssetRatioInfoses //修改Azure Table数据 userAssetRatio.ETag = DateTime.UtcNow.ToChinaStandardTime().UnixTimestamp().ToString(); userAssetRatio.Timestamp = DateTimeOffset.UtcNow.ToLocalTime(); //修改两张表中的数据 1.用户资产比例 bool result1 = this.UpdateAssetUserRatioInfo(userAssetRatio, tbNameByUser); //2.资产用户比例 userAssetRatio.PartitionKey = userAssetRatio.AssetId; userAssetRatio.RowKey = userAssetRatio.UserId + "_" + userAssetRatio.UserAssetRatioId; bool result2 = this.UpdateAssetUserRatioInfo(userAssetRatio, tbNameByAsset); if (result2 && result1) { //数据库 //数据库 UpdateUserAssetRatioInfos addUserAssetRationInfo = addUserAssetRatioInfoses.FirstOrDefault(x => x.UserAssetRatioId == userAssetRatio.UserAssetRatioId); bool result = this.InsertAssetUserRatioInfo(addUserAssetRationInfo); if (result) { lock (this.objLock) { nums = nums + 1; } //记下redis //await this.redisHelperSpecial.SetRedisSuccessInsertUserAssetRatioIdsAsync(userAssetRatio.UserAssetRatioId, userAssetRatio.UserId); } } //foreach (ModifyUserAssetRatioRequest model in updateUserAssetRatioInfoses) //{ // //修改比例 // bool modifyRatioResult = await this.ModifyUserAssetRatiosByDisk(model); // if (modifyRatioResult) // { // //数据库 // UpdateUserAssetRatioInfos addUserAssetRationInfo = addUserAssetRatioInfoses.FirstOrDefault(x => x.UserAssetRatioId == model.UserAssetRatioId); // bool result = this.InsertAssetUserRatioInfo(addUserAssetRationInfo); // if (result) // { // lock (this.objLock) // { // nums = nums + 1; // } // //记下redis // await this.redisHelperSpecial.SetRedisSuccessInsertUserAssetRatioIdsAsync(model.UserAssetRatioId, model.UserAssetRatioId); // } // } //} } } concurrentBagUpdateInfos.Add(new UpdateUserAssetRatio { SuccessNums = nums, TotalNums = userAssetRatios.Count, UserId = userId }); concurrentBag.Add(0); lock (this.objLock) { this.txb_SuccessNums.Text = ((Convert.ToInt32(this.txb_SuccessNums.Text) + 1)).ToString(); } } } }); listTasks.Add(task); } Task.WaitAll(listTasks.ToArray()); updateAssetUserInfo.UdpateAssetUserInfos = concurrentBagUpdateInfos.ToList(); //this.txb_SuccessNums.Text = ((Convert.ToInt32(this.txb_SuccessNums.Text)) + 1).ToString(); //执行完毕 //记下日志 Logger.LoadData(@"UD_log\logInfo" + Guid.NewGuid().ToGuidString() + ".txt", updateAssetUserInfo.ToJson()); this.btn_HandleThings.Enabled = true; this.lbl_showmsg.Text = "全部执行完毕,请查看执行日志"; } catch (Exception exception) { this.lbl_showmsg.Text = "提示:发生一个错误" + exception.Message; this.btn_HandleThings.Enabled = true; Logger.LoadData(@"UD_Eoor\Error.txt", exception.Message + "-------------------" + exception.StackTrace); } }