2025-07-18 18:06:27 +08:00

293 lines
13 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()
/// <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 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;
}
}
}