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得到来源) /// /// 根据店铺id和会员id得到来源 /// /// /// /// 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().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(处理单个订单) /// /// 处理单个订单 /// /// public void HandleOrder(ChangeRecordResp record) { var strSheetId = record.SheetId.ToString(); if (record.Flag != 100) { //_repository.DeleteQueue(p => p.Id == strSheetId); //_repository.DeleteQueue(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(sheet); _repository.AddQueue(items); } #endregion #region ToPreLxmSheetItem(转换层流行美的订单明细) /// /// 转换层流行美的订单明细 /// /// /// private List 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(); 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(更新明细) /// /// 更新明细 /// /// 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订单主表的实体) /// /// 转换为MYSQL订单主表的实体 /// /// 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 } }