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.Message.Response.KingDee.K3Result; using MyCode.Project.Domain.Message.Response.WMS; 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 orderHead = _pushKingDeeOrderRepository.Queryable().Where(t => id == t.Id.ToString()).First(); if (orderHead.Status != 0) { throw new BaseException("单据已经下推."); } var param = _yTKJTShopParameterRepository .Queryable() .Where(t => t.FSHOPCODE == orderHead.ShopCode) .First(); if (param is null) { throw new BaseException($"门店编号:{orderHead.ShopCode},门店名称:{orderHead.ShopName},没有找到对应的门店参数 "); } // 如果这个配置都没有勾选则直接报错 if (param.FSYNCHRONIZEKINGDEE == "0" && param.FSYNCHRONIZEWMS == "0") { throw new BaseException($"门店编号:{orderHead.ShopCode},门店名称:{orderHead.ShopName},参数配置错误,请联系管理员检查 "); } // TODO 如果是False则同步到云星空销售订单 //if (param.FSYNCHRONIZEWMS == "1") if (param.FSYNCHRONIZEKINGDEE == "1") { var response = PushKingdeeSaleOrder(orderHead, param); // 如果保存成功,需要更新源单数据 if (response.IsSuccess) { orderHead.Status = 2; _pushKingDeeOrderRepository.Update(orderHead); } } // 如果为True则同步到WMS else if (param.FSYNCHRONIZEWMS == "1") { //wms var result = PushWMSSaleOrder(orderHead, param); if (result.Code == 200) { orderHead.Status = 2; _pushKingDeeOrderRepository.Update(orderHead); } } } private WMSResponse PushWMSSaleOrder(PushKingDeeOrder pushKingdeeOrder, YTKJTShopParameter param) { var itemList = _pushKingDeeOrderItemRepository .Queryable() .Where(t => pushKingdeeOrder.Id == t.PushKingDeeOrderId) .ToList(); // 新建销售订单实例 var order = new SaleOrder(); // 赋值 var orderNo = pushKingdeeOrder.Sheet.ToString(); //var orderNo = DateTimeOffset.Now.ToUnixTimeSeconds().ToString(); order.CreateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); order.OrderTime = pushKingdeeOrder.CreateTime?.ToString("yyyy-MM-dd HH:mm:ss"); order.OrderNo = orderNo; order.CompanyId = param.FCOMPANYID; // 公司Id order.OrderType = pushKingdeeOrder.TradeType == 8 ? "PFTH" : "PFDD"; // 订单类型 order.CustomerId = param.FCANGKUHUOZHU; // 货主ID order.WarehouseId = pushKingdeeOrder?.WarehouseId; order.OrderTime = pushKingdeeOrder.ConsignTime?.ToString("yyyy-MM-dd HH:mm:ss"); order.Channel = "JeckYun"; // 下发系统 order.ItemType = pushKingdeeOrder.TradeType == 8 ? "退货订单" : "标准销售订单"; // 单据类型 order.TotalQty = itemList.Sum(n => n.SellCount); order.TotalMount = itemList.Sum(n => n.SellTotal); order.ReadTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); order.CustAccount = param.FSALESCUSTOMERS.ToString(); order.Lines = itemList.Select(n => new Line() { OrderNo = orderNo, //CompanyId = param.FCOMPANYID, // 公司Id CompanyId = param.FCOMPANYID, // 公司Id OrderType = pushKingdeeOrder.TradeType == 8 ? "7" : "4", // 订单类型 LineNo = itemList.IndexOf(n) + 1, CustomerId = param.FCANGKUHUOZHU, // 货主ID Sku = n.Barcode, Barcode = n.Barcode, OrderQty = n.SellCount, OrderPrice = Math.Round(n.DivideSellTotal / n.SellCount, 10), ItemId = n.GoodsNo, // 商品 LocationId = param.FWAREHOUSECODE, CreateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), OrderUnit = n.Unit, }).ToArray(); var uri = "http://172.16.42.45:9000"; var requestString = JsonHelper.ToJson(order, false, true, true); var client = new RestClient(pushKingdeeOrder.TradeType == 8 ? $"{uri}/sale/order/return" : $"{uri}/sale/order/out"); 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 resultContent = response.Content; LogHelper.Info("请求:" + requestString); LogHelper.Info("响应:" + resultContent); var result = JsonHelper.ToObject(resultContent); if (result.Code != 200) { throw new Exception("推送WMS发生错误:" + result.Message); } return result; } /// /// 推送到金蝶云星空 /// /// 源单信息 /// 门店配置 /// private Domain.Message.Response.KingDee.K3Result.Model.ResponseStatus PushKingdeeSaleOrder(PushKingDeeOrder pushKingdeeOrder, YTKJTShopParameter param) { var itemList = _pushKingDeeOrderItemRepository.Queryable().Where(t => pushKingdeeOrder.Id == t.PushKingDeeOrderId).ToList(); // 遍历单体,构造单据体实体 var entryList = itemList.Select(n => new FSaleOrderEntryItem() { Fcode = n.Barcode, // 条码带出物料 、物料带出税额 //Fcode = "2120101128415", // 条码带出物料 、物料带出税额 FEntryTaxRate = param.FTAXRATE, FQty = n.SellCount, // 销售数量 FTaxPrice = Math.Round(n.DivideSellTotal / n.SellCount, 10), // 含税单价等于 金额/总数 FSOStockId = new FSOStockId() // 仓库必填 { FNUMBER = param.FWAREHOUSECODE }, }).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 ? "7" : "4", FDate = pushKingdeeOrder.ConsignTime?.ToString("yyyy/MM/dd"), FSaleOrgId = new FSaleOrgId() { FOrgId = param.FSALEORGID.ToString() // 销售组织 }, FCustId = new FCustomerId() { FCustId = param.FSALESCUSTOMERS.ToString(), // 客户? }, FSalerId = new FSalerId() { FId = param.FSALER, // 销售员 //FNumber = "思迅销售员_GW000002_1", // 销售员 }, 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 responseStatus = _kingDeeService.Save("SAL_SaleOrder", billSave); //LogHelper.Info(); return responseStatus; } } }