Merge branch '11'
# Conflicts: # WCS.BLL/Services/Service/InstoreService.cs # WCS.BLL/Services/Service/OutstoreService.cs
This commit is contained in:
@ -1,11 +1,5 @@
|
||||
using SqlSugar;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using TouchSocket.Sockets;
|
||||
using Microsoft.Data.SqlClient;
|
||||
using SqlSugar;
|
||||
using WCS.BLL.Config;
|
||||
using WCS.BLL.DbModels;
|
||||
using WCS.BLL.Manager;
|
||||
@ -15,6 +9,7 @@ using WCS.DAL.Db;
|
||||
using WCS.DAL.DbModels;
|
||||
using WCS.Model;
|
||||
using WCS.Model.ApiModel.InOutRecord;
|
||||
using WCS.Model.ApiModel.MatInventoryDetail;
|
||||
using WCS.Model.ApiModel.OutStore;
|
||||
|
||||
namespace WCS.BLL.Services.Service
|
||||
@ -24,6 +19,53 @@ namespace WCS.BLL.Services.Service
|
||||
public OutstoreService()
|
||||
{
|
||||
|
||||
}
|
||||
public async Task<ResponseCommon<List<MatInventorySummaryModel>>> importMat(List<OutImportMatModel> list)
|
||||
{
|
||||
//数据校验
|
||||
if (list == null || list.Count == 0)
|
||||
{
|
||||
return new ResponseCommon<List<MatInventorySummaryModel>>()
|
||||
{
|
||||
Code = 201,
|
||||
Message = "导入失败:导入文件中没有内容!"
|
||||
};
|
||||
}
|
||||
//需求数量
|
||||
var errorCount = list.Where(t => t.需求数量 <= 0).ToList();
|
||||
if (errorCount != null && errorCount.Count > 0)
|
||||
{
|
||||
return new ResponseCommon<List<MatInventorySummaryModel>>()
|
||||
{
|
||||
Code = 201,
|
||||
Message = "导入失败:需求数量需要大于0!"
|
||||
};
|
||||
}
|
||||
//每一个物料进行搜索库存
|
||||
var returnList = new List<MatInventorySummaryModel>();
|
||||
foreach (var item in list)
|
||||
{
|
||||
var inventoryCount = await DbHelp.db.Queryable<InventoryDetail>()
|
||||
.Where(t => t.MatCode == item.物料编码)
|
||||
.Where(t => t.MatBatch == item.物料批次)
|
||||
.Where(t => t.IsLocked == false)
|
||||
.SumAsync(t => t.MatQty);
|
||||
var info = inventoryCount < item.需求数量 ? "库存数量小于需求数量" : string.Empty;
|
||||
returnList.Add(new MatInventorySummaryModel()
|
||||
{
|
||||
MatCode = item.物料编码,
|
||||
MatName = item.物料名称,
|
||||
MatBatch = item.物料批次,
|
||||
NeedQty = item.需求数量,
|
||||
TotalQty = inventoryCount,
|
||||
Info = info
|
||||
});
|
||||
}
|
||||
return new ResponseCommon<List<MatInventorySummaryModel>>()
|
||||
{
|
||||
Code = 200,
|
||||
Data = returnList
|
||||
};
|
||||
}
|
||||
public async Task<ResponseBase> SysOutOrderByMatCode(SysOutOrderByMatCodeRequest request)
|
||||
{
|
||||
@ -36,6 +78,24 @@ namespace WCS.BLL.Services.Service
|
||||
Message = "出库单据同步失败:缺少需要出库的物料类型!"
|
||||
};
|
||||
}
|
||||
//补齐货架类型名称
|
||||
if (string.IsNullOrEmpty(request.ShelfTypeName))
|
||||
{
|
||||
var shelfType = await DbHelp.db.Queryable<ShelfTypeInfo>()
|
||||
.Where(t => t.Id == request.ShelfTypeId)
|
||||
.FirstAsync();
|
||||
if (shelfType == null)
|
||||
{
|
||||
return new ResponseBase()
|
||||
{
|
||||
Code = 201,
|
||||
Message = $"出库单据同步失败:缺少必要参数!ShelfTypeId"
|
||||
};
|
||||
}
|
||||
else
|
||||
request.ShelfTypeName = shelfType.ShelfTypeName;
|
||||
}
|
||||
|
||||
//保存数据
|
||||
await DbHelp.db.BeginTranAsync();
|
||||
try
|
||||
@ -45,6 +105,8 @@ namespace WCS.BLL.Services.Service
|
||||
OrderNumber = request.OrderNumber,
|
||||
OrderSource = request.OrderSource,
|
||||
OrderType = request.OrderType,
|
||||
ShelfTypeId = request.ShelfTypeId,
|
||||
ShelfTypeName = request.ShelfTypeName,
|
||||
SyncType = SyncTypeEnum.ByMatCode,
|
||||
CreateUser = request.UserName,
|
||||
};
|
||||
@ -95,103 +157,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
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@ -202,7 +423,8 @@ namespace WCS.BLL.Services.Service
|
||||
var recordsQueryable = DbHelp.db.Queryable<OutOrder>()
|
||||
.WhereIF(!string.IsNullOrEmpty(request.OrderNumber), t => t.OrderNumber.Contains(request.OrderNumber))
|
||||
.WhereIF(!string.IsNullOrEmpty(request.OrderSource), t => t.OrderSource.Contains(request.OrderSource))
|
||||
.WhereIF(!string.IsNullOrEmpty(request.OrderType), t => t.OrderType.Contains(request.OrderType));
|
||||
.WhereIF(!string.IsNullOrEmpty(request.OrderType), t => t.OrderType.Contains(request.OrderType))
|
||||
.WhereIF(request.ShelfTypeId != 0, t => t.ShelfTypeId == request.ShelfTypeId);
|
||||
|
||||
var totalCount = await recordsQueryable.CountAsync();
|
||||
var records = await recordsQueryable
|
||||
@ -713,7 +935,8 @@ namespace WCS.BLL.Services.Service
|
||||
.Where(t => t.MatCode == outOrderDetail.MatCode)
|
||||
.WhereIF(!string.IsNullOrEmpty(outOrderDetail.MatBatch), t => t.MatBatch == outOrderDetail.MatBatch)
|
||||
.Where(t => t.IsLocked == false)//未锁定的物料
|
||||
.OrderBy(t => t.MatBatch)//先进先出
|
||||
.Where(t => t.StoreInfo.ShelfTypeId == order.ShelfTypeId)
|
||||
.OrderBy(t => t.MatBatch)//按批次先进先出
|
||||
//(t => t.MatQty)//零散料先出
|
||||
.ToList();
|
||||
|
||||
@ -866,6 +1089,10 @@ namespace WCS.BLL.Services.Service
|
||||
DbHelp.db.Updateable(order).ExecuteCommand();
|
||||
}
|
||||
|
||||
//解锁物料 删除物料明细
|
||||
if (order.SyncType == SyncTypeEnum.ByMatCode)
|
||||
CancelOutOrderMatDetails(order);
|
||||
|
||||
//找到正在出对应出库单的货架
|
||||
var shelves = ShelfManager.Shelves.Where(t => t.OrderNumber == request.OrderNumber)
|
||||
.Where(t => t.CurrentMode == HardWare.Mode.出库模式)
|
||||
@ -881,15 +1108,15 @@ namespace WCS.BLL.Services.Service
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
//退出出库模式
|
||||
shelves.ForEach(t =>
|
||||
{
|
||||
t.GoOutOutstore();
|
||||
});
|
||||
|
||||
//解锁物料 删除物料明细
|
||||
if (order.SyncType == SyncTypeEnum.ByMatCode)
|
||||
CancelOutOrderMatDetails(order);
|
||||
|
||||
|
||||
return new ResponseCommon()
|
||||
{
|
||||
@ -1061,11 +1288,11 @@ namespace WCS.BLL.Services.Service
|
||||
ior.OperateUser = request.userName;
|
||||
ior.OperateTime = DateTime.Now;
|
||||
//保存出库记录
|
||||
int count= DbHelp.db.Insertable(ior).ExecuteCommand();
|
||||
int count = DbHelp.db.Insertable(ior).ExecuteCommand();
|
||||
//删除库存
|
||||
DbHelp.db.Deleteable<InventoryDetail>().Where(it => it.MatSN == request.MatSn).ExecuteCommand();
|
||||
//更新需求表
|
||||
List<OutOrderDetail> odd = DbHelp.db.Queryable<OutOrderDetail>().Where(it => it.OrderNumber == request.orderNumber).Where(it=>it.MatCode==request.MatCode).ToList();
|
||||
List<OutOrderDetail> odd = DbHelp.db.Queryable<OutOrderDetail>().Where(it => it.OrderNumber == request.orderNumber).Where(it => it.MatCode == request.MatCode).ToList();
|
||||
odd[0].OutQty += request.Qty;
|
||||
DbHelp.db.Updateable(odd[0]).ExecuteCommand();
|
||||
|
||||
@ -1076,5 +1303,7 @@ namespace WCS.BLL.Services.Service
|
||||
Data = null
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user