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 | 301 +++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 283 insertions(+), 18 deletions(-)
diff --git a/CoreCms.Net.Services/Distribution/CoreCmsDistributionServices.cs b/CoreCms.Net.Services/Distribution/CoreCmsDistributionServices.cs
index b1c1e9b..004e030 100644
--- a/CoreCms.Net.Services/Distribution/CoreCmsDistributionServices.cs
+++ b/CoreCms.Net.Services/Distribution/CoreCmsDistributionServices.cs
@@ -1,10 +1,10 @@
/***********************************************************************
- * Project: CoreCms
- * ProjectName: 鏍稿績鍐呭绠$悊绯荤粺
- * Web: https://www.corecms.net
- * Author: 澶х伆鐏�
- * Email: jianweie@163.com
- * CreateTime: 2021/1/31 21:45:10
+ * Project: baifenBinfa
+ * ProjectName: 鐧惧垎鍏垫硶绠$悊绯荤粺
+ * Web: http://chuanyin.com
+ * Author:
+ * Email:
+ * CreateTime: 202403/02
* Description: 鏆傛棤
***********************************************************************/
@@ -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