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
}
}