283 lines
10 KiB
C#
283 lines
10 KiB
C#
using MyCode.Project.Domain.Message.Response.Lxm;
|
||
using MyCode.Project.Domain.Message.Response.LxmZHMDReport;
|
||
using MyCode.Project.Domain.Model;
|
||
using MyCode.Project.Domain.Repositories;
|
||
using MyCode.Project.Domain.ZHMDModel;
|
||
using MyCode.Project.Infrastructure.Enumeration;
|
||
using MyCode.Project.Infrastructure.Exceptions;
|
||
using MyCode.Project.Repositories.Common;
|
||
using MyCode.Project.Repositories.Lxm;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
|
||
namespace MyCode.Project.Services.BLL
|
||
{
|
||
public class OrderBLL
|
||
{
|
||
private readonly LxmInfraRepository _lxmInfraRepository;
|
||
private readonly LxmRepository _lxmRepository;
|
||
private readonly IRepository _repository;
|
||
private readonly GoodsBLL _goodsBLL;
|
||
private readonly ServiceBLL _serviceBLL;
|
||
private readonly CustomPackageBLL _customPackageBLL;
|
||
private readonly CardBLL _cardBLL;
|
||
private readonly ServicePackageBLL _servicePackageBLL;
|
||
|
||
public OrderBLL(LxmInfraRepository lxmInfraRepository,
|
||
IRepository repository,
|
||
GoodsBLL goodsBLL,
|
||
LxmRepository lxmRepository,
|
||
ServiceBLL serviceBLL,
|
||
CustomPackageBLL customPackageBLL,
|
||
CardBLL cardBLL,
|
||
ServicePackageBLL servicePackageBLL)
|
||
{
|
||
_lxmInfraRepository = lxmInfraRepository;
|
||
_repository = repository;
|
||
_goodsBLL = goodsBLL;
|
||
_serviceBLL = serviceBLL;
|
||
_lxmRepository = lxmRepository;
|
||
_customPackageBLL = customPackageBLL;
|
||
_cardBLL = cardBLL;
|
||
_servicePackageBLL = servicePackageBLL;
|
||
}
|
||
|
||
|
||
#region GetAddFromType(根据店铺id和会员id得到来源)
|
||
/// <summary>
|
||
/// 根据店铺id和会员id得到来源
|
||
/// </summary>
|
||
/// <param name="shopId"></param>
|
||
/// <param name="memberId"></param>
|
||
/// <returns></returns>
|
||
public int GetAddFromType(string strShopId, string strMemberId)
|
||
{
|
||
if (string.IsNullOrWhiteSpace(strMemberId)) { return (int)OrderFromType.Other; }
|
||
|
||
if (string.IsNullOrWhiteSpace(strShopId)) { throw new BaseException("GetAddFromType方法中strShopId不能为空"); }
|
||
|
||
var guidShopId = Guid.Parse(strShopId);
|
||
var guidMemberId = Guid.Parse(strMemberId);
|
||
|
||
var memberConsultant = _lxmInfraRepository.Queryable<BasMemberConsultant>().Where(p => p.ShopID == guidShopId && p.MemberID == guidMemberId).Select(p => new { p.AddFromType }).First();
|
||
|
||
if (memberConsultant == null || memberConsultant.AddFromType == null) { return (int)OrderFromType.Other; }
|
||
|
||
return (int)memberConsultant.AddFromType;
|
||
}
|
||
#endregion
|
||
|
||
#region HandleOrder(处理单个订单)
|
||
/// <summary>
|
||
/// 处理单个订单
|
||
/// </summary>
|
||
/// <param name="id"></param>
|
||
public void HandleOrder(ChangeRecordResp record)
|
||
{
|
||
var strSheetId = record.SheetId.ToString();
|
||
|
||
if (record.Flag != 100)
|
||
{
|
||
//_repository.DeleteQueue<LxmSheet>(p => p.Id == strSheetId);
|
||
//_repository.DeleteQueue<LxmSheetItem>(p => p.SalesSheetId == strSheetId);
|
||
return;
|
||
}
|
||
|
||
|
||
var sheet = ToLxmSheet(record);
|
||
|
||
//补充单号
|
||
var mssqlSheet = _lxmInfraRepository.GetSheet(record.SheetId);
|
||
|
||
if (mssqlSheet == null) { throw new BaseException($"预售单sheetid={record.SheetId}在BusPresalesSheet中找不到数据"); }
|
||
|
||
sheet.Sheet = mssqlSheet.Sheet;
|
||
|
||
var items = ToLxmSheetItem(record.SheetId,mssqlSheet);
|
||
|
||
_repository.AddQueue<LxmSheet>(sheet);
|
||
_repository.AddQueue<LxmSheetItem>(items);
|
||
|
||
}
|
||
#endregion
|
||
|
||
#region ToPreLxmSheetItem(转换层流行美的订单明细)
|
||
/// <summary>
|
||
/// 转换层流行美的订单明细
|
||
/// </summary>
|
||
/// <param name="sheetId"></param>
|
||
/// <returns></returns>
|
||
private List<LxmSheetItem> ToLxmSheetItem(Guid sheetId,LxmSheetResp sheet)
|
||
{
|
||
var items = _lxmInfraRepository.GetSheetItems(sheetId);
|
||
|
||
if (items == null || items.Count == 0) { throw new BaseException($"预售单SheetId={sheetId}找不到明细"); }
|
||
|
||
var returnList = new List<LxmSheetItem>();
|
||
|
||
foreach (var item in items)
|
||
{
|
||
var returnItem = new LxmSheetItem()
|
||
{
|
||
Id = item.Id.ToString(),
|
||
NoBalanceUnitPrice = Math.Abs(item.NoBalanceUnitPrice),
|
||
NoBalanceAmount = Math.Abs(item.NoBalanceUnitPrice) * Math.Abs(item.Qty),
|
||
Qty = Math.Abs(item.Qty),
|
||
SalesSheetId = sheetId.ToString(),
|
||
Name = item.Name,
|
||
ItemId = item.ItemId.ToString(),
|
||
HasChildNode = 0,
|
||
//这个要转成实际的,比如套餐的话
|
||
ItemType = item.ItemType,
|
||
InBlanceUnitPrice = Math.Abs(item.InBlanceUnitPrice),
|
||
NoBalancePayUnitPrice = Math.Abs(item.NoBalanceUnitPrice)
|
||
};
|
||
|
||
returnItem.InBlanceAmount = returnItem.InBlanceUnitPrice * returnItem.Qty;
|
||
|
||
//如果有预售单的id,则说明是预转销订单,这种订单实付支付为0,因为在预售单的时候就已经支付了
|
||
if (sheet.PreSalesSheetId != null)
|
||
{
|
||
returnItem.NoBalancePayUnitPrice = 0;
|
||
returnItem.NoBalancePayAmount = 0;
|
||
}
|
||
else
|
||
{
|
||
returnItem.NoBalancePayAmount = returnItem.NoBalancePayUnitPrice * returnItem.Qty;
|
||
}
|
||
|
||
if (item.Qty < 0)
|
||
{
|
||
returnItem.Direct = -1;
|
||
}
|
||
else
|
||
{
|
||
returnItem.Direct = 1;
|
||
}
|
||
|
||
UpdateOrderItem(returnItem);
|
||
|
||
returnList.Add(returnItem);
|
||
}
|
||
|
||
return returnList;
|
||
}
|
||
#endregion
|
||
|
||
#region UpdateOrderItem(更新明细)
|
||
/// <summary>
|
||
/// 更新明细
|
||
/// </summary>
|
||
/// <param name="item"></param>
|
||
private void UpdateOrderItem(LxmSheetItem item)
|
||
{
|
||
var gItemId = Guid.Parse(item.ItemId);
|
||
|
||
//如果是商品,则拿到商品名称和顶级分类
|
||
if (item.ItemType == (int)OrderItemType.Goods)
|
||
{
|
||
var goodsInfo = _goodsBLL.GetCacheLxmSimpleGoodsResp(gItemId);
|
||
item.Name = goodsInfo.Name;
|
||
item.TopCategoryId = goodsInfo.TopCategoryId.ToString();
|
||
}
|
||
else if (item.ItemType == (int)OrderItemType.Service)
|
||
{
|
||
var service = _serviceBLL.GetCacheLxmServiceResp(gItemId);
|
||
item.Name = service.Name;
|
||
}
|
||
else if (item.ItemType == (int)OrderItemType.DiyPackage)
|
||
{
|
||
var diyPackage = _customPackageBLL.GetCacheLxmCustomPackageResp(gItemId);
|
||
item.Name = diyPackage.Name;
|
||
|
||
//这个版本的话先不处理,下个版本需要直接处理成40或者41,并且把明细拆分出来
|
||
}
|
||
else if (item.ItemType == (int)OrderItemType.CardCoupon)
|
||
{
|
||
var card = _cardBLL.GetCacheLxmCardResp(gItemId);
|
||
item.Name = card.Name;
|
||
}
|
||
else if (item.ItemType == (int)OrderItemType.Package)
|
||
{
|
||
var servicePackage = _servicePackageBLL.GetCacheLxmServicePackage(gItemId);
|
||
item.Name = servicePackage.Name;
|
||
}
|
||
else
|
||
{
|
||
throw new BaseException($"无法找到对应的数据,itemType={item.ItemType},sheetid={gItemId}");
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
#region ToLxmSheet(转换为MYSQL订单主表的实体)
|
||
/// <summary>
|
||
/// 转换为MYSQL订单主表的实体
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
private LxmSheet ToLxmSheet(ChangeRecordResp record)
|
||
{
|
||
var sheet = new LxmSheet();
|
||
|
||
if (record.TotalAmount < 0)
|
||
{
|
||
sheet.Direct = -1;
|
||
}
|
||
else
|
||
{
|
||
sheet.Direct = 1;
|
||
}
|
||
|
||
sheet.Id = record.SheetId.ToString();
|
||
sheet.ShopId = record.ShopId.ToString();
|
||
sheet.Balance = Math.Abs(record.Balance);
|
||
sheet.CreateTime = record.CreateTime;
|
||
sheet.CustomerId = record.CustomerId?.ToString();
|
||
sheet.CustomerName = record.CustomerName;
|
||
|
||
if (Math.Abs(record.YuShouAmount) > 0)
|
||
{
|
||
sheet.TotalAmount = Math.Abs(record.YuShouAmount);
|
||
sheet.NoBalancePayAmount = 0;
|
||
|
||
//预转销订单
|
||
sheet.IsPorderToSorder = 1;
|
||
}
|
||
else
|
||
{
|
||
sheet.TotalAmount = Math.Abs(record.TotalAmount);
|
||
sheet.NoBalancePayAmount = Math.Abs(sheet.TotalAmount.Value - sheet.Balance.Value);
|
||
}
|
||
|
||
//add by florent 2023-10-30
|
||
//首单
|
||
sheet.IsFirstOrder = record.IsFirstOrder;
|
||
sheet.IsNewMemberOrder = record.IsNewMemberOrder;
|
||
|
||
if (record.MemberId != null)
|
||
{
|
||
sheet.MemberId = record.MemberId.ToString();
|
||
sheet.MemberName = record.MemberName;
|
||
sheet.MemberMobile = record.MemberMobile;
|
||
}
|
||
|
||
if (record.ClerkId != null)
|
||
{
|
||
sheet.OrderClerkId = record.ClerkId.ToString();
|
||
sheet.OrderClerkName = record.ClerkName;
|
||
sheet.OrderClerkMobile = record.ClerkMobile;
|
||
}
|
||
if (record.PlatformSource != null) { sheet.PlatformSource = record.PlatformSource; }
|
||
if (record.IsRepurchase != null) { sheet.IsRepurchase = record.IsRepurchase; }
|
||
sheet.Type = (int)LxmRecordType.SalesSheet;
|
||
sheet.UpdateTime = DateTime.Now;
|
||
sheet.EditTime = record.EditTime;
|
||
|
||
return sheet;
|
||
}
|
||
#endregion
|
||
}
|
||
}
|