246 lines
11 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.Message.Response.KingDee.K3Result;
using MyCode.Project.Domain.Message.Response.KingDee.K3Result.Model;
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.Configuration;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace MyCode.Project.Services.Implementation
{
public class OrderPushService : ServiceBase, IOrderPushService
{
private IJackYunService _jackYunService;
private IJackOrdersRepository _jackOrdersRepository;
private IJackOrdersItemRepository _jackOrdersItemRepository;
private IPushKingDeeOrderRepository _pushKingDeeOrderRepository;
private IPushKingDeeOrderItemRepository _pushKingDeeOrderItemRepository;
private IYTKJTShopParameterRepository _yTKJTShopParameterRepository;
private IKingDeeService _kingDeeService;
private IWorkProcessService _workProcessService;
public OrderPushService(IJackOrdersRepository jackOrdersRepository
, IJackOrdersItemRepository jackOrdersItemRepository
, IPushKingDeeOrderRepository pushKingDeeOrderRepository
, IPushKingDeeOrderItemRepository pushKingDeeOrderItemRepository
, IYTKJTShopParameterRepository yTKJTShopParameterRepository
, IJackYunService jackYunService
, IKingDeeService kingDeeService,
IWorkProcessService workProcessService)
{
_yTKJTShopParameterRepository = yTKJTShopParameterRepository;
_pushKingDeeOrderRepository = pushKingDeeOrderRepository;
_pushKingDeeOrderItemRepository = pushKingDeeOrderItemRepository;
_jackOrdersRepository = jackOrdersRepository;
_jackOrdersItemRepository = jackOrdersItemRepository;
_jackYunService = jackYunService;
_kingDeeService = kingDeeService;
_workProcessService = workProcessService;
}
public string PushOrderToKingDee(string id)
{
string result2 = "";
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)
.Where(t => t.FDOCUMENTSTATUS == "C") // 已审核
.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);
result2 = JsonHelper.ToJson(response);
// 如果保存成功,需要更新源单数据
if (response.IsSuccess)
{
orderHead.Status = 2;
_pushKingDeeOrderRepository.Update(orderHead);
}
}
// 如果为True则同步到WMS
else if (param.FSYNCHRONIZEWMS == "1")
{
//wms
var result = PushWMSSaleOrder(orderHead, param);
result2 = JsonHelper.ToJson(result);
if (result.Code == 200)
{
orderHead.Status = 2;
_pushKingDeeOrderRepository.Update(orderHead);
}
}
return result2;
}
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 = param.FDACANG;
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 ? "PFTH" : "PFDD", // 订单类型
LineNo = itemList.IndexOf(n) + 1,
CustomerId = param.FCANGKUHUOZHU, // 货主ID
Sku = n.Barcode,
Barcode = n.Barcode,
OrderQty =Math.Abs( n.SellCount),
OrderPrice = Math.Abs( 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 = ConfigurationManager.AppSettings.Get("WMSUri");
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("WMS请求" + requestString);
LogHelper.Info("WMS响应" + resultContent);
var result = JsonHelper.ToObject<WMSResponse>(resultContent);
if (result.Code != 200)
{
throw new Exception(result.Message);
}
return result;
}
/// <summary>
/// 推送到金蝶云星空
/// </summary>
/// <param name="pushKingdeeOrder">源单信息</param>
/// <param name="param">门店配置</param>
/// <returns></returns>
private K3CloudResponseStatus 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, // 条码带出物料 、物料带出税额
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 ? "10" : "9",
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 = param.FWAREHOUSECODE, // 仓库编码
},
FSaleOrderEntry = entryList
};
BillSave billSave = new BillSave()
{
Model = model,
IsAutoSubmitAndAudit = true,
};
SaleOrderModel fSaleOrderEntry = new SaleOrderModel();
var responseStatus = _kingDeeService.Save("SAL_SaleOrder", billSave);
//LogHelper.Info();
return responseStatus;
}
}
}