Esempio n. 1
0
        public async Task <IActionResult> GetMyEaringsAsync()
        {
            var balanceBiz   = new DoctorBalanceBiz();
            var balanceModel = await balanceBiz.GetAsync(UserID ?? "");

            if (balanceModel == null)
            {
                balanceModel = new DoctorBalanceModel
                {
                    BalanceGuid   = UserID,
                    TotalEarnings = 0,
                    AccBalance    = 0,
                    TotalWithdraw = 0,
                    Status        = DoctorBalanceStatusEnum.Normal.ToString(),
                    CreatedBy     = UserID,
                    LastUpdatedBy = UserID,
                    OrgGuid       = string.Empty
                };
                var isSucc = await balanceBiz.InsertAsync(balanceModel);

                if (!isSucc)
                {
                    return(Failed(ErrorCode.Empty, "网络异常,请检查!"));
                }
            }
            else if (!balanceModel.Enable || balanceModel.Status.Equals(DoctorBalanceStatusEnum.Frozen.ToString()))
            {
                return(Failed(ErrorCode.Empty, "该用户收益数据不可用,请检查!"));
            }
            var response = balanceModel.ToDto <GetMyEaringsAsyncResponse>();

            response.TotalEarnings = response.TotalEarnings / 100;
            response.AccBalance    = response.AccBalance / 100;
            response.TotalWithdraw = response.TotalWithdraw / 100;
            return(Success(response));
        }
 /// <summary>
 /// 异步批量插入
 /// </summary>
 /// <param name="model"></param>
 /// <returns></returns>
 public async Task <bool> InsertApplyModelAndFlowingModelAsync(DoctorWithDrawApplyModel withdrawModel, TransferFlowingModel flowingModel, DoctorBalanceModel balanceModel)
 {
     return(await MySqlHelper.TransactionAsync(async (conn, tran) =>
     {
         if (string.IsNullOrWhiteSpace(await conn.InsertAsync <string, DoctorWithDrawApplyModel>(withdrawModel)))
         {
             return false;
         }
         if (string.IsNullOrWhiteSpace(await conn.InsertAsync <string, TransferFlowingModel>(flowingModel)))
         {
             return false;
         }
         await conn.UpdateAsync(balanceModel);
         return true;
     }));
 }
        public async Task <IActionResult> SetBestAnswerAsync(string answerGuid)
        {
            var biz   = new FaqsAnswerBiz();
            var model = await biz.GetModelAsync(answerGuid);

            if (!(model?.Enable ?? false))
            {
                return(Failed(ErrorCode.Empty, "该回答不存在"));
            }
            var questionModel = await new FaqsQuestionBiz().GetModelAsync(model.QuestionGuid);

            if (!string.Equals(questionModel.Status, FaqsQuestionModel.QuestionStatusEnum.Solving.ToString(), StringComparison.OrdinalIgnoreCase))
            {
                return(Failed(ErrorCode.UserData, "当前问题状态不是[未解决],不能设置最佳回答"));
            }
            model.LastUpdatedBy   = UserID;
            model.LastUpdatedDate = DateTime.Now;
            model.MainAnswer      = true;
            model.RewardIntergral = questionModel.RewardIntergral;

            questionModel.Status          = FaqsQuestionModel.QuestionStatusEnum.Solved.ToString();
            questionModel.LastUpdatedBy   = UserID;
            questionModel.LastUpdatedDate = DateTime.Now;
            var result = false;

            if (questionModel.RewardType.Equals(FaqsQuestionModel.RewardTypeEnum.Intergral.ToString()))
            {
                model.ReceiveType = FaqsQuestionModel.RewardTypeEnum.Intergral.ToString();
                var scoreModel = new ScoreModel
                {
                    ScoreGuid     = Guid.NewGuid().ToString("N"),
                    UserGuid      = model.UserGuid,
                    UserTypeGuid  = GD.Common.EnumDefine.UserType.Doctor.ToString(),
                    Variation     = questionModel.RewardIntergral,
                    Reason        = "回答被设为最佳",
                    PlatformType  = GD.Common.EnumDefine.PlatformType.CloudDoctor.ToString(),
                    CreatedBy     = UserID,
                    LastUpdatedBy = UserID,
                    OrgGuid       = string.Empty
                };
                result = await biz.SetBestAnswerAsync(model, scoreModel, questionModel);
            }
            else if (questionModel.RewardType.Equals(FaqsQuestionModel.RewardTypeEnum.Money.ToString()))
            {
                model.ReceiveType = FaqsQuestionModel.RewardTypeEnum.Money.ToString();
                var balanceModel      = await new DoctorBalanceBiz().GetModelsById(model.UserGuid);
                var isNewBalanceModel = false;
                if (balanceModel == null)
                {
                    isNewBalanceModel = true;
                    balanceModel      = new DoctorBalanceModel
                    {
                        BalanceGuid   = model.UserGuid,
                        TotalEarnings = 0,
                        AccBalance    = 0,
                        TotalWithdraw = 0,
                        Status        = DoctorBalanceModel.DoctorBalanceStatusEnum.Normal.ToString(),
                        CreatedBy     = UserID,
                        LastUpdatedBy = UserID,
                        OrgGuid       = string.Empty
                    };
                }
                var newEaringsDetailModel = new DoctorEaringsDetailModel
                {
                    DetailGuid    = Guid.NewGuid().ToString("N"),
                    AnswerGuid    = model.AnswerGuid,
                    DoctorGuid    = model.UserGuid,
                    FeeFrom       = DoctorEaringsDetailModel.FeeFromTypeEnum.Answer.ToString(),
                    ReceivedFee   = questionModel.RewardIntergral,
                    OrgGuid       = string.Empty,
                    CreatedBy     = UserID,
                    LastUpdatedBy = UserID,
                    Remark        = string.Empty
                };
                balanceModel.TotalEarnings += newEaringsDetailModel.ReceivedFee;
                balanceModel.AccBalance    += newEaringsDetailModel.ReceivedFee;
                result = await biz.SetBestAnswerAllotMoneyAsync(model, newEaringsDetailModel, balanceModel, questionModel, isNewBalanceModel);
            }
            return(result ? Success() : Failed(ErrorCode.DataBaseError, "网络错误,设置最佳回答失败"));
        }
        /// <summary>
        /// 发布问题
        /// </summary>
        /// <param name="scoreModel">发布问题消费积分model</param>
        /// <param name="questionModel">问题model</param>
        /// <returns></returns>
        public async Task <bool> FaqsAutoAllotFeeUpdateAsync(FaqsQuestionModel questionModel, List <DoctorEaringsDetailModel> earingsDetailModelList, DoctorBalanceModel balanceModel)
        {
            return(await MySqlHelper.TransactionAsync(async (conn, trans) =>
            {
                if (string.IsNullOrWhiteSpace(await conn.InsertAsync <string, DoctorBalanceModel>(balanceModel)))
                {
                    return false;
                }

                if (string.IsNullOrWhiteSpace(await conn.InsertAsync <string, FaqsQuestionModel>(questionModel)))
                {
                    return false;
                }

                return true;
            }));
        }
        /// <summary>
        /// 问答分配悬赏金额
        /// </summary>
        /// <param name="parentGuid"></param>
        /// <returns></returns>
        public async Task <int> FaqsAllotFeeAsync()
        {
            var qusetionModelList = await Get15DaysQuestionModelListAsync();

            int conpleteNum = 0;

            foreach (var item in qusetionModelList)
            {
                item.Status          = FaqsQuestionModel.QuestionStatusEnum.End.ToString();
                item.LastUpdatedDate = DateTime.Now;
                var answerList = await GetAnswerModelListByQuestionGuidAsync(item.QuestionGuid);

                if (answerList == null || answerList.Count < 1)
                {
                    //没有回答,金额退给用户,变更问题状态为过期
                    //获取流水,调用退款接口
                    var flowingModel = await new TransactionFlowingBiz().GetModelsById(item.TransferFlowingGuid);
                    var requestDto   = new Dtos.MallPay.FangDiInterface.DoRefundRequestDto
                    {
                        Reason     = "FAQS=>问题无回答,退款.",
                        Refund_Fee = Convert.ToInt32(flowingModel.Amount).ToString(),
                        Refund_No  = flowingModel.TransactionNumber,
                        Trade_No   = flowingModel?.OutTradeNo
                    };
                    var response = await new FangDiPayBiz().RefundAsync(requestDto);
                    if (response.ResultCode.Equals("0") && response.ResultMsg.ToLower().Equals("success"))
                    {
                        flowingModel.TransactionStatus = TransactionStatusEnum.RefundSuccess.ToString();
                        flowingModel.OutRefundNo       = response.Refund_No;
                        flowingModel.Update();
                        item.Update();
                    }
                    conpleteNum++;
                    continue;
                }
                int answerCount = answerList.Count;
                if (answerCount > 10)
                {
                    answerList = answerList.Take(10).ToList();
                }                                                                   //.OrderByDescending(a => a.LikeCount).OrderByDescending(a => a.CreationDate)
                decimal allotNum = 0;
                GetManthNumber(item.RewardIntergral, answerList.Count, ref allotNum);
                var balanceBiz = new DoctorBalanceBiz();
                if (answerList.Count < 11)
                {
                    var answerModelList        = new List <FaqsAnswerModel>();
                    var earingsDetailModelList = new List <DoctorEaringsDetailModel>();
                    var doctorBalanceModelList = new List <Dictionary <bool, DoctorBalanceModel> >();
                    foreach (var answerItem in answerList)
                    {
                        #region 更新Model
                        var newAnswerModel = new FaqsAnswerModel
                        {
                            AnswerGuid      = answerItem.AnswerGuid,
                            MainAnswer      = answerItem.MainAnswer,
                            Content         = answerItem.Content,
                            QuestionGuid    = answerItem.QuestionGuid,
                            UserGuid        = answerItem.UserGuid,
                            ReceiveType     = FaqsAnswerModel.AnswerReceiveTypeEnum.Money.ToString(),
                            RewardIntergral = Convert.ToInt32(allotNum * 100),
                            CreatedBy       = answerItem.CreatedBy,
                            LastUpdatedBy   = answerItem.LastUpdatedBy,
                            CreationDate    = answerItem.CreationDate.Value,
                            LastUpdatedDate = DateTime.Now,
                            OrgGuid         = answerItem.OrgGuid,
                            Enable          = answerItem.Enable
                        };
                        answerModelList.Add(newAnswerModel);
                        var newEaringsDetailModel = new DoctorEaringsDetailModel
                        {
                            DetailGuid    = Guid.NewGuid().ToString("N"),
                            AnswerGuid    = answerItem.AnswerGuid,
                            DoctorGuid    = answerItem.UserGuid,
                            FeeFrom       = DoctorEaringsDetailModel.FeeFromTypeEnum.Answer.ToString(),
                            ReceivedFee   = Convert.ToInt32(allotNum * 100),
                            OrgGuid       = string.Empty,
                            CreatedBy     = answerItem.UserGuid,
                            LastUpdatedBy = answerItem.UserGuid,
                            Remark        = string.Empty
                        };
                        earingsDetailModelList.Add(newEaringsDetailModel);
                        var balanceModel = await balanceBiz.GetAsync(answerItem.UserGuid ?? "");

                        var isNewBalanceModel = false;
                        if (balanceModel == null)
                        {
                            isNewBalanceModel = true;
                            balanceModel      = new DoctorBalanceModel
                            {
                                BalanceGuid   = answerItem.UserGuid,
                                TotalEarnings = Convert.ToInt32(allotNum * 100),
                                AccBalance    = Convert.ToInt32(allotNum * 100),
                                TotalWithdraw = 0,
                                Status        = DoctorBalanceModel.DoctorBalanceStatusEnum.Normal.ToString(),
                                CreatedBy     = answerItem.UserGuid,
                                LastUpdatedBy = answerItem.UserGuid,
                                OrgGuid       = string.Empty
                            };
                        }
                        else
                        {
                            balanceModel.TotalEarnings += Convert.ToInt32(allotNum * 100);
                            balanceModel.AccBalance    += Convert.ToInt32(allotNum * 100);
                        }
                        doctorBalanceModelList.Add(new Dictionary <bool, DoctorBalanceModel> {
                            { isNewBalanceModel, balanceModel }
                        });
                        #endregion
                    }
                    var isSucc = await FaqsAllotQuestionFee(item, answerModelList, earingsDetailModelList, doctorBalanceModelList);

                    if (!isSucc)
                    {
                        Logger.Error($"FaqsAllotFeeAsync=>问答分配悬赏金失败,QuestionGuid: {item.QuestionGuid}");
                        continue;
                    }
                    conpleteNum++;
                }
            }

            return(conpleteNum);
        }
 /// <summary>
 /// 设置回答为最佳答案(金额)
 /// </summary>
 /// <param name="model">回答model</param>
 /// <param name="收益明细">收益明细model</param>
 /// <returns></returns>
 public async Task <bool> SetBestAnswerAllotMoneyAsync(FaqsAnswerModel model, DoctorEaringsDetailModel earingsDetailModel, DoctorBalanceModel balanceModel, FaqsQuestionModel questionModel, bool isNewBalanceModel)
 {
     return(await MySqlHelper.TransactionAsync(async (conn, trans) =>
     {
         if (isNewBalanceModel)
         {
             if (string.IsNullOrWhiteSpace(await conn.InsertAsync <string, DoctorBalanceModel>(balanceModel)))
             {
                 return false;
             }
         }
         else
         {
             if ((await conn.UpdateAsync(balanceModel)) < 1)
             {
                 return false;
             }
         }
         if (await conn.UpdateAsync(model) == 0)
         {
             return false;
         }
         if (await conn.UpdateAsync(questionModel) == 0)
         {
             return false;
         }
         if (string.IsNullOrWhiteSpace(await conn.InsertAsync <string, DoctorEaringsDetailModel>(earingsDetailModel)))
         {
             return false;
         }
         return true;
     }));
 }