using MyCode.Project.Domain.Message.Request.KingDee; using MyCode.Project.Domain.Message.Request.KingDee.SaveModel; using MyCode.Project.Domain.Message.Request.WMS; using MyCode.Project.Domain.Message.Response.JackYun; using MyCode.Project.Domain.Model; using MyCode.Project.Domain.Repositories; using MyCode.Project.Infrastructure.Common; using MyCode.Project.Infrastructure.Exceptions; using MyCode.Project.Infrastructure.JackYun; using MyCode.Project.OutSideService; using MyCode.Project.Repositories; using MyCode.Project.Repositories.Common; using MyCode.Project.Services.IServices; using RestSharp; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MyCode.Project.Services.Implementation { public class OrderPushService : IOrderPushService { private IJackYunService _jackYunService; private IJackOrdersRepository _jackOrdersRepository; private IJackOrdersItemRepository _jackOrdersItemRepository; private IPushKingDeeOrderRepository _pushKingDeeOrderRepository; private IPushKingDeeOrderItemRepository _pushKingDeeOrderItemRepository; private IYTKJTShopParameterRepository _yTKJTShopParameterRepository; private IKingDeeService _kingDeeService; public OrderPushService(IJackOrdersRepository jackOrdersRepository , IJackOrdersItemRepository jackOrdersItemRepository , IPushKingDeeOrderRepository pushKingDeeOrderRepository , IPushKingDeeOrderItemRepository pushKingDeeOrderItemRepository , IYTKJTShopParameterRepository yTKJTShopParameterRepository , IJackYunService jackYunService , IKingDeeService kingDeeService) { _yTKJTShopParameterRepository = yTKJTShopParameterRepository; _pushKingDeeOrderRepository = pushKingDeeOrderRepository; _pushKingDeeOrderItemRepository = pushKingDeeOrderItemRepository; _jackOrdersRepository = jackOrdersRepository; _jackOrdersItemRepository = jackOrdersItemRepository; _jackYunService = jackYunService; _kingDeeService = kingDeeService; } #region SetOrder(把吉客云订单存进本地数据库) /// /// 把吉客云订单存进本地数据库 /// /// [TransactionCallHandler] public void SetOrder(List trades) { var ids = trades.Select(t => t.tradeId).Distinct().ToList(); ids = _jackOrdersRepository.Queryable().Where(t => ids.Contains(t.TradeId)).Select(t => t.TradeId).Distinct().ToList(); if (ids.Count > 0) trades = trades.Where(t => !ids.Contains(t.tradeId)).ToList(); List jackOrdersList = new List(); List ordersItemList = new List(); trades.ForEach(t => { JackOrders jackOrders = new JackOrders(); jackOrders = AutoMapperHelper.AutoMappToSingle(t); jackOrders.Id = Guid.NewGuid(); jackOrders.Status = 0; jackOrders.UpdateTime = DateTime.Now; jackOrders.CreateTime = DateTime.Now; if (t.goodsDetail != null) { var items = AutoMapperHelper.AutoMappToList(t.goodsDetail); items.ForEach(k => { k.JackOrdersId = jackOrders.Id; }); jackOrdersList.Add(jackOrders); ordersItemList.AddRange(items); } }); if (jackOrdersList.Count > 0) { _jackOrdersRepository.Add(jackOrdersList); _jackOrdersItemRepository.Add(ordersItemList); } } #endregion #region GetAndMergeJackYunOrder(合并吉客云订单到新表) /// /// 合并吉客云订单到新表 /// /// [TransactionCallHandler] public string GetAndMergeJackYunOrder(string now) { var list = _jackOrdersItemRepository.GetPushOrder(); List mesg = new List(); var shopParemList = _yTKJTShopParameterRepository.Queryable().Where(t => t.FDOCUMENTSTATUS == "C").ToList(); List pushKingDeeOrderItems = new List(); List pushKingDeeOrders = new List(); list.ForEach(sheet => { if (pushKingDeeOrders.Where(t => t.ShopId == sheet.ShopId && t.WarehouseId == sheet.WarehouseId).Count() > 0) { return; } PushKingDeeOrder pushKingDeeOrder = new PushKingDeeOrder(); pushKingDeeOrder = AutoMapperHelper.AutoMappToSingle(sheet); pushKingDeeOrder.Id = Guid.NewGuid(); pushKingDeeOrders.Add(pushKingDeeOrder); var tempList = list.Where(t => t.ShopId == sheet.ShopId && t.WarehouseId == sheet.WarehouseId).ToList(); tempList.ForEach(item => { PushKingDeeOrderItem pushKingDeeOrderItem = new PushKingDeeOrderItem(); pushKingDeeOrderItem = AutoMapperHelper.AutoMappToSingle(item); pushKingDeeOrderItem.PushKingDeeOrderId = pushKingDeeOrder.Id; pushKingDeeOrderItem.Id = Guid.NewGuid(); pushKingDeeOrderItems.Add(pushKingDeeOrderItem); }); //var shopParem = shopParemList.Where(h => h.FSHOPCODE == sheet.ShopId.Value.ToString()&& h.FWAREHOUSE.Value.ToString()==sheet.WarehouseId ).FirstOrDefault(); //if (shopParem != null) //{ //} //else //{ // mesg.Add($@"店铺{sheet.ShopName}没有配置店铺参数或者配置的仓库不是 {sheet.WarehouseCode}"); //} }); if (pushKingDeeOrders.Count > 0) { var oldList = _jackOrdersRepository.Queryable().Where(t => t.Status == 0).ToList(); oldList.ForEach(t => { if (pushKingDeeOrders.Count(h => h.ShopId == t.ShopId && t.WarehouseId == h.WarehouseId) > 0) { t.Status = 1; t.UpdateTime = DateTime.Now; } }); oldList = oldList.Where(t => t.Status == 1).ToList(); _jackOrdersRepository.Update(oldList); _pushKingDeeOrderRepository.Add(pushKingDeeOrders); _pushKingDeeOrderItemRepository.Add(pushKingDeeOrderItems); } return JsonHelper.ToJson(list); } #endregion public void PushOrderToKingDee(string id) { var orderSHeet = _pushKingDeeOrderRepository.Queryable().Where(t => id == t.Id.ToString()).First(); if (orderSHeet.Status != 0) { throw new BaseException("单据已经下推."); } var one = _yTKJTShopParameterRepository.Queryable().Where(t => t.FSHOPCODE == orderSHeet.ShopCode).First(); // TODO 如果是False则同步到云星空销售订单 if (one.FSYNCHRONIZEWMS == "0") { PushKingdeeSaleOrder(orderSHeet); } // 如果为True则同步到WMS else { //wms PushWMSSaleOrder(orderSHeet); } } private string PushWMSSaleOrder(PushKingDeeOrder pushKingdeeOrder) { var itemList = _pushKingDeeOrderItemRepository .Queryable() .Where(t => pushKingdeeOrder.Id == t.PushKingDeeOrderId) .ToList(); // 新建销售订单实例 var order = new SaleOrder(); // 赋值 order.CreateTime = pushKingdeeOrder.CreateTime?.ToString("yyyy/MM/dd"); order.OrderNo = pushKingdeeOrder.Id.ToString(); order.CompanyId = string.Empty; // 公司Id order.OrderType = pushKingdeeOrder.TradeType == 8 ? "8" : "4"; // 订单类型 order.CustomerId = string.Empty; // 货主ID order.WarehouseId = pushKingdeeOrder?.WarehouseId; order.OrderTime = pushKingdeeOrder.ConsignTime?.ToString("yyyy/MM/dd"); order.Channel = string.Empty; // 下发系统 order.ItemType = string.Empty; // 单据类型 order.TotalQty = itemList.Sum(n => n.SellCount); order.TotalMount = itemList.Sum(n => n.SellTotal); order.CreateTime = pushKingdeeOrder.CreateTime?.ToString("yyyy/MM/dd"); order.ReadTime = DateTime.Now.ToString("yyyy/MM/dd"); order.Lines = itemList.Select(n => new Line() { OrderNo = pushKingdeeOrder.Id.ToString(), CompanyId = string.Empty, // 公司Id OrderType = pushKingdeeOrder.TradeType == 8 ? "8" : "4", // 订单类型 LineNo = itemList.IndexOf(n) + 1, CustomerId = string.Empty, // 货主ID Sku = n.Barcode, Barcode = n.Barcode, OrderQty = n.SellCount, OrderPrice = Math.Round(n.DivideSellTotal / n.SellCount, 10), ItemId = n.GoodsId, // 商品 }).ToArray(); var uri = ""; var requestString = JsonHelper.ToJson(order, false, false, true); var client = new RestClient($"{uri}/sale/order/return"); client.Timeout = -1; var request = new RestRequest(Method.POST); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", requestString, ParameterType.RequestBody); IRestResponse response = client.Execute(request); var resultString = string.Empty; LogHelper.Info(resultString); return resultString; } private string PushKingdeeSaleOrder(PushKingDeeOrder pushKingdeeOrder) { var itemList = _pushKingDeeOrderItemRepository.Queryable().Where(t => pushKingdeeOrder.Id == t.PushKingDeeOrderId).ToList(); // 遍历单体,构造单据体实体 var entryList = itemList.Select(n => new FSaleOrderEntryItem() { Fcode = n.Barcode, // 条码带出物料 、物料带出税额 FQty = n.SellCount, // 销售数量 FTaxPrice = Math.Round(n.DivideSellTotal / n.SellCount, 10), // 含税单价等于 金额/总数 // 仓库必填 FSOStockId = new FSOStockId() { FNUMBER = pushKingdeeOrder.WarehouseCode }, }).ToList(); // 构建单据数据包 var model = new SaleOrderModel() { FID = 0, // 新增 FBillTypeID = new FBillTypeID() { // 1:零售业务7:售后发货;8:售后退货 FNUMBER = pushKingdeeOrder.TradeType == 8 ? "XSDD05_SYS" : "XSDD01_SYS" }, FOrdertype = pushKingdeeOrder.TradeType == 8 ? "8" : "4", FDate = pushKingdeeOrder.ConsignTime?.ToString("yyyy/MM/dd"), FSaleOrgId = new FSaleOrgId() { FNumber = "" // 固定组织 }, FCustId = new FCustId() { FNumber = "", // 客户? }, FSalerId = new FSalerId() { FNumber = "", // 销售员 }, Foutlets = new Foutlets() { FNUMBER = pushKingdeeOrder.ShopCode, // 门店编码 }, FWarehouse = new FWarehouse() { FNUMBER = pushKingdeeOrder.WarehouseCode, // 仓库编码 }, FSaleOrderEntry = entryList }; BillSave billSave = new BillSave() { Model = model }; SaleOrderModel fSaleOrderEntry = new SaleOrderModel(); var resultString = _kingDeeService.Save("SAL_SaleOrder", billSave); LogHelper.Info(resultString); return resultString; } } }