342 lines
15 KiB
C#
Raw Normal View History

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