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.KingDee.K3Result.Model; 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.Configuration; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace MyCode.Project.Services.Implementation { public class OrderPushService : ServiceBase, IOrderPushService { private IJackYunService _jackYunService; private IJackOrdersRepository _jackOrdersRepository; private IJackOrdersItemRepository _jackOrdersItemRepository; private IPushKingDeeOrderRepository _pushKingDeeOrderRepository; private IPushKingDeeOrderItemRepository _pushKingDeeOrderItemRepository; private IYTKJTShopParameterRepository _yTKJTShopParameterRepository; private IKingDeeService _kingDeeService; private IWorkProcessService _workProcessService; public OrderPushService(IJackOrdersRepository jackOrdersRepository , IJackOrdersItemRepository jackOrdersItemRepository , IPushKingDeeOrderRepository pushKingDeeOrderRepository , IPushKingDeeOrderItemRepository pushKingDeeOrderItemRepository , IYTKJTShopParameterRepository yTKJTShopParameterRepository , IJackYunService jackYunService , IKingDeeService kingDeeService, IWorkProcessService workProcessService) { _yTKJTShopParameterRepository = yTKJTShopParameterRepository; _pushKingDeeOrderRepository = pushKingDeeOrderRepository; _pushKingDeeOrderItemRepository = pushKingDeeOrderItemRepository; _jackOrdersRepository = jackOrdersRepository; _jackOrdersItemRepository = jackOrdersItemRepository; _jackYunService = jackYunService; _kingDeeService = kingDeeService; _workProcessService = workProcessService; } public string PushOrderToKingDee(string id) { string result2 = ""; 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) .Where(t => t.FDOCUMENTSTATUS == "C") // 已审核 .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); result2 = JsonHelper.ToJson(response); // 如果保存成功,需要更新源单数据 if (response.IsSuccess) { orderHead.Status = 2; _pushKingDeeOrderRepository.Update(orderHead); } } // 如果为True则同步到WMS else if (param.FSYNCHRONIZEWMS == "1") { //wms var result = PushWMSSaleOrder(orderHead, param); result2 = JsonHelper.ToJson(result); if (result.Code == 200) { orderHead.Status = 2; _pushKingDeeOrderRepository.Update(orderHead); } } return result2; } 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 = param.FDACANG; 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 ? "PFTH" : "PFDD", // 订单类型 LineNo = itemList.IndexOf(n) + 1, CustomerId = param.FCANGKUHUOZHU, // 货主ID Sku = n.Barcode, Barcode = n.Barcode, OrderQty =Math.Abs( n.SellCount), OrderPrice = Math.Abs( 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 = ConfigurationManager.AppSettings.Get("WMSUri"); 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("WMS请求:" + requestString); LogHelper.Info("WMS响应:" + resultContent); var result = JsonHelper.ToObject(resultContent); if (result.Code != 200) { throw new Exception(result.Message); } return result; } /// /// 推送到金蝶云星空 /// /// 源单信息 /// 门店配置 /// private K3CloudResponseStatus 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, // 条码带出物料 、物料带出税额 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 ? "10" : "9", 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 = param.FWAREHOUSECODE, // 仓库编码 }, FSaleOrderEntry = entryList }; BillSave billSave = new BillSave() { Model = model, IsAutoSubmitAndAudit = true, }; SaleOrderModel fSaleOrderEntry = new SaleOrderModel(); var responseStatus = _kingDeeService.Save("SAL_SaleOrder", billSave); //LogHelper.Info(); return responseStatus; } } }