You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

195 lines
8.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using POSV.Service;
using POSV.Common.JsonObject;
using SuperSocket.WebSocket.SubProtocol;
using POSV.WindowsService.Core.Utils;
using POSV.WindowsService.Core;
using log4net;
using POSV.WindowsService.Core.OrderPackage;
using POSV.Common;
using POSV.Service.Utils;
using POSV.Service.Entity;
namespace POSV.WindowsService.Command
{
public class NEWORDER : JsonSubCommand<WebSocketSessionEx, string>
{
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
private static object newOrderLock = new object();
protected override void ExecuteJsonCommand(WebSocketSessionEx session, string orderJson)
{
logger.Info("收到["+session.Name+"]新订单:" + orderJson);
var response = new BaseDataResponse<NewOrderResult>();
try
{
lock (newOrderLock)
{
lock (Global.Instance.SyncLock)
{
bool isNew = true;//排除重复上传的订单
var serviceOrder = Json.Deserialize<ServiceOrder>(orderJson);
using (var db = Global.Instance.OpenDataBase)
{
using(var transaction = db.GetTransaction())
{
var isExist = db.FirstOrDefault<ServiceOrder>("where tradeNo = @0 and saleLastUpdateTime = @1", serviceOrder.TradeNo, serviceOrder.SaleLastUpdateTime);
if(isExist == null)
{
serviceOrder.Id = IdWorkerUtils.Instance.NextId();
//第一次接收,保存
db.Save(serviceOrder);
foreach(var item in serviceOrder.Items)
{
item.OrderId = serviceOrder.OrderId;
item.TenantId = serviceOrder.TenantId;
item.TradeNo = serviceOrder.TradeNo;
item.ServiceId = serviceOrder.Id;
//异常数据直接更改同步状态
if(string.IsNullOrEmpty(item.HuacaiDevice) || item.HuacaiDevice == "None")
{
item.SyncHuacaiStatus = 1;
}
if(string.IsNullOrEmpty(item.ChupinDevice) || item.ChupinDevice == "None")
{
item.SyncChupinStatus = 1;
}
}
db.InsertBatch(serviceOrder.Items);
}
else
{
isNew = true;
serviceOrder.Id = isExist.Id;
}
transaction.Complete();
}
}
//返回结果
response.Status = 1;
response.Message = "SUCCESS";
response.Data = new NewOrderResult
{
ServiceId = serviceOrder.Id,
RequestObj = orderJson
};
this.SendJsonMessage(session, Json.Serialize(response));
Console.WriteLine("已发送新订单响应");
//新订单通知厨显、出品
if (isNew)
{
Core.OrderPackage.OrderUtils.DistributeOrder2KDS(serviceOrder, KDSCategory.);
Core.OrderPackage.OrderUtils.DistributeOrder2KDS(serviceOrder, KDSCategory.);
}
}
}
}
catch(Exception ex)
{
logger.Error( ex, "新订单接收异常" );
//返回结果
response.Status = 0;
response.Message = "ERROR";
var data = new NewOrderResult
{
RequestObj = orderJson
};
this.SendJsonMessage(session, Json.Serialize(response));
}
}
}
/// <summary>
/// 厨显返回新订单接收结果
/// </summary>
public class KDSNEWORDERRESPONSE : JsonSubCommand<WebSocketSessionEx, string>
{
private static ILog logger = LogManager.GetLogger(typeof(Global));
protected override void ExecuteJsonCommand(WebSocketSessionEx session, string commandInfo)
{
try
{
logger.Info("收到kds[" + session.Name + "]订单回复:" + commandInfo);
var response = Json.Deserialize<BaseDataResponse<KdsNewOrderResult>>(commandInfo);
if (response.Status == 1)
{
//成功
var order = Json.Deserialize<ServiceOrder>(response.Data.RequestObj.ToString());
switch (response.Data.Category)
{
case KDSCategory.:
{
logger.Info("厨显返回新订单接收结果" + session.Name);
lock (Global.Instance.SyncLock)
{
using (var db = Global.Instance.OpenDataBase)
{
using (var transaction = db.GetTransaction())
{
var items = db.Query<ServiceOrderItem>("where serviceId = @0 and syncHuacaiStatus = 0", order.Id).ToList();
foreach (var kItem in order.Items)
{
var it = items.Find(x => x.Id == kItem.Id);
if (it != null)
{
it.SendHuacaiTime = DateUtils.GetNowFormat();
it.SyncHuacaiStatus = 1;
db.Save(it);
}
}
transaction.Complete();
}
}
System.Threading.Thread.Sleep(20);
}
}
break;
case KDSCategory.:
{
lock (Global.Instance.SyncLock)
{
using (var db = Global.Instance.OpenDataBase)
{
using (var transaction = db.GetTransaction())
{
var items = db.Query<ServiceOrderItem>("where serviceId = @0 and syncChupinStatus = 0", order.Id).ToList();
foreach (var kItem in order.Items)
{
var it = items.Find(x => x.Id == kItem.Id);
if(it != null)
{
it.SendChupinTime = DateUtils.GetNowFormat();
it.SyncChupinStatus = 1;
db.Save(it);
}
}
transaction.Complete();
}
}
System.Threading.Thread.Sleep(20);
}
}
break;
}
}
else
{
}
}
catch (Exception ex)
{
logger.Error("厨显返回新订单接收异常", ex);
}
}
}
}