2025-07-18 10:14:31 +08:00
|
|
|
|
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;
|
2025-07-18 10:14:31 +08:00
|
|
|
|
using MyCode.Project.Domain.Message.Response.JackYun;
|
2025-07-21 17:54:00 +08:00
|
|
|
|
using MyCode.Project.Domain.Message.Response.KingDee.K3Result;
|
2025-07-28 11:57:11 +08:00
|
|
|
|
using MyCode.Project.Domain.Message.Response.KingDee.K3Result.Model;
|
2025-07-21 17:54:00 +08:00
|
|
|
|
using MyCode.Project.Domain.Message.Response.WMS;
|
2025-07-18 10:14:31 +08:00
|
|
|
|
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;
|
2025-07-18 10:14:31 +08:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
2025-07-23 14:33:16 +08:00
|
|
|
|
using System.Configuration;
|
2025-07-18 10:14:31 +08:00
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Text;
|
2025-07-26 18:31:01 +08:00
|
|
|
|
using System.Threading;
|
2025-07-18 10:14:31 +08:00
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
|
|
|
|
namespace MyCode.Project.Services.Implementation
|
|
|
|
|
|
{
|
2025-07-28 11:57:11 +08:00
|
|
|
|
public class OrderPushService : ServiceBase, IOrderPushService
|
2025-07-18 10:14:31 +08:00
|
|
|
|
{
|
|
|
|
|
|
private IJackYunService _jackYunService;
|
|
|
|
|
|
private IJackOrdersRepository _jackOrdersRepository;
|
|
|
|
|
|
private IJackOrdersItemRepository _jackOrdersItemRepository;
|
|
|
|
|
|
private IPushKingDeeOrderRepository _pushKingDeeOrderRepository;
|
|
|
|
|
|
private IPushKingDeeOrderItemRepository _pushKingDeeOrderItemRepository;
|
|
|
|
|
|
private IYTKJTShopParameterRepository _yTKJTShopParameterRepository;
|
|
|
|
|
|
private IKingDeeService _kingDeeService;
|
2025-07-26 18:31:01 +08:00
|
|
|
|
private IWorkProcessService _workProcessService;
|
2025-07-18 10:14:31 +08:00
|
|
|
|
public OrderPushService(IJackOrdersRepository jackOrdersRepository
|
|
|
|
|
|
, IJackOrdersItemRepository jackOrdersItemRepository
|
|
|
|
|
|
, IPushKingDeeOrderRepository pushKingDeeOrderRepository
|
|
|
|
|
|
, IPushKingDeeOrderItemRepository pushKingDeeOrderItemRepository
|
|
|
|
|
|
, IYTKJTShopParameterRepository yTKJTShopParameterRepository
|
|
|
|
|
|
, IJackYunService jackYunService
|
2025-07-26 18:31:01 +08:00
|
|
|
|
, IKingDeeService kingDeeService,
|
2025-07-28 11:57:11 +08:00
|
|
|
|
IWorkProcessService workProcessService)
|
2025-07-18 10:14:31 +08:00
|
|
|
|
{
|
|
|
|
|
|
_yTKJTShopParameterRepository = yTKJTShopParameterRepository;
|
|
|
|
|
|
_pushKingDeeOrderRepository = pushKingDeeOrderRepository;
|
|
|
|
|
|
_pushKingDeeOrderItemRepository = pushKingDeeOrderItemRepository;
|
|
|
|
|
|
_jackOrdersRepository = jackOrdersRepository;
|
|
|
|
|
|
_jackOrdersItemRepository = jackOrdersItemRepository;
|
|
|
|
|
|
_jackYunService = jackYunService;
|
|
|
|
|
|
_kingDeeService = kingDeeService;
|
2025-07-26 18:31:01 +08:00
|
|
|
|
_workProcessService = workProcessService;
|
2025-07-18 10:14:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-11 13:30:29 +08:00
|
|
|
|
|
2025-07-25 22:23:48 +08:00
|
|
|
|
public string PushOrderToKingDee(string id)
|
2025-07-18 10:14:31 +08:00
|
|
|
|
{
|
2025-07-25 22:23:48 +08:00
|
|
|
|
string result2 = "";
|
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 10:14:31 +08:00
|
|
|
|
{
|
2025-07-18 16:42:14 +08:00
|
|
|
|
throw new BaseException("单据已经下推.");
|
2025-07-18 10:14:31 +08:00
|
|
|
|
}
|
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-28 11:57:11 +08:00
|
|
|
|
.Where(t => t.FDOCUMENTSTATUS == "C") // 已审核
|
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
|
|
|
|
}
|
2025-07-18 10:14:31 +08:00
|
|
|
|
// TODO 如果是False则同步到云星空销售订单
|
2025-07-21 16:52:17 +08:00
|
|
|
|
//if (param.FSYNCHRONIZEWMS == "1")
|
|
|
|
|
|
if (param.FSYNCHRONIZEKINGDEE == "1")
|
2025-07-18 10:14:31 +08:00
|
|
|
|
{
|
2025-07-21 16:52:17 +08:00
|
|
|
|
var response = PushKingdeeSaleOrder(orderHead, param);
|
2025-07-25 22:23:48 +08:00
|
|
|
|
result2 = JsonHelper.ToJson(response);
|
2025-07-21 16:52:17 +08:00
|
|
|
|
// 如果保存成功,需要更新源单数据
|
|
|
|
|
|
if (response.IsSuccess)
|
|
|
|
|
|
{
|
|
|
|
|
|
orderHead.Status = 2;
|
|
|
|
|
|
_pushKingDeeOrderRepository.Update(orderHead);
|
|
|
|
|
|
}
|
2025-07-18 10:14:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
// 如果为True则同步到WMS
|
2025-07-21 16:52:17 +08:00
|
|
|
|
else if (param.FSYNCHRONIZEWMS == "1")
|
2025-07-18 10:14:31 +08:00
|
|
|
|
{
|
|
|
|
|
|
//wms
|
2025-07-21 17:54:00 +08:00
|
|
|
|
var result = PushWMSSaleOrder(orderHead, param);
|
2025-07-25 22:23:48 +08:00
|
|
|
|
result2 = JsonHelper.ToJson(result);
|
2025-07-21 17:54:00 +08:00
|
|
|
|
if (result.Code == 200)
|
|
|
|
|
|
{
|
|
|
|
|
|
orderHead.Status = 2;
|
|
|
|
|
|
_pushKingDeeOrderRepository.Update(orderHead);
|
|
|
|
|
|
}
|
2025-07-18 10:14:31 +08:00
|
|
|
|
}
|
2025-07-25 22:23:48 +08:00
|
|
|
|
return result2;
|
2025-07-18 10:14:31 +08:00
|
|
|
|
}
|
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-23 11:39:14 +08:00
|
|
|
|
order.WarehouseId = param.FDACANG;
|
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-23 18:07:21 +08:00
|
|
|
|
OrderType = pushKingdeeOrder.TradeType == 8 ? "PFTH" : "PFDD", // 订单类型
|
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,
|
2025-10-21 11:27:52 +08:00
|
|
|
|
OrderQty =Math.Abs( n.SellCount),
|
|
|
|
|
|
OrderPrice = Math.Abs( 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-23 14:33:16 +08:00
|
|
|
|
var uri = ConfigurationManager.AppSettings.Get("WMSUri");
|
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-28 11:57:11 +08:00
|
|
|
|
LogHelper.Info("WMS请求:" + requestString);
|
|
|
|
|
|
LogHelper.Info("WMS响应:" + resultContent);
|
2025-07-21 17:54:00 +08:00
|
|
|
|
var result = JsonHelper.ToObject<WMSResponse>(resultContent);
|
|
|
|
|
|
if (result.Code != 200)
|
|
|
|
|
|
{
|
2025-07-23 11:37:03 +08:00
|
|
|
|
throw new Exception(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>
|
2025-07-28 11:57:11 +08:00
|
|
|
|
private K3CloudResponseStatus 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
|
|
|
|
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-28 14:29:34 +08:00
|
|
|
|
FOrdertype = pushKingdeeOrder.TradeType == 8 ? "10" : "9",
|
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()
|
|
|
|
|
|
{
|
2025-08-11 17:32:59 +08:00
|
|
|
|
FNUMBER = param.FWAREHOUSECODE, // 仓库编码
|
2025-07-18 16:42:14 +08:00
|
|
|
|
},
|
|
|
|
|
|
FSaleOrderEntry = entryList
|
|
|
|
|
|
};
|
|
|
|
|
|
BillSave billSave = new BillSave()
|
|
|
|
|
|
{
|
2025-07-23 16:11:35 +08:00
|
|
|
|
Model = model,
|
|
|
|
|
|
IsAutoSubmitAndAudit = true,
|
2025-07-18 16:42:14 +08:00
|
|
|
|
};
|
|
|
|
|
|
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
|
|
|
|
}
|
2025-11-09 20:26:53 +08:00
|
|
|
|
|
2025-07-18 10:14:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|