1.增加盟讯公司业务逻辑相关适配 前后端增加配置参数“ISMX”进行控制
2.前端websocket取消心跳机制(原有心跳和断线重连当服务端网线断开后需要等tcp保活期到期后才能发现重连),自己实现心跳和重连 3.前端关闭后任占用后台线程问题修复
This commit is contained in:
@ -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()
|
||||
{
|
||||
|
Reference in New Issue
Block a user