234 lines
9.6 KiB
C#
234 lines
9.6 KiB
C#
|
|
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
|
|||
|
|
}
|
|||
|
|
}
|