/*********************************************************************** * 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.Model.Entities; using CoreCms.Net.Model.ViewModels.Basics; using CoreCms.Net.Model.ViewModels.UI; using CoreCms.Net.Utility.Extensions; using CoreCms.Net.Utility.Helper; using Microsoft.Extensions.DependencyInjection; using SqlSugar; namespace CoreCms.Net.Services { /// /// 代理商订单记录表 接口实现 /// public class CoreCmsAgentOrderServices : BaseServices, ICoreCmsAgentOrderServices { private readonly ICoreCmsAgentGoodsServices _agentGoodsServices; private readonly ICoreCmsAgentProductsServices _agentProductsServices; private readonly ICoreCmsUserBalanceServices _balanceServices; private readonly ICoreCmsAgentOrderRepository _dal; private readonly ICoreCmsGoodsServices _goodsServices; private readonly ICoreCmsOrderItemServices _orderItemServices; private readonly ICoreCmsOrderServices _orderServices; private readonly ICoreCmsProductsServices _productsServices; private readonly ICoreCmsAgentOrderDetailsServices _agentOrderDetailsServices; private readonly IServiceProvider _serviceProvider; private readonly ICoreCmsSettingServices _settingServices; private readonly IUnitOfWork _unitOfWork; private readonly ICoreCmsUserServices _userServices; public CoreCmsAgentOrderServices(IUnitOfWork unitOfWork, ICoreCmsAgentOrderRepository dal, ICoreCmsUserServices userServices, ICoreCmsOrderItemServices orderItemServices, ICoreCmsProductsServices productsServices, ICoreCmsGoodsServices goodsServices, ICoreCmsAgentProductsServices agentProductsServices, ICoreCmsSettingServices settingServices, ICoreCmsAgentGoodsServices agentGoodsServices, IServiceProvider serviceProvider, ICoreCmsOrderServices orderServices, ICoreCmsUserBalanceServices balanceServices, ICoreCmsAgentOrderDetailsServices agentOrderDetailsServices) { _dal = dal; BaseDal = dal; _unitOfWork = unitOfWork; _userServices = userServices; _orderItemServices = orderItemServices; _productsServices = productsServices; _goodsServices = goodsServices; _agentProductsServices = agentProductsServices; _settingServices = settingServices; _agentGoodsServices = agentGoodsServices; _serviceProvider = serviceProvider; _orderServices = orderServices; _balanceServices = balanceServices; _agentOrderDetailsServices = agentOrderDetailsServices; } #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(); using var container = _serviceProvider.CreateScope(); var agentServices = container.ServiceProvider.GetService(); var allConfigs = await _settingServices.GetConfigDictionaries(); var isAllowProcurementService = CommonHelper .GetConfigDictionary(allConfigs, SystemSettingConstVars.IsAllowProcurementService).ObjectToInt(0); CoreCmsUser user = null; CoreCmsAgent agentModel = null; //判断是否支持代理代购,支持的话就直接判断当前订单用户是否是代理商,是的话传代理商数据 if (isAllowProcurementService == 1) { agentModel = await agentServices.QueryByClauseAsync(p => p.userId == order.userId && p.verifyStatus == (int)GlobalEnumVars.AgentVerifyStatus.VerifyYes); if (agentModel != null) user = await _userServices.QueryByClauseAsync(p => p.id == order.userId); } //如果当前用户不是代理,则找上级 if (user == null) { var userChild = await _userServices.QueryByClauseAsync(p => p.id == order.userId); if (userChild.parentId > 0) { agentModel = await agentServices.QueryByClauseAsync(p => p.userId == userChild.parentId && p.verifyStatus == (int)GlobalEnumVars.AgentVerifyStatus.VerifyYes); if (agentModel != null) user = await _userServices.QueryByClauseAsync(p => p.id == userChild.parentId); } } //查询获取几级返利 if (user != null) { //获取购物明细 var orderItems = 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 agentGoods = await _agentGoodsServices.QueryListByClauseAsync(p => goodIds.Contains(p.goodId) && p.isEnable); //获取货品关联的分销数据 var agentProducts = await _agentProductsServices.QueryListByClauseAsync(p => productIds.Contains(p.productId) && p.agentGradeId == agentModel.gradeId); if (agentGoods.Any() && agentProducts.Any()) await AddOther(order, orderItems, goods, products, agentGoods, agentProducts, agentModel, user); else jm.msg = "代理商商品池或货品池为空"; jm.status = true; } else { jm.status = false; } return jm; } #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.AgentOrderSettlementStatus.SettlementNo); if (list != null && list.Any()) { foreach (var item in list) { //钱挪到会员余额里面 var result = await _balanceServices.Change(item.userId, (int)GlobalEnumVars.UserBalanceSourceTypes.Agent, item.amount, item.orderId); if (!result.status) { } } await _dal.UpdateAsync( p => new CoreCmsAgentOrder { isSettlement = (int)GlobalEnumVars.AgentOrderSettlementStatus.SettlementYes, updateTime = DateTime.Now }, p => p.orderId == orderId && p.isSettlement == (int)GlobalEnumVars.AgentOrderSettlementStatus.SettlementNo); } return jm; } #endregion #region 作废订单 /// /// 作废订单 /// /// 订单编号 /// public async Task CancelOrderByOrderId(string orderId) { var jm = new WebApiCallBack(); var res = await _dal.UpdateAsync( p => new CoreCmsAgentOrder { isSettlement = (int)GlobalEnumVars.AgentOrderSettlementStatus.SettlementCancel }, p => p.orderId == orderId && p.isSettlement == (int)GlobalEnumVars.AgentOrderSettlementStatus.SettlementNo); if (res == false) { jm.msg = "该未结算的订单不存在"; return jm; } jm.msg = "操作成功"; jm.status = true; return jm; } #endregion #region 循环插入上级 /// /// 循环插入上级 /// /// 订单信息 /// /// /// 订单货品 /// 商品池货品价格体系数据 /// 商品池数据 /// 代理商数据 /// 用户数据 /// private async Task AddOther(CoreCmsOrder order, List orderItems, List goods, List products, List agentGoods, List agentProducts, CoreCmsAgent agent, CoreCmsUser user) { //直返本级 decimal amount = 0; var agentOrderDetails = new List(); foreach (var item in orderItems) { var orderDetails = new CoreCmsAgentOrderDetails(); orderDetails.agentOrderId = 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) { agentOrderDetails.Add(orderDetails); continue; }; //判断是否存在货品类 var product = products.Find(p => p.id == item.productId); if (product == null) { agentOrderDetails.Add(orderDetails); continue; } //判断代理商代理池是否包含此商品数据 var agentGood = agentGoods.Find(p => p.goodId == item.goodsId); if (agentGood == null) { agentOrderDetails.Add(orderDetails); continue; } //判断代理商代理池是否包含此货品数据 var agentProduct = agentProducts.Find(p => p.productId == item.productId); if (agentProduct == null) { agentOrderDetails.Add(orderDetails); continue; } //获取实际当前单个商品应获得利润 var price = item.price - agentProduct.agentGradePrice; //如果销售价减去代理商价格负了,就不计算了。 if (price < 0) { agentOrderDetails.Add(orderDetails); continue; } //如果利润减去优惠负了,就不计算了。 var mathMoney = Math.Round(price * item.nums - item.promotionAmount, 2); if (mathMoney < 0) mathMoney = 0; //单个商品利润*数量,再减去优惠金额 amount += mathMoney; orderDetails.amount = mathMoney; agentOrderDetails.Add(orderDetails); } if (amount > 0) { var iData = new CoreCmsAgentOrder(); iData.userId = user.id; iData.buyUserId = order.userId; iData.orderId = order.orderId; iData.amount = amount; iData.isSettlement = (int)GlobalEnumVars.AgentOrderSettlementStatus.SettlementNo; //默认未结算 iData.isDelete = false; //判断是否返利过,有历史记录直接更新 var agentOrder = await _dal.QueryByClauseAsync(p => p.userId == user.id && p.orderId == order.orderId); if (agentOrder != null) { agentOrder.updateTime = DateTime.Now; agentOrder.userId = iData.userId; agentOrder.buyUserId = iData.buyUserId; agentOrder.orderId = iData.orderId; agentOrder.amount = iData.amount; agentOrder.isSettlement = iData.isSettlement; agentOrder.isDelete = iData.isDelete; await _dal.UpdateAsync(agentOrder); } else { iData.createTime = DateTime.Now; iData.updateTime = DateTime.Now; var id = await _dal.InsertAsync(iData); if (id > 0 && agentOrderDetails.Any()) { agentOrderDetails.ForEach(p => { p.agentOrderId = id; }); await _agentOrderDetailsServices.InsertAsync(agentOrderDetails); } } } } #endregion } }