移动系统liao
2024-05-21 4d6cbddc0762c0164b072dc59ac8e0d51a0199ba
CoreCms.Net.Services/Distribution/CoreCmsDistributionServices.cs
@@ -17,8 +17,10 @@
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.IServices;
using CoreCms.Net.IServices.baifenbingfa;
using CoreCms.Net.Loging;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.Entities.baifenbingfa.apply;
using CoreCms.Net.Model.Entities.Distribution;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.DTO.Distribution;
@@ -52,8 +54,13 @@
        private readonly ICoreCmsSettingServices _settingServices;
        private readonly IUnitOfWork _unitOfWork;
        private readonly ICoreCmsUserBalanceServices _userBalanceServices;
        private readonly ICoreCmsUserServices _coreCmsUserServices;
        private readonly IBfbfComAPIService _bfbfComAPIService;
        public CoreCmsDistributionServices(IUnitOfWork unitOfWork, ICoreCmsDistributionRepository dal, ICoreCmsDistributionOrderRepository distributionOrderRepository, ICoreCmsUserRepository userRepository, ICoreCmsGoodsRepository goodsRepository, ICoreCmsUserGradeRepository userGradeRepository, ICoreCmsSettingServices settingServices, ICoreCmsOrderRepository orderRepository, ICoreCmsDistributionGradeRepository distributionGradeRepository, ICoreCmsDistributionResultRepository distributionResultRepository, ICoreCmsDistributionConditionServices coreCmsDistributionConditionServices, ICoreCmsUserBalanceServices userBalanceServices)
        public CoreCmsDistributionServices(IBfbfComAPIService bfbfComAPIService, IUnitOfWork unitOfWork, ICoreCmsDistributionRepository dal, ICoreCmsDistributionOrderRepository distributionOrderRepository, ICoreCmsUserRepository userRepository, ICoreCmsGoodsRepository goodsRepository, ICoreCmsUserGradeRepository userGradeRepository, ICoreCmsSettingServices settingServices, ICoreCmsOrderRepository orderRepository, ICoreCmsDistributionGradeRepository distributionGradeRepository, ICoreCmsDistributionResultRepository distributionResultRepository, ICoreCmsDistributionConditionServices coreCmsDistributionConditionServices, ICoreCmsUserBalanceServices userBalanceServices
              , ICoreCmsUserServices coreCmsUserServices)
        {
            this._dal = dal;
            _distributionOrderRepository = distributionOrderRepository;
@@ -68,6 +75,10 @@
            base.BaseDal = dal;
            _unitOfWork = unitOfWork;
            _userBalanceServices = userBalanceServices;
            _coreCmsUserServices = coreCmsUserServices;
            _bfbfComAPIService = bfbfComAPIService;
          
        }
@@ -92,6 +103,20 @@
                info.TotalSettlementAmount = await _distributionOrderRepository.GetSumAsync(
                    p => p.isSettlement != (int)GlobalEnumVars.DistributionOrderSettlementStatus.SettlementCancel && p.userId == userId,
                    p => p.amount);
                var lisdata = await _unitOfWork.GetDbClient().Queryable<CoreCmsDistributionOrder>().Where(x=>x.userId == userId&&x.isSettlement== (int)GlobalEnumVars.DistributionOrderSettlementStatus.SettlementNo)
                    .Select(x=>new CoreCmsDistributionOrder
                    {
                         amount = x.amount,
                        OderState= SqlFunc.Subqueryable<CoreCmsOrder>().Where(c=>c.orderId==x.orderId).Select(c=>c.confirmStatus),
                    }).WithCache(10).ToListAsync();
                //可领金额
                info.DistributionKeLingTotals = lisdata.Where(x=>x.OderState== (int)GlobalEnumVars.OrderConfirmStatus.ConfirmReceipt
                || x.OderState == (int)GlobalEnumVars.OrderShipStatus.Yes).Sum(x=>x.amount);
                //应领金额
                info.DistributionYingLingTotals = lisdata.Where(x => x.OderState == (int)GlobalEnumVars.OrderConfirmStatus.ReceiptNotConfirmed
                || x.OderState == (int)GlobalEnumVars.OrderShipStatus.Yes).Sum(x => x.amount); ;
                //已结算金额
                info.SettlementAmount = await _distributionOrderRepository.GetSumAsync(
                    p => p.isSettlement == (int)GlobalEnumVars.DistributionOrderSettlementStatus.SettlementYes && p.userId == userId,
@@ -413,6 +438,12 @@
        public async Task<WebApiCallBack> GetGradeAndCommission(int userId)
        {
            var jm = new WebApiCallBack();
            //百分兵法判断是否是经销商
             if(!await _bfbfComAPIService.IsDictionary(userId))
            {
                jm.msg = "不是经销商的,不返利";
                return jm;
            }
            var info = await _dal.QueryByClauseAsync(p => p.userId == userId);
            if (info == null)
@@ -713,14 +744,113 @@
            return true;
        }
        public async Task<bool> SettledAllAchievement()
        {
            //查询用户
            var coreCmsUsers = await _userRepository.QueryListByClauseAsync(x => x.isDelete == false && x.status == 1);
            foreach(var coreCmsUser in coreCmsUsers)
            {  //非供应商,停止
                var da = await _dal.GetCountAsync(x => x.userId == coreCmsUser.id && x.verifyStatus == (int)GlobalEnumVars.DistributionVerifyStatus.VerifyYes, isDataCache: true, cacheTimes: 1);
                if (da == 0)
                    continue;
                //查询是否已经计算过了
                DateTime StartTime = new DateTime(DateTime.Now.AddYears(-1).Year, 1, 1);
                DateTime endTime = new DateTime(DateTime.Now.Year, 1, 1).AddDays(-1);
                var total = _unitOfWork.GetDbClient().Queryable<DistributionAchievement>().Where(x =>
          x.isdelete == false
          && x.userID == coreCmsUser.id
          && x.startTime == StartTime
          && x.endTime == endTime
          ).ToList();
                if (total != null && total.Count > 0)
                    continue;
                var att = await AchievementTotalAll(coreCmsUser.id);
                if (att.Item1 > 0)
                {
                    DistributionAchievement oder = new DistributionAchievement
                    {
                        achievementTotals = att.Item1,
                        achievementBonus = await AchievementBonuscount(att.Item1),
                        createBy = "系统结算",
                        createTime = DateTime.Now,
                        startTime = att.Item2,
                        endTime = att.Item3,
                        userID = coreCmsUser.id
                    };
                    //建立结算单
                    var id = await _unitOfWork.GetDbClient().Insertable(oder).ExecuteCommandIdentityIntoEntityAsync();
                    if (oder.achievementBonus > 0)
                    {
                        var jm = await _coreCmsUserServices.UpdateBalance(coreCmsUser.id, oder.achievementBonus, "经销商推广费用写入余额");
                        if (jm.code != 0)
                        {
                            NLogUtil.WriteAll(NLog.LogLevel.Fatal, LogType.DataBase, "经销商推广费用写入余额失败", jm.msg);
                            return false;
                        }
                    }
                    return true;
                }
            }
            return true;
        }
        public async Task<(decimal, DateTime?, DateTime?)> AchievementTotalAll(int UserId)
        {
            DateTime StartTime = new DateTime(DateTime.Now.AddYears(-1).Year, 1, 1);
            DateTime endTime = new DateTime(DateTime.Now.Year, 1, 1);
            var total = await _unitOfWork.GetDbClient().Queryable<CoreCmsOrder>().Where(x => x.status == (int)GlobalEnumVars.OrderStatus.Complete
            && (x.payStatus != (int)GlobalEnumVars.OrderPayStatus.No || x.payStatus != (int)GlobalEnumVars.OrderPayStatus.Refunded)
            && x.isdel == false
            && x.userId == UserId
            && x.updateTime > StartTime
            && x.updateTime < endTime
            ).SumAsync(x => x.orderAmount);
            return (total, StartTime, endTime.AddDays(-1));
        }
        public async Task<decimal> AchievementBonuscount(decimal AttributeTotal)
        {
            var allConfigs = await _settingServices.GetConfigDictionaries();
            var tuiGuangFeiYong = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.DictionaryTuiGuangFeiYong).ObjectToInt(0);
            var yeJiMenKan = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.DictionaryYeJiMenKan).ObjectToInt(0);
            if(AttributeTotal <= yeJiMenKan)
            {
                return 0;
            }
            return (AttributeTotal - (decimal)yeJiMenKan) * (decimal)tuiGuangFeiYong / 100;
        }
        public async Task<bool> CreateDistributionAchievementOrder(CreateDAOrderInParam Parma)
        {
           //非供应商,停止
         var da=  await  _dal.GetCountAsync(x=>x.userId== Parma.UserID && x.verifyStatus== (int)GlobalEnumVars.DistributionVerifyStatus.VerifyYes,isDataCache:true,cacheTimes:1);
            if (da == 0)
                return true;
            var oder = new DistributionAchievementOrder
            DistributionAchievementOrder oder = new DistributionAchievementOrder
            {
                achievementTotal = Parma.Money,
                createBy = "经销商业绩写入",
@@ -737,5 +867,30 @@
          return   await  _unitOfWork.GetDbClient().Updateable(oder).ExecuteCommandAsync()>0;
             
        }
        /// <summary>
        ///     获取经销商推广费
        /// </summary>
        /// <returns></returns>
        public  List<DistributionRankingDTO> QueryAchievement(int UserId)
        {
            var totals = _unitOfWork.GetDbClient().Queryable<DistributionAchievement>().Where(x =>
        x.isdelete == false
        && x.userID == UserId
        ).OrderByDescending(x=>x.startTime).ToList();
            var distributionRankingDTOs = new List<DistributionRankingDTO>();
            foreach(var distributionAchievement in totals)
            {
                var distributionRankingDTO = new DistributionRankingDTO();
                distributionRankingDTO.startTime = distributionAchievement.startTime.HasValue ? distributionAchievement.startTime.Value.ToString("yyyy-MM-dd") : "";
                distributionRankingDTO.endTime = distributionAchievement.endTime.HasValue ? distributionAchievement.endTime.Value.ToString("yyyy-MM-dd") : "";
                distributionRankingDTO.achievementTotals = distributionAchievement.achievementTotals.ToString("F2");
                distributionRankingDTO.achievementBonus = distributionAchievement.achievementBonus.ToString("F2");
                distributionRankingDTOs.Add(distributionRankingDTO);
            }
            return distributionRankingDTOs;
        }
    }
}