/***********************************************************************
* 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.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 SqlSugar;
namespace CoreCms.Net.Services
{
///
/// 经销商订单记录表 接口实现
///
public class CoreCmsDistributionOrderServices : BaseServices, ICoreCmsDistributionOrderServices
{
private readonly ICoreCmsDistributionOrderRepository _dal;
private readonly ICoreCmsUserServices _userServices;
private readonly ICoreCmsDistributionServices _distributionServices;
private readonly ICoreCmsOrderServices _orderServices;
private readonly ICoreCmsOrderItemServices _orderItemServices;
private readonly ICoreCmsProductsDistributionServices _productsDistributionServices;
private readonly ICoreCmsProductsServices _productsServices;
private readonly ICoreCmsUserBalanceServices _balanceServices;
private readonly ICoreCmsGoodsServices _goodsServices;
private readonly ICoreCmsDistributionOrderDetailsServices _distributionOrderDetailsServices;
private readonly ICoreCmsSettingServices _settingServices;
private readonly IBfbfComAPIService _bfbfComAPIService;
private readonly IUnitOfWork _unitOfWork;
public CoreCmsDistributionOrderServices(IBfbfComAPIService bfbfComAPIService, IUnitOfWork unitOfWork, ICoreCmsDistributionOrderRepository dal, ICoreCmsDistributionServices distributionServices, ICoreCmsUserBalanceServices balanceServices, ICoreCmsOrderServices orderServices, ICoreCmsUserServices userServices, ICoreCmsOrderItemServices orderItemServices, ICoreCmsProductsDistributionServices productsDistributionServices, ICoreCmsProductsServices productsServices, ICoreCmsGoodsServices goodsServices, ICoreCmsDistributionOrderDetailsServices distributionOrderDetailsServices, ICoreCmsSettingServices settingServices)
{
this._dal = dal;
_distributionServices = distributionServices;
_balanceServices = balanceServices;
_orderServices = orderServices;
_userServices = userServices;
_orderItemServices = orderItemServices;
_productsDistributionServices = productsDistributionServices;
_productsServices = productsServices;
_goodsServices = goodsServices;
_distributionOrderDetailsServices = distributionOrderDetailsServices;
_settingServices = settingServices;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
_bfbfComAPIService = bfbfComAPIService;
}
#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
#region 添加分销订单关联记录
///
/// 添加分销订单关联记录
///
///
///
public async Task AddData(CoreCmsOrder order)
{
var jm = new WebApiCallBack();
//查询获取几级返利
var user = await _userServices.QueryByClauseAsync(p => p.id == order.userId);
if (user is { parentId: > 0 })
{
//获取购物明细
var orderItems = await _unitOfWork.GetDbClient().Queryable().Where(p => p.orderId == order.orderId).Includes(x => x.productInfo).ToListAsync();
//await _orderItemServices.QueryListByClauseAsync(p => p.orderId == order.orderId);
var goodIds = orderItems.Select(p => p.goodsId).ToList();
var productIds = orderItems.Select(p => p.productId).ToList();
//获取货品数据
var goods = await _goodsServices.QueryListByClauseAsync(p => goodIds.Contains(p.id));
//获取货品数据
var products = await _productsServices.QueryListByClauseAsync(p => productIds.Contains(p.id));
//获取货品关联的分销数据
var productsDistributions = await _productsDistributionServices.QueryListByClauseAsync(p => productIds.Contains(p.productsId));
var allConfigs = await _settingServices.GetConfigDictionaries();
var distributionLevel = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.DistributionLevel).ObjectToInt(0);
await AddOther(order, orderItems, goods, products, productsDistributions, 1, user.parentId, distributionLevel); //本级是否返利
}
jm.status = true;
return jm;
}
#endregion
#region 循环插入上级
///
/// 循环插入上级
///
/// 订单信息
///
///
/// 订单货品
/// 货品分销数据
/// 第几级
/// 用户id
/// 三级分销开启的层级
///
private async Task AddOther(CoreCmsOrder order, List orderItems, List goods, List products, List productsDistributions, int level = 0, int userId = 0, int distributionLevel = 3)
{
var user = await _userServices.QueryByClauseAsync(p => p.id == userId);
if (user != null)
{
var commission = await _distributionServices.GetGradeAndCommission(user.id);
if (commission.status && commission.data != null) //不是经销商的,不返利。
{
var ommissionDto = commission.data as DistributionDto;
//直返本级
decimal amount = 0;
var distributionOrderDetails = new List();
//百分兵法判断订单用户是否是经销商
bool OderUserIsDic = await _bfbfComAPIService.IsDictionary(order.userId);
foreach (var item in orderItems)
{
var orderDetails = new CoreCmsDistributionOrderDetails();
orderDetails.distributionOrderId = 0;
orderDetails.orderId = order.orderId;
orderDetails.orderId = order.orderId;
orderDetails.productPrice = item.price;
orderDetails.amount = 0;
orderDetails.goodId = item.goodsId;
orderDetails.name = item.name;
orderDetails.addon = item.addon;
orderDetails.productId = item.productId;
orderDetails.productNums = item.nums;
orderDetails.promotionAmount = item.promotionAmount;
orderDetails.imageUrl = item.imageUrl;
orderDetails.remark = "";
orderDetails.createTime = DateTime.Now;
var good = goods.Find(p => p.id == item.goodsId);
if (good == null)
{
distributionOrderDetails.Add(orderDetails);
continue;
}
var product = products.Find(p => p.id == item.productId);
if (product == null)
{
distributionOrderDetails.Add(orderDetails);
continue;
}
decimal mathMoney = 0;
if (good.productsDistributionType == (int)GlobalEnumVars.ProductsDistributionType.Global)
{
if (ommissionDto == null)
{
distributionOrderDetails.Add(orderDetails);
continue;
}
//获取实际当前支付金额,减去优惠的金额
//var itemAmount = item.amount - item.promotionAmount;
//目前的业务已经去除过优惠了,所以佣金不需要再减去优惠计算,会导致佣金折上折
var itemAmount = item.amount;
//如果去掉优惠需要负了,就为0
if (itemAmount < 0) itemAmount = 0;
mathMoney = level switch
{
//一级分销
1 when ommissionDto.commission_1 != null => ommissionDto.commission_1.type ==
(int)GlobalEnumVars
.DistributionCommissiontype
.COMMISSION_TYPE_FIXED
? ommissionDto.commission_1.discount
: Math.Round(ommissionDto.commission_1.discount * itemAmount / 100, 2),
//二级分销
2 when ommissionDto.commission_2 != null => ommissionDto.commission_2.type ==
(int)GlobalEnumVars
.DistributionCommissiontype
.COMMISSION_TYPE_FIXED
? ommissionDto.commission_2.discount
: Math.Round(ommissionDto.commission_2.discount * itemAmount / 100, 2),
//三级分销
3 when ommissionDto.commission_3 != null => ommissionDto.commission_3.type ==
(int)GlobalEnumVars
.DistributionCommissiontype
.COMMISSION_TYPE_FIXED
? ommissionDto.commission_3.discount
: Math.Round(ommissionDto.commission_3.discount * itemAmount / 100, 2),
_ => mathMoney
};
}
else if (good.productsDistributionType == (int)GlobalEnumVars.ProductsDistributionType.Detail)
{
var productsDistribution = productsDistributions.Find(p => p.productsId == item.productId);
if (productsDistribution == null)
{
continue;
}
//百分兵法基数按
switch (level)
{
case 1 :
if(OderUserIsDic)
//是经销商购买
mathMoney = item.productInfo.distributionCutMoney;
else
//非经销商购买
mathMoney= item.productInfo.cutMoney ;
break;
case 2 when productsDistribution.levelTwo > 0:
break;
case 3 when productsDistribution.levelThree>0:
break;
default:
break;
}
//原佣金计算方法
//mathMoney = level switch
//{
// 1 when productsDistribution.levelOne > 0 => Math.Round(
// productsDistribution.levelOne * item.nums, 2),
// 2 when productsDistribution.levelTwo > 0 => Math.Round(
// productsDistribution.levelTwo * item.nums, 2),
// 3 when productsDistribution.levelThree > 0 => Math.Round(
// productsDistribution.levelThree * item.nums, 2),
// _ => mathMoney
//};
}
amount += mathMoney;
orderDetails.amount = mathMoney;
distributionOrderDetails.Add(orderDetails);
}
if (amount > 0)
{
var iData = new CoreCmsDistributionOrder();
iData.userId = userId;
iData.buyUserId = order.userId;
iData.orderId = order.orderId;
iData.amount = amount;
iData.level = level;
iData.isSettlement = (int)GlobalEnumVars.DistributionOrderSettlementStatus.SettlementNo; //默认未结算
iData.isDelete = false;
//判断是否返利过,有历史记录直接更新
var commissOrder = await _dal.QueryByClauseAsync(p => p.userId == userId && p.orderId == order.orderId);
if (commissOrder != null)
{
commissOrder.updateTime = DateTime.Now;
commissOrder.userId = iData.userId;
commissOrder.buyUserId = iData.buyUserId;
commissOrder.orderId = iData.orderId;
commissOrder.amount = iData.amount;
commissOrder.level = iData.level;
commissOrder.isSettlement = iData.isSettlement;
commissOrder.isDelete = iData.isDelete;
await _dal.UpdateAsync(commissOrder);
}
else
{
iData.createTime = DateTime.Now;
iData.updateTime = DateTime.Now;
var id = await _dal.InsertAsync(iData);
if (id > 0 && distributionOrderDetails.Any())
{
distributionOrderDetails.ForEach(p =>
{
p.distributionOrderId = id;
});
await _distributionOrderDetailsServices.InsertAsync(distributionOrderDetails);
}
}
}
}
if (user.parentId > 0 && level < distributionLevel)
{
//返第二级
level++;
await AddOther(order, orderItems, goods, products, productsDistributions, level, user.parentId, distributionLevel);
}
}
}
#endregion
#region 订单结算处理事件
///
/// 订单结算处理事件
///
///
///
public async Task FinishOrder(string orderId)
{
var jm = new WebApiCallBack();
var order = await _orderServices.QueryByClauseAsync(p => p.orderId == orderId && p.status == (int)GlobalEnumVars.OrderStatus.Complete);
if (order == null)
{
jm.msg = "订单查询失败";
return jm;
}
//更新
var list = await _dal.QueryListByClauseAsync(p => p.orderId == orderId && p.isSettlement == (int)GlobalEnumVars.DistributionOrderSettlementStatus.SettlementNo);
if (list != null && list.Any())
{
//foreach (var item in list)
//{
// //钱挪到会员余额里面
// var result = await _balanceServices.Change(item.userId, (int)GlobalEnumVars.UserBalanceSourceTypes.Distribution,
// item.amount, item.orderId);
// if (!result.status)
// {
// }
//}
await foreach (var result in ChangeForEach(list))
{
if (!result.status)
{
//日常日志处理。
}
};
await _dal.UpdateAsync(p => new CoreCmsDistributionOrder()
{
isSettlement = (int)GlobalEnumVars.DistributionOrderSettlementStatus.SettlementYes,
updateTime = DateTime.Now
}, p => p.orderId == orderId && p.isSettlement == (int)GlobalEnumVars.DistributionOrderSettlementStatus.SettlementNo);
}
return jm;
}
//使用迭代器
private async IAsyncEnumerable ChangeForEach(List list)
{
foreach (var item in list)
{
//钱挪到会员余额里面
var result = await _balanceServices.Change(item.userId, (int)GlobalEnumVars.UserBalanceSourceTypes.Distribution,
item.amount, item.orderId);
yield return result;
}
}
#endregion
#region 作废订单
///
/// 作废订单
///
/// 订单编号
///
public async Task CancleOrderByOrderId(string orderId)
{
var jm = new WebApiCallBack();
var res = await _dal.UpdateAsync(p => new CoreCmsDistributionOrder() { isSettlement = (int)GlobalEnumVars.DistributionOrderSettlementStatus.SettlementCancel },
p => p.orderId == orderId && p.isSettlement == (int)GlobalEnumVars.DistributionOrderSettlementStatus.SettlementNo);
if (res == false)
{
jm.msg = "该未结算的订单不存在";
return jm;
}
jm.msg = "操作成功";
jm.status = true;
return jm;
}
#endregion
#region 获取下级推广订单数量
///
/// 获取下级推广订单数量
///
/// 父类序列
/// 1获取1级,其他为2级,0为全部
/// 显示当月
///
public async Task QueryChildOrderCountAsync(int parentId, int type = 1, bool thisMonth = false)
{
return await _dal.QueryChildOrderCountAsync(parentId, type, thisMonth);
}
#endregion
#region 获取下级推广订单金额
///
/// 获取下级推广订单金额
///
/// 父类序列
/// 1获取1级,其他为2级,0为全部
/// 显示当月
///
public async Task QueryChildOrderMoneySumAsync(int parentId, int type = 1, bool thisMonth = false)
{
return await _dal.QueryChildOrderMoneySumAsync(parentId, type, thisMonth);
}
#endregion
}
}