# 2022-02-11

### 1.3.5 开源社区版(会员专业版同步修改):
无
### 0.1.6 会员专业版:
【新增】后台【平台设置-订单管理】增加【佣金计算通道】功能,分为【仅代理】【仅分销】【先代理后分销】【先分销后代理】四种自选模式。
【新增】增加【CoreCmsAgentOrderDetails】表,实现代理佣金订单详情列表功能,精确到具体商品明细。
【新增】增加【CoreCmsDistributionOrderDetails】表,实现三级佣金订单详情列表功能,精确到具体商品明细。
【修复】修复代理商商铺开启按钮错用三级分销商店铺开关功能,增加代理商商铺开启开关。
【修复】修复代理商佣金明细日期选择范围错乱问题。
【优化】uniapp自带progress进度条更换为uview2.x进度条。
【优化】敏感词过滤组件启用废弃的【WordsMatch】方法,启用【StringSearch】方法替代。
This commit is contained in:
JianWeie
2022-02-11 05:28:04 +08:00
parent 05df55d7ec
commit 8f64209d27
45 changed files with 16751 additions and 607 deletions

View File

@@ -0,0 +1,116 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2022/2/10 0:39:11
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
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.Model.Entities;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using SqlSugar;
namespace CoreCms.Net.Services
{
/// <summary>
/// 分销佣金明细 接口实现
/// </summary>
public class CoreCmsDistributionOrderDetailsServices : BaseServices<CoreCmsDistributionOrderDetails>, ICoreCmsDistributionOrderDetailsServices
{
private readonly ICoreCmsDistributionOrderDetailsRepository _dal;
private readonly IUnitOfWork _unitOfWork;
public CoreCmsDistributionOrderDetailsServices(IUnitOfWork unitOfWork, ICoreCmsDistributionOrderDetailsRepository dal)
{
this._dal = dal;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
}
#region ==========================================================
/// <summary>
/// 重写异步插入方法
/// </summary>
/// <param name="entity">实体数据</param>
/// <returns></returns>
public new async Task<AdminUiCallBack> InsertAsync(CoreCmsDistributionOrderDetails entity)
{
return await _dal.InsertAsync(entity);
}
/// <summary>
/// 重写异步更新方法方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public new async Task<AdminUiCallBack> UpdateAsync(CoreCmsDistributionOrderDetails entity)
{
return await _dal.UpdateAsync(entity);
}
/// <summary>
/// 重写异步更新方法方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public new async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsDistributionOrderDetails> entity)
{
return await _dal.UpdateAsync(entity);
}
/// <summary>
/// 重写删除指定ID的数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public new async Task<AdminUiCallBack> DeleteByIdAsync(object id)
{
return await _dal.DeleteByIdAsync(id);
}
/// <summary>
/// 重写删除指定ID集合的数据(批量删除)
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
public new async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
{
return await _dal.DeleteByIdsAsync(ids);
}
#endregion
#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 new async Task<IPageList<CoreCmsDistributionOrderDetails>> QueryPageAsync(Expression<Func<CoreCmsDistributionOrderDetails, bool>> predicate,
Expression<Func<CoreCmsDistributionOrderDetails, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false)
{
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
}
#endregion
}
}

View File

@@ -20,8 +20,9 @@ using CoreCms.Net.IServices;
using CoreCms.Net.Loging;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Model.ViewModels.DTO;
using CoreCms.Net.Model.ViewModels.DTO.Distribution;
using CoreCms.Net.Model.ViewModels.UI;
using SqlSugar;
@@ -41,9 +42,11 @@ namespace CoreCms.Net.Services
private readonly ICoreCmsProductsServices _productsServices;
private readonly ICoreCmsUserBalanceServices _balanceServices;
private readonly ICoreCmsGoodsServices _goodsServices;
private readonly ICoreCmsDistributionOrderDetailsServices _distributionOrderDetailsServices;
private readonly IUnitOfWork _unitOfWork;
public CoreCmsDistributionOrderServices(IUnitOfWork unitOfWork, ICoreCmsDistributionOrderRepository dal, ICoreCmsDistributionServices distributionServices, ICoreCmsUserBalanceServices balanceServices, ICoreCmsOrderServices orderServices, ICoreCmsUserServices userServices, ICoreCmsOrderItemServices orderItemServices, ICoreCmsProductsDistributionServices productsDistributionServices, ICoreCmsProductsServices productsServices, ICoreCmsGoodsServices goodsServices)
public CoreCmsDistributionOrderServices(IUnitOfWork unitOfWork, ICoreCmsDistributionOrderRepository dal, ICoreCmsDistributionServices distributionServices, ICoreCmsUserBalanceServices balanceServices, ICoreCmsOrderServices orderServices, ICoreCmsUserServices userServices, ICoreCmsOrderItemServices orderItemServices, ICoreCmsProductsDistributionServices productsDistributionServices, ICoreCmsProductsServices productsServices, ICoreCmsGoodsServices goodsServices, ICoreCmsDistributionOrderDetailsServices distributionOrderDetailsServices)
{
this._dal = dal;
_distributionServices = distributionServices;
@@ -54,63 +57,11 @@ namespace CoreCms.Net.Services
_productsDistributionServices = productsDistributionServices;
_productsServices = productsServices;
_goodsServices = goodsServices;
_distributionOrderDetailsServices = distributionOrderDetailsServices;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
}
#region ==========================================================
/// <summary>
/// 重写异步插入方法
/// </summary>
/// <param name="entity">实体数据</param>
/// <returns></returns>
public new async Task<AdminUiCallBack> InsertAsync(CoreCmsDistributionOrder entity)
{
return await _dal.InsertAsync(entity);
}
/// <summary>
/// 重写异步更新方法方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public new async Task<AdminUiCallBack> UpdateAsync(CoreCmsDistributionOrder entity)
{
return await _dal.UpdateAsync(entity);
}
/// <summary>
/// 重写异步更新方法方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public new async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsDistributionOrder> entity)
{
return await _dal.UpdateAsync(entity);
}
/// <summary>
/// 重写删除指定ID的数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public new async Task<AdminUiCallBack> DeleteByIdAsync(object id)
{
return await _dal.DeleteByIdAsync(id);
}
/// <summary>
/// 重写删除指定ID集合的数据(批量删除)
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
public new async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
{
return await _dal.DeleteByIdsAsync(ids);
}
#endregion
#region
/// <summary>
@@ -190,74 +141,103 @@ namespace CoreCms.Net.Services
var ommissionDto = commission.data as DistributionDto;
//直返本级
decimal amount = 0;
var distributionOrderDetails = new List<CoreCmsDistributionOrderDetails>();
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) continue;
if (good == null)
{
distributionOrderDetails.Add(orderDetails);
continue;
}
var product = products.Find(p => p.id == item.productId);
if (product == null) continue;
if (product == null)
{
distributionOrderDetails.Add(orderDetails);
continue;
}
decimal mathMoney = 0;
if (good.productsDistributionType == (int)GlobalEnumVars.ProductsDistributionType.Global)
{
if (ommissionDto == null) continue;
if (ommissionDto == null)
{
distributionOrderDetails.Add(orderDetails);
continue;
}
//获取实际当前支付金额,减去优惠的金额
var itemAmount = item.amount - item.promotionAmount;
//如果去掉优惠需要负了就为0
if (itemAmount < 0) itemAmount = 0;
//一级分销
if (level == 1 && ommissionDto.commission_1 != null)
mathMoney = level switch
{
if (ommissionDto.commission_1.type == (int)GlobalEnumVars.DistributionCommissiontype.COMMISSION_TYPE_FIXED)
{
amount += ommissionDto.commission_1.discount;
}
else
{
amount += Math.Round(ommissionDto.commission_1.discount * itemAmount / 100, 2);
}
}
//二级分销
else if (level == 2 && ommissionDto.commission_2 != null)
{
if (ommissionDto.commission_2.type == (int)GlobalEnumVars.DistributionCommissiontype.COMMISSION_TYPE_FIXED)
{
amount += ommissionDto.commission_2.discount;
}
else
{
amount += Math.Round(ommissionDto.commission_2.discount * itemAmount / 100, 2);
}
}
//三级分销
else if (level == 3 && ommissionDto.commission_3 != null)
{
if (ommissionDto.commission_3.type == (int)GlobalEnumVars.DistributionCommissiontype.COMMISSION_TYPE_FIXED)
{
amount += ommissionDto.commission_3.discount;
}
else
{
amount += Math.Round(ommissionDto.commission_3.discount * itemAmount / 100, 2);
}
}
//一级分销
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;
if (productsDistribution == null)
{
continue;
}
if (level == 1 && productsDistribution.levelOne > 0)
mathMoney = level switch
{
amount += Math.Round(productsDistribution.levelOne * item.nums, 2);
}
else if (level == 2 && productsDistribution.levelTwo > 0)
{
amount += Math.Round(productsDistribution.levelTwo * item.nums, 2);
}
else if (level == 3 && productsDistribution.levelThree > 0)
{
amount += Math.Round(productsDistribution.levelThree * item.nums, 2);
}
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)
@@ -288,7 +268,16 @@ namespace CoreCms.Net.Services
{
iData.createTime = DateTime.Now;
iData.updateTime = DateTime.Now;
await _dal.InsertAsync(iData);
var id = await _dal.InsertAsync(iData);
if (id > 0 && distributionOrderDetails.Any())
{
distributionOrderDetails.ForEach(p =>
{
p.distributionOrderId = id;
});
await _distributionOrderDetailsServices.InsertAsync(distributionOrderDetails);
}
}
}
@@ -324,16 +313,25 @@ namespace CoreCms.Net.Services
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)
//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))
{
//钱挪到会员余额里面
var result = await _balanceServices.Change(item.userId, (int)GlobalEnumVars.UserBalanceSourceTypes.Distribution,
item.amount, item.orderId);
if (!result.status)
{
//日常日志处理。
}
}
};
await _dal.UpdateAsync(p => new CoreCmsDistributionOrder()
{
isSettlement = (int)GlobalEnumVars.DistributionOrderSettlementStatus.SettlementYes,
@@ -343,6 +341,21 @@ namespace CoreCms.Net.Services
return jm;
}
//使用迭代器
private async IAsyncEnumerable<WebApiCallBack> ChangeForEach(List<CoreCmsDistributionOrder> 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