/***********************************************************************
|
* 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
|
{
|
/// <summary>
|
/// 经销商表 接口实现
|
/// </summary>
|
public class CoreCmsDistributionServices : BaseServices<CoreCmsDistribution>, 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 获取经销商信息
|
/// <summary>
|
/// 获取经销商信息
|
/// </summary>
|
/// <param name="userId">用户id</param>
|
/// <param name="checkStatus">是否检查满足条件</param>
|
/// <returns></returns>
|
public async Task<WebApiCallBack> 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 添加用户信息
|
/// <summary>
|
/// 添加用户信息
|
/// </summary>
|
/// <param name="iData"></param>
|
/// <param name="userId"></param>
|
/// <returns></returns>
|
public async Task<WebApiCallBack> 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<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);
|
//支付金额
|
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 获取我的推广订单
|
|
/// <summary>
|
/// 获取我的推广订单
|
/// </summary>
|
/// <param name="userId"></param>
|
/// <param name="page"></param>
|
/// <param name="limit"></param>
|
/// <param name="typeId">类型</param>
|
/// <returns></returns>
|
public async Task<WebApiCallBack> 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 获取店铺信息
|
/// <summary>
|
/// 获取店铺信息
|
/// </summary>
|
/// <param name="userId"></param>
|
/// <returns></returns>
|
public async Task<WebApiCallBack> 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 获取当前用户返佣设置
|
/// <summary>
|
/// 获取当前用户返佣设置
|
/// </summary>
|
/// <param name="userId"></param>
|
/// <returns></returns>
|
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 = "不是经销商的,不返利";
|
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 检查当前用户是否可以升级
|
|
/// <summary>
|
/// 检查当前用户是否可以升级
|
/// </summary>
|
/// <param name="userId"></param>
|
/// <returns></returns>
|
public async Task<AdminUiCallBack> 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
|
|
|
/// <summary>
|
/// 获取代理商排行
|
/// </summary>
|
/// <param name="pageIndex">当前页面索引</param>
|
/// <param name="pageSize">分布大小</param>
|
/// <returns></returns>
|
public async Task<IPageList<DistributionRankingDTO>> QueryRankingPageAsync(int pageIndex = 1, int pageSize = 20)
|
{
|
return await _dal.QueryRankingPageAsync(pageIndex, pageSize);
|
}
|
|
|
#region 重写根据条件查询分页数据
|
/// <summary>
|
/// 重写根据条件查询分页数据
|
/// </summary>
|
/// <param name="predicate">判断集合</param>
|
/// <param name="orderByType">排序方式</param>
|
/// <param name="pageIndex">当前页面索引</param>
|
/// <param name="pageSize">分布大小</param>
|
/// <param name="orderByExpression"></param>
|
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
/// <returns></returns>
|
public async Task<IPageList<CoreCmsDistribution>> QueryPageAsync(Expression<Func<CoreCmsDistribution, bool>> predicate,
|
Expression<Func<CoreCmsDistribution, object>> 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<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;
|
}
|
}
|
}
|