From 557c2711a3e103ebc3d0492344eca9730d5e92b2 Mon Sep 17 00:00:00 2001 From: 移动系统liao <liaoxujun@qq.com> Date: 星期一, 17 二月 2025 10:47:47 +0800 Subject: [PATCH] 增加司机配送单超时处理任务,防止一直不停手机定位信息, --- CoreCms.Net.Services/Distribution/CoreCmsDistributionServices.cs | 293 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 279 insertions(+), 14 deletions(-) diff --git a/CoreCms.Net.Services/Distribution/CoreCmsDistributionServices.cs b/CoreCms.Net.Services/Distribution/CoreCmsDistributionServices.cs index 367ab30..004e030 100644 --- a/CoreCms.Net.Services/Distribution/CoreCmsDistributionServices.cs +++ b/CoreCms.Net.Services/Distribution/CoreCmsDistributionServices.cs @@ -1,7 +1,7 @@ /*********************************************************************** - * Project: CoreCms + * Project: baifenBinfa * ProjectName: 鐧惧垎鍏垫硶绠$悊绯荤粺 - * Web: hhtp://chuanyin.com + * Web: http://chuanyin.com * Author: * Email: * CreateTime: 202403/02 @@ -17,8 +17,11 @@ 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; using CoreCms.Net.Model.ViewModels.UI; @@ -27,13 +30,15 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NPOI.SS.Formula.Functions; +using Org.BouncyCastle.Asn1.Cmp; using SqlSugar; +using static CoreCms.Net.Configuration.GlobalEnumVars; namespace CoreCms.Net.Services { /// <summary> - /// 鍒嗛攢鍟嗚〃 鎺ュ彛瀹炵幇 + /// 缁忛攢鍟嗚〃 鎺ュ彛瀹炵幇 /// </summary> public class CoreCmsDistributionServices : BaseServices<CoreCmsDistribution>, ICoreCmsDistributionServices { @@ -48,7 +53,14 @@ private readonly ICoreCmsOrderRepository _orderRepository; private readonly ICoreCmsSettingServices _settingServices; private readonly IUnitOfWork _unitOfWork; - public CoreCmsDistributionServices(IUnitOfWork unitOfWork, ICoreCmsDistributionRepository dal, ICoreCmsDistributionOrderRepository distributionOrderRepository, ICoreCmsUserRepository userRepository, ICoreCmsGoodsRepository goodsRepository, ICoreCmsUserGradeRepository userGradeRepository, ICoreCmsSettingServices settingServices, ICoreCmsOrderRepository orderRepository, ICoreCmsDistributionGradeRepository distributionGradeRepository, ICoreCmsDistributionResultRepository distributionResultRepository, ICoreCmsDistributionConditionServices coreCmsDistributionConditionServices) + private readonly ICoreCmsUserBalanceServices _userBalanceServices; + private readonly ICoreCmsUserServices _coreCmsUserServices; + private readonly IBfbfComAPIService _bfbfComAPIService; + + + + 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; @@ -62,11 +74,18 @@ _coreCmsDistributionConditionServices = coreCmsDistributionConditionServices; base.BaseDal = dal; _unitOfWork = unitOfWork; + _userBalanceServices = userBalanceServices; + _coreCmsUserServices = coreCmsUserServices; + + + _bfbfComAPIService = bfbfComAPIService; + + } - #region 鑾峰彇鍒嗛攢鍟嗕俊鎭� + #region 鑾峰彇缁忛攢鍟嗕俊鎭� /// <summary> - /// 鑾峰彇鍒嗛攢鍟嗕俊鎭� + /// 鑾峰彇缁忛攢鍟嗕俊鎭� /// </summary> /// <param name="userId">鐢ㄦ埛id</param> /// <param name="checkStatus">鏄惁妫�鏌ユ弧瓒虫潯浠�</param> @@ -84,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, @@ -262,14 +295,14 @@ } #endregion - #region 妫�鏌ユ槸鍚﹀彲浠ユ垚涓哄垎閿�鍟� - //妫�鏌ユ槸鍚﹀彲浠ユ垚涓哄垎閿�鍟� + #region 妫�鏌ユ槸鍚﹀彲浠ユ垚涓虹粡閿�鍟� + //妫�鏌ユ槸鍚﹀彲浠ユ垚涓虹粡閿�鍟� public async Task CheckCondition(Dictionary<string, DictionaryKeyValues> allConfigs, CoreCmsDistribution info, int userId = 0) { //鍒ゆ柇娑堣垂 info.ConditionStatus = false;//鏉′欢鐘舵�� info.ConditionProgress = 0; - //鑾峰彇鎴愪负鍒嗛攢鍟嗘潯浠� + //鑾峰彇鎴愪负缁忛攢鍟嗘潯浠� //var DistributionType = CommonHelper.GetConfigDictionary(allConfigs, GlobalSettingConstVars.DistributionType).ObjectToInt(0); var distributionMoney = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.DistributionMoney).ObjectToInt(0); //鏀粯閲戦 @@ -305,7 +338,7 @@ } else { - info.ConditionMsg = "鎮ㄧ殑鏉′欢鏈弧瓒筹紝璇蜂换鎰忚喘涔颁竴浠跺晢鍝佸嵆鍙垚涓哄垎閿�鍟嗐��"; + info.ConditionMsg = "鎮ㄧ殑鏉′欢鏈弧瓒筹紝璇蜂换鎰忚喘涔颁竴浠跺晢鍝佸嵆鍙垚涓虹粡閿�鍟嗐��"; } } else if (distributionGoods is > 0 and 3) //璐拱鎸囧畾鍟嗗搧 @@ -324,11 +357,11 @@ var goodsInfo = await _goodsRepository.QueryByIdAsync(distributionGoodsId); if (goodsInfo != null) { - info.ConditionMsg = "鎮ㄧ殑鏉′欢鏈弧瓒筹紝璇疯喘涔版寚瀹氱殑銆�" + goodsInfo.name + "銆戝晢鍝佸嵆鍙垚涓哄垎閿�鍟嗐��"; + info.ConditionMsg = "鎮ㄧ殑鏉′欢鏈弧瓒筹紝璇疯喘涔版寚瀹氱殑銆�" + goodsInfo.name + "銆戝晢鍝佸嵆鍙垚涓虹粡閿�鍟嗐��"; } else { - info.ConditionMsg = "鎮ㄧ殑鏉′欢鏈弧瓒筹紝璇疯喘涔版寚瀹氱殑鍟嗗搧鍗冲彲鎴愪负鍒嗛攢鍟嗐��"; + info.ConditionMsg = "鎮ㄧ殑鏉′欢鏈弧瓒筹紝璇疯喘涔版寚瀹氱殑鍟嗗搧鍗冲彲鎴愪负缁忛攢鍟嗐��"; } } @@ -405,11 +438,17 @@ 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) { - jm.msg = "涓嶆槸鍒嗛攢鍟嗙殑锛屼笉杩斿埄"; + jm.msg = "涓嶆槸缁忛攢鍟嗙殑锛屼笉杩斿埄"; return jm; } var allConfigs = await _settingServices.GetConfigDictionaries(); @@ -477,7 +516,7 @@ var info = await _dal.QueryByClauseAsync(p => p.userId == userId); if (info is { gradeId: > 0 }) { - //鎵句笅鏈夋病鏈夊彲浠ュ崌绾х殑鍒嗛攢鍟嗙瓑绾э紙涓�娆″彧鍗囦竴绾э級 + //鎵句笅鏈夋病鏈夊彲浠ュ崌绾х殑缁忛攢鍟嗙瓑绾э紙涓�娆″彧鍗囦竴绾э級 var grade = await _distributionGradeRepository.QueryByClauseAsync(p => p.sortId > info.gradeId && p.isAutoUpGrade == true, p => p.sortId, OrderByType.Asc, true); if (grade == null) return jm; { @@ -624,8 +663,234 @@ { return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock); } + + #endregion + public async Task<(decimal,DateTime?, DateTime?)> AchievementTotal(int UserId) + { + var StartTime= await _unitOfWork.GetDbClient() + .Queryable<DistributionAchievement>() + .Where(x=>x.userID == UserId&&x.isdelete==false) + .Select(x=>x.endTime) + .OrderByDescending(x=>x) + .FirstAsync(); + if (StartTime == null) + ///鏈�澶氱粺璁′袱骞村唴鐨勪笟缁� + StartTime = DateTime.Now.AddYears(-2); + else + StartTime= StartTime.Value.AddSeconds(1); + var endTime = DateTime.Now; + //payStatus = (int)GlobalEnumVars.OrderPayStatus.Refunded, + // status = (int)GlobalEnumVars.OrderStatus.Complete + //var result = await _balanceServices.Change(item.userId, (int)GlobalEnumVars.UserBalanceSourceTypes.Distribution, + // item.amount, item.orderId); + 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.updateTime > StartTime + && x.updateTime < endTime + ).SumAsync(x => x.orderAmount); + var orderToler= await _unitOfWork.GetDbClient().Queryable<DistributionAchievementOrder>().Where(x => x.userID == UserId + && x.createTime > StartTime + && x.createTime < endTime).SumAsync(x => x.achievementTotal); + total = total + orderToler; + if (total==0) + return (total,null, null); + else + return (total, StartTime, endTime); + } + + public async Task<decimal> AchievementBonus(decimal AttributeTotal) + { + + var allConfigs = await _settingServices.GetConfigDictionaries(); + var key = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.DictionaryAchievementSet).ObjectToInt(0); + return AttributeTotal *(decimal)key / 100; + } + + public async Task<bool> SettledAchievement(int UserId) + { + //闈炰緵搴斿晢锛屽仠姝� + var da = await _dal.GetCountAsync(x => x.userId == UserId && x.verifyStatus == (int)GlobalEnumVars.DistributionVerifyStatus.VerifyYes, isDataCache: true, cacheTimes: 1); + if (da == 0) + return true; + var att = await AchievementTotal(UserId); + if(att.Item1>0) + { + DistributionAchievement oder = new DistributionAchievement + { + achievementTotals = att.Item1, + achievementBonus = await AchievementBonus(att.Item1), + createBy="绯荤粺缁撶畻", + createTime=DateTime.Now, + startTime=att.Item2, + endTime = att.Item3, + userID = UserId + + }; + //寤虹珛缁撶畻鍗� + var id= await _unitOfWork.GetDbClient().Insertable(oder).ExecuteCommandIdentityIntoEntityAsync(); + var a= await _userBalanceServices.Change(UserId, (int )UserBalanceSourceTypes.DistributionAchievement, + oder.achievementBonus,id.ToString()); + if(a.code!=0) + { + NLogUtil.WriteAll(NLog.LogLevel.Fatal, LogType.DataBase, "缁忛攢鍟嗕笟缁╂彁鎴愬啓鍏ヤ綑棰濆け璐�", a.msg); + return false; + } + return true; + } + 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; + DistributionAchievementOrder oder = new DistributionAchievementOrder + { + achievementTotal = Parma.Money, + createBy = "缁忛攢鍟嗕笟缁╁啓鍏�", + createTime = DateTime.Now, + orderId = Parma.OderId, + userID = Parma.UserID, + orderType=(int ) Parma.SourceTypes + + + + + }; + + 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; + } } } -- Gitblit v1.9.1