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;
}
}
}