using MyCode.Project.Domain.Message.Response.BaoDian; using MyCode.Project.Domain.Model; using MyCode.Project.Domain.Repositories; using MyCode.Project.Infrastructure.Common; using MyCode.Project.Infrastructure.Enumeration; using MyCode.Project.Infrastructure.Extensions; using MyCode.Project.Repositories; using MyCode.Project.Repositories.Common; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MyCode.Project.Services.BLL { /// /// 老客销售计划 /// public class OldMemberPlanCalBLL:CommonPlanCalBLL { #region 初始化 private readonly ILxmSheetItemRepository _lxmSheetItemRepository; private readonly ILxmProductSalesScheduleRepository _lxmProductSalesScheduleRepository; private readonly IBdClerkOldMemberSalesPlanRepository _bdClerkOldMemberSalesPlanRepository; public OldMemberPlanCalBLL(IRepository repository, ILxmSheetItemRepository lxmSheetItemRepository, ILxmProductSalesScheduleRepository lxmProductSalesScheduleRepository, IBdClerkOldMemberSalesPlanRepository bdClerkOldMemberSalesPlanRepository ) :base(repository) { _repository = repository; _lxmSheetItemRepository = lxmSheetItemRepository; _lxmProductSalesScheduleRepository = lxmProductSalesScheduleRepository; _bdClerkOldMemberSalesPlanRepository = bdClerkOldMemberSalesPlanRepository; } #endregion #region Run(根据订单id来运算) /// /// 根据订单id来运算 /// /// [TransactionCallHandler] public void Run(object objSheetId) { //初始化 base.Init(objSheetId.ToString()); //预转销订单不处理 var checkResult = base.CheckPassed(PlanType.OldMemberSalesPlan); if (!checkResult) { return; } //先删掉可以保证该方法不断的被调用计算 _repository.Delete(p => p.OrderId == SheetId && p.PlanType == (int)PlanType.OldMemberSalesPlan); //得到该订单中的商品明细 var sheetItems = _repository.Queryable().Where(p => p.SalesSheetId == SheetId).WithCache(100).ToList(); //在时间段范围内邀请人来参加活动,里面有某个商品符合就算 if (Sheet.Direct == 1) { //查看当月的该用户老客套餐计划 var oldMemberPlans = _bdClerkOldMemberSalesPlanRepository.GetOldMemberPlanList(Sheet.ShopId, Sheet.MemberId, Sheet.OrderClerkId, VersionTime, Sheet.CreateTime.Value); if (oldMemberPlans == null || oldMemberPlans.Count == 0) { LogHelper.Info($"[老客运算]订单={SheetId}没有匹配到任何计划"); return; } var planSkus = _lxmProductSalesScheduleRepository.GetPackageProductList(oldMemberPlans.Select(p => p.PackageId).ToList(), 1); CalNormalOrder(oldMemberPlans, planSkus, sheetItems); } else { CalRefundOrder(sheetItems); } } #endregion #region CalRefundOrder(如果是退款单) /// /// 如果是退款单 /// private void CalRefundOrder(List listNorMalSheetItem) { if (Sheet.SourceOrderId == null) { LogHelper.Info($"[老客运算]退款单={Sheet.Id}找不到原始订单"); return; } //判断原始销售单是否当月,如果不是当月,则跳出 var sourceOrderId = Sheet.SourceOrderId; //判断原始销售单是否当月,如果不是当月,则跳出 var sourceOrder = GetSourceSimpleOrder(Sheet.SourceOrderId); if (sourceOrder.OrderPreorderId != null) { sourceOrderId = sourceOrder.OrderPreorderId; } var sheetOrderMonthFirstDay = Sheet.CreateTime.Value.GetFirstDayOfMonth(); if (sourceOrder.CreateTime.Value.GetFirstDayOfMonth() != sheetOrderMonthFirstDay) { LogHelper.Info($"[老客运算]退款单={Sheet.Id}的原始订单={Sheet.SourceOrderId}非当月,老客计划不运算"); return; } var sourceItemQty = _repository.Queryable().Where(p => p.SalesSheetId == sourceOrderId).Select(p => SqlFunc.AggregateSum(p.Qty)).First(); var sheetTime = Sheet.CreateTime.Value; //判断当前是否是全退,如果是全退,则当月的需要写一条反的数据,根据退的商品的数量; //先得到当月1号到今天该订单退的情况 //var refundQty = _lxmSheetItemRepository.GetRefundQty(Sheet.SourceOrderId, sheetOrderMonthFirstDay, Sheet.CreateTime.Value); var refundQty = _lxmSheetItemRepository.GetRefundQty(sourceOrderId, sheetOrderMonthFirstDay, Sheet.CreateTime.Value.AddSeconds(1)); //只是部分退而已 if (sourceItemQty != refundQty) { LogHelper.Info($"[老客运算]退款单={Sheet.Id}只是部分退,不用写反向数据"); return; } //全退了,写反向的数据 var orderPlans = _repository.Queryable() .Where(p => p.OrderId == Sheet.SourceOrderId && p.OrderTime >= sheetOrderMonthFirstDay && p.OrderTime <= Sheet.CreateTime.Value && p.PlanType == (int)PlanType.OldMemberSalesPlan) .ToList(); if (orderPlans == null || orderPlans.Count == 0) { return; } var insertOrderPlans = new List(); foreach (var plan in orderPlans) { var insertOrderPlan = new BdOrderPlan() { Id = IdHelper.GetNewId(), OrderId = SheetId, OrderTime = Sheet.CreateTime.Value, PackageId = plan.PackageId, PackageName = plan.PackageName, PlanId = plan.PlanId, PlanType = plan.PlanType, Qty = -plan.Qty, UpdateTime = DateTime.Now, SourceOrderId = sourceOrderId, SourcePackageId = plan.SourcePackageId, Info = $"原始订单id={Sheet.SourceOrderId}全退导致[老客运算]产生反向流水" }; insertOrderPlans.Add(insertOrderPlan); } _repository.Add(insertOrderPlans); } #endregion #region CalNormalOrder(计算正常的订单) /// /// 计算正常的订单 /// /// /// /// private void CalNormalOrder(List listClerkPlan, List listPackage, List listSheetItem) { //只要满足一个就符合计划,这里当时正向的,就是不是退款的情况的 foreach (var clerkPlan in listClerkPlan) { //匹配到的计划配置里面的sku var IfMatchPlan = IfMatchPlanProductOrService(listPackage, clerkPlan.PackageId, listSheetItem); var orderPlan = new BdOrderPlan() { Id = IdHelper.GetNewId(), OrderId = Sheet.Id, OrderTime = Sheet.CreateTime.Value, PackageId = clerkPlan.PackageId, PackageName = clerkPlan.PackageName, PlanId = clerkPlan.PlanId, PlanType = (int)PlanType.OldMemberSalesPlan, Qty = 1, UpdateTime = DateTime.Now, SourcePackageId = clerkPlan.SourcePackageId }; //看看订单明细里面是不是有这个商品 if (IfMatchPlan) { orderPlan.Info = Info; _repository.Add(orderPlan); } } } #endregion #region IfMatchPlanProductOrService(是否匹配计划中的商品,需要所有匹配才算) /// /// 是否匹配计划中的商品,需要所有匹配才算 /// /// /// /// private bool IfMatchPlanProductOrService(List listPackage, long packageId, List listSheetItem) { //匹配到的计划配置里面的sku var matchPlanSkus = listPackage.Where(p => p.Id == packageId).ToList(); foreach (var planSku in matchPlanSkus) { if (!listSheetItem.Exists(p => p.ItemId.ToLower() == planSku.ProductOrServiceId.ToLower() && p.Qty >= planSku.Qty)) { Info = $"[老客运算]sheetid={SheetId},{planSku.ProductOrServiceName},id={planSku.ProductOrServiceId}在订单明细中不存在或者数量小于套餐的最小数量"; return false; } } Info = "符合[老客计划],所有商品都需要在套餐中存在,且数量要对上"; return true; } #endregion } }