/***********************************************************************
* Project: baifenBinfa
* ProjectName: 百分兵法管理系统
* Web: http://chuanyin.com
* Author:
* Email:
* CreateTime: 202403/02
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Configuration;
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;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.Utility.Helper;
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
{
///
/// 经销商表 接口实现
///
public class CoreCmsDistributionServices : BaseServices, ICoreCmsDistributionServices
{
private readonly ICoreCmsDistributionRepository _dal;
private readonly ICoreCmsDistributionOrderRepository _distributionOrderRepository;
private readonly ICoreCmsDistributionGradeRepository _distributionGradeRepository;
private readonly ICoreCmsDistributionResultRepository _distributionResultRepository;
private readonly ICoreCmsDistributionConditionServices _coreCmsDistributionConditionServices;
private readonly ICoreCmsUserRepository _userRepository;
private readonly ICoreCmsGoodsRepository _goodsRepository;
private readonly ICoreCmsUserGradeRepository _userGradeRepository;
private readonly ICoreCmsOrderRepository _orderRepository;
private readonly ICoreCmsSettingServices _settingServices;
private readonly IUnitOfWork _unitOfWork;
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;
_userRepository = userRepository;
_goodsRepository = goodsRepository;
_userGradeRepository = userGradeRepository;
_settingServices = settingServices;
_orderRepository = orderRepository;
_distributionGradeRepository = distributionGradeRepository;
_distributionResultRepository = distributionResultRepository;
_coreCmsDistributionConditionServices = coreCmsDistributionConditionServices;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
_userBalanceServices = userBalanceServices;
_coreCmsUserServices = coreCmsUserServices;
_bfbfComAPIService = bfbfComAPIService;
}
#region 获取经销商信息
///
/// 获取经销商信息
///
/// 用户id
/// 是否检查满足条件
///
public async Task GetInfo(int userId, bool checkStatus = false)
{
var jm = new WebApiCallBack();
var allConfigs = await _settingServices.GetConfigDictionaries();
var info = await _dal.QueryByClauseAsync(p => p.userId == userId);
if (info != null && info.verifyStatus == (int)GlobalEnumVars.DistributionVerifyStatus.VerifyYes)
{
//总金额
info.TotalSettlementAmount = await _distributionOrderRepository.GetSumAsync(
p => p.isSettlement != (int)GlobalEnumVars.DistributionOrderSettlementStatus.SettlementCancel && p.userId == userId,
p => p.amount);
//已结算金额
info.SettlementAmount = await _distributionOrderRepository.GetSumAsync(
p => p.isSettlement == (int)GlobalEnumVars.DistributionOrderSettlementStatus.SettlementYes && p.userId == userId,
p => p.amount);
//冻结金额
info.FreezeAmount = await _distributionOrderRepository.GetSumAsync(
p => p.isSettlement == (int)GlobalEnumVars.DistributionOrderSettlementStatus.SettlementNo && p.userId == userId,
p => p.amount);
var dt = DateTime.Now;
//本月第一天时间
DateTime dtFirst = dt.AddDays(1 - (dt.Day));
dtFirst = new DateTime(dtFirst.Year, dtFirst.Month, dtFirst.Day, 0, 0, 0);
//获得某年某月的天数
int year = dt.Year;
int month = dt.Month;
int dayCount = DateTime.DaysInMonth(year, month);
DateTime dtLast = dtFirst.AddDays(dayCount - 1);
//本月订单数
info.CurrentMonthOrder = await _distributionOrderRepository.GetCountAsync(p =>
p.createTime >= dtFirst && p.createTime < dtLast && p.userId == userId);
info.Store = UserHelper.GetShareCodeByUserId(userId).ToString();
//本日开始结束时间
var day = dt.Day;
var dayStart = new DateTime(year, month, day, 0, 0, 0);
var datEnd = new DateTime(year, month, day, 23, 59, 59);
//今日收益
info.TodayFreezeAmount = await _distributionOrderRepository.GetSumAsync(
p => p.createTime > dayStart && p.createTime <= datEnd && p.userId == userId,
p => p.amount);
//今日订单
info.TodayOrder = await _distributionOrderRepository.GetCountAsync(
p => p.createTime > dayStart && p.createTime <= datEnd && p.userId == userId);
//今日会员
info.TodayUser = await _userRepository.GetCountAsync(p =>
p.parentId == userId && p.createTime > dayStart && p.createTime <= datEnd);
}
else if (info == null)
{
info = new CoreCmsDistribution();
}
info.TotalGoods = await _goodsRepository.GetCountAsync(p => p.isMarketable == true);
if (info.gradeId > 0)
{
var userGrade = await _userGradeRepository.QueryByIdAsync(info.gradeId);
if (userGrade != null)
{
info.GradeName = userGrade.title;
}
}
//检查是否满足条件
if ((checkStatus == true && info.id == 0) || info.verifyStatus != (int)GlobalEnumVars.DistributionVerifyStatus.VerifyYes)
{
info.NeedApply = true; //是否需要申请
info.ConditionMsg = "您的条件已满足。(点击申请)";
//无需审核,但是需要满足条件
var distributionType = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.DistributionType).ObjectToInt(0);
if (distributionType > 0 && distributionType == 3)
{
info.NeedApply = false;
info.ConditionStatus = false;//条件状态
info.ConditionProgress = 0;
//满足条件,直接成为会员
await CheckCondition(allConfigs, info, userId);
if (info.ConditionStatus == true && info.ConditionProgress == 100)
{
//添加用户
var userModel = await _userRepository.QueryByIdAsync(userId);
if (userModel != null)
{
var iData = new CoreCmsDistribution();
iData.name = !string.IsNullOrEmpty(userModel.nickName)
? userModel.nickName
: userModel.mobile;
iData.verifyStatus = (int)GlobalEnumVars.DistributionVerifyStatus.VerifyYes;
iData.verifyTime = DateTime.Now;
await AddData(iData, userId);
info.ConditionProgress = 100;
info.ConditionStatus = true;//条件状态
}
}
}
else
{
//无条件,但是需要审核
if (distributionType > 0 && distributionType == 1)
{
info.NeedApply = true;
info.ConditionProgress = 100;
info.ConditionStatus = true;//条件状态
info.ConditionMsg = "您的条件已满足。(前往申请)";
}
else if (distributionType > 0 && distributionType == 2)
{
await CheckCondition(allConfigs, info, userId);
}
}
}
jm.msg = "获取成功";
jm.status = true;
jm.data = info;
return jm;
}
#endregion
#region 添加用户信息
///
/// 添加用户信息
///
///
///
///
public async Task AddData(CoreCmsDistribution iData, int userId)
{
var jm = new WebApiCallBack();
if (string.IsNullOrEmpty(iData.mobile))
{
jm.msg = "请填写手机号";
return jm;
}
if (CommonHelper.IsMobile(iData.mobile) == false)
{
jm.msg = "请填写正确的手机号";
return jm;
}
if (string.IsNullOrEmpty(iData.name))
{
jm.msg = "请填写您的姓名";
return jm;
}
iData.userId = userId;
var info = await _dal.QueryByClauseAsync(p => p.userId == userId);
if (info != null)
{
jm.status = false;
jm.msg = "您已申请,请勿重复提交";
return jm;
}
//默认等级处理
if (iData.gradeId == 0)
{
var disGradeModel = await _distributionGradeRepository.QueryByClauseAsync(p => p.isDefault == true);
if (disGradeModel != null)
{
iData.gradeId = disGradeModel.id;
}
}
var allConfigs = await _settingServices.GetConfigDictionaries();
var distributionType = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.DistributionType).ObjectToInt(0);
if (distributionType == (int)GlobalEnumVars.DistributionConditionType.NoReview)
{
iData.verifyStatus = (int)GlobalEnumVars.DistributionVerifyStatus.VerifyYes;
}
else
{
iData.verifyStatus = (int)GlobalEnumVars.DistributionVerifyStatus.VerifyWait;
}
iData.isDelete = false;
iData.createTime = DateTime.Now;
//判断是否存在
var bl = await _dal.InsertAsync(iData) > 0;
jm.status = bl;
jm.msg = bl ? "申请成功" : "申请失败";
return jm;
}
#endregion
#region 检查是否可以成为经销商
//检查是否可以成为经销商
public async Task CheckCondition(Dictionary 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);
//支付金额
var payed = await _orderRepository.GetSumAsync(
p => p.payStatus == (int)GlobalEnumVars.OrderPayStatus.Yes && p.userId == userId, p => p.payedAmount);
if (payed < distributionMoney && distributionMoney > 0)
{
info.ConditionMsg = "您的消费额度未满足" + distributionMoney + "元无法申请,快去下单吧~";
}
else
{
info.ConditionProgress = 50;
//判断是否需要购买商品
var distributionGoods = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.DistributionGoods).ObjectToInt(0);
if (distributionGoods is > 0 and 1)
{
info.ConditionProgress += 50;
info.ConditionStatus = true;//条件状态
info.ConditionMsg = "您的条件已满足,马上申请。";
}
else
{
//任意商品
if (distributionGoods is > 0 and 2)
{
var orderCount = await _orderRepository.GetCountAsync(p =>
p.userId == userId && p.payStatus == (int)GlobalEnumVars.OrderPayStatus.Yes);
if (orderCount >= 1)
{
info.ConditionProgress += 50;
info.ConditionStatus = true;//条件状态
info.ConditionMsg = "您的条件已满足,马上申请。";
}
else
{
info.ConditionMsg = "您的条件未满足,请任意购买一件商品即可成为经销商。";
}
}
else if (distributionGoods is > 0 and 3) //购买指定商品
{
//判断是否购买指定商品
var distributionGoodsId = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.DistributionGoodsId).ObjectToInt(0);
var orderNum = _orderRepository.GetOrderNum(userId, distributionGoodsId);
if (orderNum >= 1)
{
info.ConditionProgress += 50;
info.ConditionStatus = true;//条件状态
info.ConditionMsg = "您的条件已满足,马上申请。";
}
else
{
var goodsInfo = await _goodsRepository.QueryByIdAsync(distributionGoodsId);
if (goodsInfo != null)
{
info.ConditionMsg = "您的条件未满足,请购买指定的【" + goodsInfo.name + "】商品即可成为经销商。";
}
else
{
info.ConditionMsg = "您的条件未满足,请购买指定的商品即可成为经销商。";
}
}
}
}
}
}
#endregion
#region 获取我的推广订单
///
/// 获取我的推广订单
///
///
///
///
/// 类型
///
public async Task GetMyOrderList(int userId, int page, int limit = 10, int typeId = 0)
{
var jm = new WebApiCallBack();
jm.status = true;
jm.msg = "获取成功";
var pageList = await _dal.QueryOrderPageAsync(userId, page, limit, typeId);
jm.data = pageList;
jm.code = pageList.TotalCount;
return jm;
}
#endregion
#region 获取店铺信息
///
/// 获取店铺信息
///
///
///
public async Task GetStore(int userId)
{
var jm = new WebApiCallBack();
jm.status = true;
var info = await _dal.QueryByClauseAsync(p => p.userId == userId);
if (info != null)
{
info.TotalGoods = await _goodsRepository.GetCountAsync(p => p.isMarketable == true && p.isDel == false);
jm.data = new
{
info.createTime,
info.name,
info.storeBanner,
info.storeDesc,
info.storeLogo,
info.storeName,
info.TotalGoods
};
}
return jm;
}
#endregion
#region 获取当前用户返佣设置
///
/// 获取当前用户返佣设置
///
///
///
public async Task 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 = "不是经销商的,不返利";
return jm;
}
var allConfigs = await _settingServices.GetConfigDictionaries();
var dto = new DistributionDto();
if (info.gradeId > 0)
{
var res = await _distributionResultRepository.QueryListByClauseAsync(p => p.gradeId == info.gradeId, p => p.id, OrderByType.Asc, true, true);
if (res != null && res.Any())
{
dto.grade_id = info.gradeId;
res.ForEach(p =>
{
var obj = JObject.Parse(p.parameters);
switch (p.code)
{
case "COMMISSION_1":
dto.commission_1 = new Commission()
{
type = obj["commissionType"].ObjectToInt(0),
discount = obj["discount"].ObjectToDecimal(0)
};
break;
case "COMMISSION_2":
dto.commission_2 = new Commission()
{
type = obj["commissionType"].ObjectToInt(0),
discount = obj["discount"].ObjectToDecimal(0)
};
break;
case "COMMISSION_3":
dto.commission_3 = new Commission()
{
type = obj["commissionType"].ObjectToInt(0),
discount = obj["discount"].ObjectToDecimal(0)
};
break;
}
});
}
else
{
jm.msg = "未获取到佣金设置,不返利";
return jm;
}
}
jm.status = true;
jm.data = dto;
jm.msg = "获取成功";
return jm;
}
#endregion
#region 检查当前用户是否可以升级
///
/// 检查当前用户是否可以升级
///
///
///
public async Task CheckUpdate(int userId)
{
var jm = new AdminUiCallBack();
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;
{
var condition = true;//默认满足升级
var conditionList = await _coreCmsDistributionConditionServices.QueryListByClauseAsync(p => p.gradeId == grade.id);
if (!conditionList.Any())
{
jm.msg = "未设置条件,无法升级";
return jm;
}
//循环所有条件,判断是否可以升级
foreach (var item in conditionList)
{
var parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
if (parameters == null)
{
condition = false;
break;
}
//只要购买了商品并且订单完结。
if (string.Equals(item.code, GlobalEnumVars.DistributionConditionsCode.GOODS_ALL.ToString(), StringComparison.CurrentCultureIgnoreCase))
{
if (!parameters.ContainsKey("num"))
{
condition = false;
break;
}
var num = parameters["num"].ObjectToInt(0);
var getCount = await _orderRepository.GetCountAsync(p =>
p.userId == userId && p.status == (int)GlobalEnumVars.OrderAllStatusType.ALL_COMPLETED);
condition = getCount > num;
if (condition == false)
{
break;
}
}
//购买了指定的商品
if (string.Equals(item.code, GlobalEnumVars.DistributionConditionsCode.GOODS_IDS.ToString(), StringComparison.CurrentCultureIgnoreCase))
{
//goodsId
if (!parameters.ContainsKey("goodsId"))
{
condition = false;
break;
}
var goodsId = parameters["goodsId"].ObjectToInt(0);
var getCount = _orderRepository.GetOrderNum(userId, goodsId, (int)GlobalEnumVars.OrderAllStatusType.ALL_COMPLETED);
condition = getCount > 0;
if (condition == false)
{
break;
}
}
//个人消费总额(已完成的订单)
if (string.Equals(item.code, GlobalEnumVars.DistributionConditionsCode.USER_ORDERS.ToString(), StringComparison.CurrentCultureIgnoreCase))
{
if (!parameters.ContainsKey("money") || !parameters.ContainsKey("limit_day"))
{
condition = false;
break;
}
var money = parameters["money"].ObjectToInt(0);
var limitDay = parameters["limit_day"].ObjectToInt(0);
var startTime = DateTime.Now.AddDays(-limitDay);
var endTime = DateTime.Now;
var getAmount = await _orderRepository.GetSumAsync(p => p.userId == userId && p.status == (int)GlobalEnumVars.OrderAllStatusType.ALL_COMPLETED && p.paymentTime > startTime && p.paymentTime < endTime, p => p.orderAmount);
condition = getAmount > money;
if (condition == false)
{
break;
}
}
//个人订单数量(已完成的订单)
if (string.Equals(item.code, GlobalEnumVars.DistributionConditionsCode.USER_ORDERSNUM.ToString(), StringComparison.CurrentCultureIgnoreCase))
{
if (!parameters.ContainsKey("num") || !parameters.ContainsKey("limit_day"))
{
condition = false;
break;
}
var num = parameters["num"].ObjectToInt(0);
var limitDay = parameters["limit_day"].ObjectToInt(0);
var startTime = DateTime.Now.AddDays(-limitDay);
var endTime = DateTime.Now;
var getCount = await _orderRepository.GetCountAsync(p => p.userId == userId && p.status == (int)GlobalEnumVars.OrderAllStatusType.ALL_COMPLETED && p.paymentTime > startTime && p.paymentTime < endTime);
condition = getCount > num;
if (condition == false)
{
break;
}
}
}
if (condition)
{
await _dal.UpdateAsync(p => new CoreCmsDistribution() { gradeId = grade.id }, p => p.userId == userId);
jm.msg = "升级成功";
}
else
{
jm.msg = "条件暂不满足,无法升级";
}
}
}
return jm;
}
#endregion
///
/// 获取代理商排行
///
/// 当前页面索引
/// 分布大小
///
public async Task> QueryRankingPageAsync(int pageIndex = 1, int pageSize = 20)
{
return await _dal.QueryRankingPageAsync(pageIndex, pageSize);
}
#region 重写根据条件查询分页数据
///
/// 重写根据条件查询分页数据
///
/// 判断集合
/// 排序方式
/// 当前页面索引
/// 分布大小
///
/// 是否使用WITH(NOLOCK)
///
public async Task> QueryPageAsync(Expression> predicate,
Expression> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false)
{
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()
.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().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().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 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 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 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().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().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 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 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;
}
///
/// 获取经销商推广费
///
///
public List QueryAchievement(int UserId)
{
var totals = _unitOfWork.GetDbClient().Queryable().Where(x =>
x.isdelete == false
&& x.userID == UserId
).OrderByDescending(x=>x.startTime).ToList();
var distributionRankingDTOs = new List();
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;
}
}
}