Files
YunTongJackYunTask/Reportapi/MyCode.Project.Services/BaoDianBLL/OldMemberPlanCalBLL.cs
2025-07-04 09:50:02 +08:00

234 lines
9.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
/// <summary>
/// 老客销售计划
/// </summary>
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来运算)
/// <summary>
/// 根据订单id来运算
/// </summary>
/// <param name="objSheetId"></param>
[TransactionCallHandler]
public void Run(object objSheetId)
{
//初始化
base.Init(objSheetId.ToString());
//预转销订单不处理
var checkResult = base.CheckPassed(PlanType.OldMemberSalesPlan);
if (!checkResult) { return; }
//先删掉可以保证该方法不断的被调用计算
_repository.Delete<BdOrderPlan>(p => p.OrderId == SheetId && p.PlanType == (int)PlanType.OldMemberSalesPlan);
//得到该订单中的商品明细
var sheetItems = _repository.Queryable<LxmSheetItem>().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(退)
/// <summary>
/// 如果是退款单
/// </summary>
private void CalRefundOrder(List<LxmSheetItem> 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<LxmSheetItem>().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<BdOrderPlan>()
.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<BdOrderPlan>();
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<BdOrderPlan>(insertOrderPlans);
}
#endregion
#region CalNormalOrder()
/// <summary>
/// 计算正常的订单
/// </summary>
/// <param name="listClerkPlan"></param>
/// <param name="listPackage"></param>
/// <param name="listSheetItem"></param>
private void CalNormalOrder(List<OldMemberPlanResp> listClerkPlan,
List<PackageListResp> listPackage,
List<LxmSheetItem> 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<BdOrderPlan>(orderPlan);
}
}
}
#endregion
#region IfMatchPlanProductOrService()
/// <summary>
/// 是否匹配计划中的商品,需要所有匹配才算
/// </summary>
/// <param name="orderSkuId"></param>
/// <param name="listPlanSkuId"></param>
/// <returns></returns>
private bool IfMatchPlanProductOrService(List<PackageListResp> listPackage, long packageId, List<LxmSheetItem> 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
}
}