1.增加盟讯公司业务逻辑相关适配 前后端增加配置参数“ISMX”进行控制

2.前端websocket取消心跳机制(原有心跳和断线重连当服务端网线断开后需要等tcp保活期到期后才能发现重连),自己实现心跳和重连
3.前端关闭后任占用后台线程问题修复
This commit is contained in:
hehaibing-1996
2024-05-25 17:25:27 +08:00
parent 472862a978
commit 00621bcd55
82 changed files with 3404 additions and 240 deletions

View File

@ -1,4 +1,5 @@
using SqlSugar;
using Microsoft.Data.SqlClient;
using SqlSugar;
using WCS.BLL.Config;
using WCS.BLL.DbModels;
using WCS.BLL.Manager;
@ -154,103 +155,262 @@ namespace WCS.BLL.Services.Service
Message = "出库单据同步失败:缺少物料明细!"
};
}
//库存有无校验 & 库存已锁校验
try
//标准版逻辑-库存有无校验 & 库存已锁校验
if (!LocalFile.Config.IsMx)
{
await DbHelp.db.BeginTranAsync();
var inventoryDetails = await DbHelp.db.Queryable<InventoryDetail>()
.Where(t => request.SnList.Contains(t.MatSN))
.TranLock(DbLockType.Wait)
.ToListAsync();
if (inventoryDetails.Count < request.SnList.Count)//库存的物料少于需求的物料数量
try
{
var existsSns = inventoryDetails.Select(t => t.MatSN).ToList();
request.SnList.RemoveAll(t => existsSns.Contains(t));
await DbHelp.db.RollbackTranAsync();
//返回提示哪些物料库存不存在
await DbHelp.db.BeginTranAsync();
var inventoryDetails = await DbHelp.db.Queryable<InventoryDetail>()
.Where(t => request.SnList.Contains(t.MatSN))
.TranLock(DbLockType.Wait)
.ToListAsync();
if (inventoryDetails.Count < request.SnList.Count)//库存的物料少于需求的物料数量
{
var existsSns = inventoryDetails.Select(t => t.MatSN).ToList();
request.SnList.RemoveAll(t => existsSns.Contains(t));
await DbHelp.db.RollbackTranAsync();
//返回提示哪些物料库存不存在
return new ResponseCommon()
{
Code = 201,
Message = "出库单据同步失败:存在物料不在库存中!",
Data = request.SnList
};
}
else if (inventoryDetails.Where(t => t.IsLocked).Any())
{
await DbHelp.db.RollbackTranAsync();
//返回提示哪些物料库存已被锁定
return new ResponseCommon()
{
Code = 201,
Message = "出库单据同步失败:存在物料被锁定!",
Data = inventoryDetails.Where(t => t.IsLocked).Select(t => t.MatSN).ToList()
};
}
#region
//锁库存
inventoryDetails.ForEach(t =>
{
t.IsLocked = true;
});
var lockTask = DbHelp.db.Updateable(inventoryDetails).ExecuteCommandAsync();
//保存数据
var order = new OutOrder()
{
OrderNumber = request.OrderNumber,
OrderSource = request.OrderSource,
OrderType = request.OrderType,
SyncType = SyncTypeEnum.ByMatSn,
CreateUser = request.UserName,
};
order.Id = await DbHelp.db.Insertable(order).ExecuteReturnIdentityAsync();
//通过库存数据保存出库物料明细表
var matDetailTasks = inventoryDetails.Select(async t =>
{
var orderMatDetail = new OutOrderMatDetail()
{
OrderId = order.Id,
OrderNumber = order.OrderNumber,
InventoryDetailId = t.Id,
StoreId = t.StoreId,
StoreCode = t.StoreCode,
MatSN = t.MatSN,
MatCode = t.MatCode,
MatName = t.MatName,
MatSpec = t.MatSpec,
MatBatch = t.MatBatch,
MatQty = t.MatQty,
MatSupplier = t.MatSupplier,
MatCustomer = t.MatCustomer,
CreateUser = request.UserName
};
await DbHelp.db.Insertable(orderMatDetail).ExecuteCommandAsync();
}).ToList();
await lockTask;
await Task.WhenAll(matDetailTasks);
await DbHelp.db.CommitTranAsync();
return new ResponseCommon()
{
Code = 201,
Message = "出库单据同步失败:存在物料不在库存中!",
Data = request.SnList
Code = 200,
Message = $"出库单据同步成功!\r\n出库单据号为{request.OrderNumber}",
Data = order.Id
};
#endregion
}
else if (inventoryDetails.Where(t => t.IsLocked).Any())
catch (Exception ex)
{
await DbHelp.db.RollbackTranAsync();
//返回提示哪些物料库存已被锁定
return new ResponseCommon()
return new ResponseBase()
{
Code = 201,
Message = "出库单据同步失败:存在物料被锁定!",
Data = inventoryDetails.Where(t => t.IsLocked).Select(t => t.MatSN).ToList()
Message = $"出库单据同步失败:{ex.Message}"
};
}
#region
//锁库存
inventoryDetails.ForEach(t =>
{
t.IsLocked = true;
});
var lockTask = DbHelp.db.Updateable(inventoryDetails).ExecuteCommandAsync();
//保存数据
var order = new OutOrder()
{
OrderNumber = request.OrderNumber,
OrderSource = request.OrderSource,
OrderType = request.OrderType,
SyncType = SyncTypeEnum.ByMatSn,
CreateUser = request.UserName,
};
order.Id = await DbHelp.db.Insertable(order).ExecuteReturnIdentityAsync();
//通过库存数据保存出库物料明细表
var matDetailTasks = inventoryDetails.Select(async t =>
{
var orderMatDetail = new OutOrderMatDetail()
{
OrderId = order.Id,
OrderNumber = order.OrderNumber,
InventoryDetailId = t.Id,
StoreId = t.StoreId,
StoreCode = t.StoreCode,
MatSN = t.MatSN,
MatCode = t.MatCode,
MatName = t.MatName,
MatSpec = t.MatSpec,
MatBatch = t.MatBatch,
MatQty = t.MatQty,
MatSupplier = t.MatSupplier,
MatCustomer = t.MatCustomer,
CreateUser = request.UserName
};
await DbHelp.db.Insertable(orderMatDetail).ExecuteCommandAsync();
}).ToList();
await lockTask;
await Task.WhenAll(matDetailTasks);
await DbHelp.db.CommitTranAsync();
return new ResponseCommon()
{
Code = 200,
Message = $"出库单据同步成功!\r\n出库单据号为{request.OrderNumber}",
Data = order.Id
};
#endregion
}
catch (Exception ex)
//盟讯公司逻辑 不锁库存 直接保存数据/清除未发送的
else
{
await DbHelp.db.RollbackTranAsync();
return new ResponseBase()
try
{
Code = 201,
Message = $"出库单据同步失败:{ex.Message}"
};
DbHelp.db.BeginTran();
//1. 获取库存物料明细
var inventoryDetails = await DbHelp.db.Queryable<InventoryDetail>()
.Where(t => request.SnList.Contains(t.MatSN))
.ToListAsync();
if (inventoryDetails == null || inventoryDetails.Count == 0)
{
return new ResponseCommon()
{
Code = 201,
Message = "保存出库单失败!请重试!",
Data = request.SnList
};
}
//2. 先获取对应单号是否已经保存
var outOrder = DbHelp.db.Queryable<OutOrder>()
.Where(t => t.OrderNumber == request.OrderNumber)
.Where(t => t.GroupName == LocalFile.Config.GroupName)
.First();
//数据库中没有才添加
if (outOrder == null)
{
//OutOrder
outOrder = new OutOrder()
{
OrderNumber = request.OrderNumber,
OutOrderExeStatus = OutOrderExeStatus.,
OrderSource = "WCS前端",
SyncType = SyncTypeEnum.ByMatSn,
ShelfTypeName = "智能货架",
ShelfTypeId = 0,
GroupName = LocalFile.Config.GroupName,
};
outOrder.Id = await DbHelp.db.Insertable(outOrder).ExecuteReturnIdentityAsync();
outOrder = await DbHelp.db.Queryable<OutOrder>().Where(t => t.OrderNumber == request.OrderNumber)
.Where(t => t.Id == outOrder.Id)
.FirstAsync();
//保存单据失败了
if (outOrder == null)
return new ResponseCommon()
{
Code = 201,
Message = "保存出库单失败保存Order失败",
Data = request.SnList
};
//出库物料明细
foreach (var item in inventoryDetails)
{
var orderMatDetail = new OutOrderMatDetail()
{
OrderId = outOrder.Id,
OrderNumber = outOrder.OrderNumber,
InventoryDetailId = item.Id,
StoreId = item.StoreId,
StoreCode = item.StoreCode,
MatSN = item.MatSN,
MatCode = item.MatCode,
MatName = item.MatName,
MatSpec = item.MatSpec,
MatBatch = item.MatBatch,
MatQty = item.MatQty,
MatSupplier = item.MatSupplier,
MatCustomer = item.MatCustomer,
CreateUser = request.UserName
};
await DbHelp.db.Insertable(orderMatDetail).ExecuteCommandAsync();
}
DbHelp.db.CommitTran();
}
//数据库已有该Order
else
{
outOrder.CreateTime = DateTime.Now;
DbHelp.db.Updateable(outOrder).ExecuteCommand();
//删除未出库的
var outOrderDetails = DbHelp.db.Deleteable<OutOrderMatDetail>()
.Where(t => t.OrderId == outOrder.Id)
.Where(t => t.IsSended == false)
.ExecuteCommand();
//当前已出库的 //已出库的也不在库存中了 应该查询不到了
//避免影响效率 就不查重了
foreach (var item in inventoryDetails)
{
var orderMatDetail = new OutOrderMatDetail()
{
OrderId = outOrder.Id,
OrderNumber = outOrder.OrderNumber,
InventoryDetailId = item.Id,
StoreId = item.StoreId,
StoreCode = item.StoreCode,
MatSN = item.MatSN,
MatCode = item.MatCode,
MatName = item.MatName,
MatSpec = item.MatSpec,
MatBatch = item.MatBatch,
MatQty = item.MatQty,
MatSupplier = item.MatSupplier,
MatCustomer = item.MatCustomer,
CreateUser = request.UserName
};
await DbHelp.db.Insertable(orderMatDetail).ExecuteCommandAsync();
}
DbHelp.db.CommitTran();
//更新订单状态
Task.Run(() =>
{
if (outOrder != null)
{
#region
var orderMatDetails = DbHelp.db.Queryable<OutOrderMatDetail>()
.Where(t => t.OrderId == outOrder.Id)
.ToList();
var isExistNoSendMat = orderMatDetails.Where(t => t.IsSended == false)
.Any();
if (isExistNoSendMat)
{
outOrder.OrderStatus = OutOrderStatus.;
}
else
{
outOrder.OrderStatus = OutOrderStatus.;
outOrder.OutOrderExeStatus = OutOrderExeStatus.;
}
#endregion
DbHelp.db.Updateable(outOrder).ExecuteCommand();
}
});
}
return new ResponseCommon()
{
Code = 200,
Message = $"Success",
Data = request.SnList
};
}
catch (Exception ex)
{
DbHelp.db.RollbackTran();
Logs.Write($"同步出库单据发生异常{ex.Message}", LogsType.Info);
return new ResponseCommon()
{
Code = 201,
Message = $"保存出库单失败!{ex.Message}",
Data = request.SnList
};
}
}
}
@ -887,7 +1047,7 @@ namespace WCS.BLL.Services.Service
t.GoOutOutstore();
});
return new ResponseCommon()
{