338 lines
15 KiB
C#
338 lines
15 KiB
C#
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(把吉客云订单存进本地数据库)
|
||
/// <summary>
|
||
/// 把吉客云订单存进本地数据库
|
||
/// </summary>
|
||
/// <param name="trades"></param>
|
||
[TransactionCallHandler]
|
||
public void SetOrder(List<TradesItem> 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<JackOrders> jackOrdersList = new List<JackOrders>();
|
||
List<JackOrdersItem> ordersItemList = new List<JackOrdersItem>();
|
||
trades.ForEach(t =>
|
||
{
|
||
JackOrders jackOrders = new JackOrders();
|
||
jackOrders = AutoMapperHelper.AutoMappToSingle<JackOrders, TradesItem>(t);
|
||
jackOrders.Id = Guid.NewGuid();
|
||
jackOrders.Status = 0;
|
||
jackOrders.UpdateTime = DateTime.Now;
|
||
jackOrders.CreateTime = DateTime.Now;
|
||
if (t.goodsDetail != null)
|
||
{
|
||
var items = AutoMapperHelper.AutoMappToList<JackOrdersItem, GoodsDetailItem>(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(合并吉客云订单到新表)
|
||
/// <summary>
|
||
/// 合并吉客云订单到新表
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[TransactionCallHandler]
|
||
public string GetAndMergeJackYunOrder(string now)
|
||
{
|
||
var list = _jackOrdersItemRepository.GetPushOrder();
|
||
List<string> mesg = new List<string>();
|
||
|
||
var shopParemList = _yTKJTShopParameterRepository.Queryable().Where(t => t.FDOCUMENTSTATUS == "C").ToList();
|
||
List<PushKingDeeOrderItem> pushKingDeeOrderItems = new List<PushKingDeeOrderItem>();
|
||
List<PushKingDeeOrder> pushKingDeeOrders = new List<PushKingDeeOrder>();
|
||
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<PushKingDeeOrder, PushOrderListResp>(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<PushKingDeeOrderItem, PushOrderListResp>(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();
|
||
// 赋值
|
||
order.CreateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
|
||
order.OrderTime = pushKingdeeOrder.CreateTime?.ToString("yyyy-MM-dd HH:mm:ss");
|
||
order.OrderNo = pushKingdeeOrder.Id.ToString();
|
||
//order.CompanyId = param.FCOMPANYID; // 公司Id
|
||
order.CompanyId = "TZ"; // 公司Id
|
||
order.OrderType = pushKingdeeOrder.TradeType == 8 ? "7" : "4"; // 订单类型
|
||
order.CustomerId = param.FCANGKUHUOZHU; // 货主ID
|
||
order.WarehouseId = pushKingdeeOrder?.WarehouseId;
|
||
order.OrderTime = pushKingdeeOrder.ConsignTime?.ToString("yyyy-MM-dd HH:mm:ss");
|
||
order.Channel = "K3Cloud"; // 下发系统
|
||
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 = pushKingdeeOrder.Id.ToString(),
|
||
//CompanyId = param.FCOMPANYID, // 公司Id
|
||
CompanyId = "TZ", // 公司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.GoodsId, // 商品
|
||
LocationId = param.FWAREHOUSECODE,
|
||
CreateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
|
||
OrderUnit = "pcs"
|
||
}).ToArray();
|
||
|
||
var uri = "http://172.16.42.45:9000";
|
||
|
||
var requestString = JsonHelper.ToJson(order, false, true, true);
|
||
var client = new RestClient($"{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;
|
||
var result = JsonHelper.ToObject<WMSResponse>(resultContent);
|
||
if (result.Code != 200)
|
||
{
|
||
throw new Exception("推送WMS发生错误:" + resultContent);
|
||
}
|
||
LogHelper.Info(resultContent);
|
||
return result;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 推送到金蝶云星空
|
||
/// </summary>
|
||
/// <param name="pushKingdeeOrder">源单信息</param>
|
||
/// <param name="param">门店配置</param>
|
||
/// <returns></returns>
|
||
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;
|
||
}
|
||
}
|
||
}
|