1.增加单灯出库查询物料接口

2.修改入库查询物料接口
3.货架出库单据计算物料重复问题修复
4.出库单据、盘点单据生成单据号修改为按 202406100001这种格式
This commit is contained in:
hehaibing-1996
2024-05-10 09:52:27 +08:00
parent 3c2cc27467
commit f57b79d0fc
12 changed files with 228 additions and 83 deletions

View File

@ -11,8 +11,19 @@ namespace WCS.BLL.Config
/// </summary> /// </summary>
public class JsConfig public class JsConfig
{ {
public List<string> ModuleCodePatterns { get; set; } public List<string>? ModuleCodePatterns { get; set; }
/// <summary>
/// 不同种类的物料分批次入库
/// </summary>
public bool IsSameMatCodeOut { get; set; } public bool IsSameMatCodeOut { get; set; }
/// <summary>
/// 是否接入WMS系统
/// </summary>
public bool IsAccessWMS { get; set; }
/// <summary>
/// WMS系统
/// </summary>
public string? WMSUrl { get; set; }
} }
} }

View File

@ -0,0 +1,50 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WCS.DAL.DbModels;
using WCS.Model.ApiModel.InOutRecord;
namespace WCS.BLL.DbModels
{
/// <summary>
/// 用于记录单据生成到哪个序号了
/// </summary>
[SugarTable("document_serial_number")]
public class DocumentSerialNumber
{
/// <summary>
/// 主键 自增Id
/// </summary>
[SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsNullable = false, IsIdentity = true)]
public int Id { get; set; }
/// <summary>
/// 单据类型
/// </summary>
[SugarColumn(ColumnName = "document_type", IsNullable = false, ColumnDescription = "单据类型 出库单据 = 1,\r\n盘点单据 = 2,")]
public DocumentTypeEnum DocumentType { get; set; }
/// <summary>
/// 当前单据序号
/// </summary>
[SugarColumn(ColumnName = "current_serial_number", IsNullable = false, ColumnDescription = "当前单据序号")]
public int CurrentSerialNumber { get; set; }
/// <summary>
/// 日期
/// </summary>
[SugarColumn(ColumnName = "update_date", IsNullable = false, ColumnDescription = "更新日期")]
public DateTime UpdateDate { get; set; }
}
public enum DocumentTypeEnum
{
= 1,
= 2,
}
}

View File

@ -5,6 +5,7 @@ using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using WCS.BLL.DbModels; using WCS.BLL.DbModels;
using WCS.DAL.Db; using WCS.DAL.Db;
using WCS.DAL.Db.AuthDb;
using WCS.DAL.DbModels; using WCS.DAL.DbModels;
namespace WCS.BLL.Manager namespace WCS.BLL.Manager
@ -17,9 +18,31 @@ namespace WCS.BLL.Manager
, typeof(InventoryDetail), typeof(OutOrder), typeof(OutOrderDetail), typeof(OutOrderMatDetail) , typeof(InventoryDetail), typeof(OutOrder), typeof(OutOrderDetail), typeof(OutOrderMatDetail)
, typeof(ShelfTypeInfo), typeof(MatBaseInfo), typeof(MatInfo) , typeof(ShelfTypeInfo), typeof(MatBaseInfo), typeof(MatInfo)
, typeof(StockTakingOrder), typeof(StockTakingOrderMatDetail), typeof(InOutRecord) , typeof(StockTakingOrder), typeof(StockTakingOrderMatDetail), typeof(InOutRecord)
, typeof(DocumentSerialNumber)
); );
DbHelp.dbLog.CodeFirst.InitTables(typeof(SystemApiLogRecord)); DbHelp.dbLog.CodeFirst.InitTables(typeof(SystemApiLogRecord));
//初始化单据序列号数据
if (!DbHelp.db.Queryable<DocumentSerialNumber>().Any())
{
var outDocumentSerialNumber = new DocumentSerialNumber()
{
DocumentType = DocumentTypeEnum.,
UpdateDate = DateTime.Now,
CurrentSerialNumber = 0
};
var stockTakingDocumentSerialNumber = new DocumentSerialNumber()
{
DocumentType = DocumentTypeEnum.,
UpdateDate = DateTime.Now,
CurrentSerialNumber = 0
};
DbHelp.db.Insertable(outDocumentSerialNumber).ExecuteCommand();
DbHelp.db.Insertable(stockTakingDocumentSerialNumber).ExecuteCommand();
}
} }
} }
} }

View File

@ -12,6 +12,7 @@ namespace WCS.BLL.Services.IService
public ResponseBase shelfGoInInStore(ShelfGoInInstoreRequest request); public ResponseBase shelfGoInInStore(ShelfGoInInstoreRequest request);
public ResponseBase shelfGoOutInStore(ShelfGoOutInStoreRequest request); public ResponseBase shelfGoOutInStore(ShelfGoOutInStoreRequest request);
public Task<ResponseBase> queryByMatSn(QueryByMatSnRequest request); public Task<ResponseBase> queryByMatSn(QueryByMatSnRequest request);
public Task<ResponseBase> queryByMatSnOut(QueryByMatSnRequest request);
public Task<ResponseBase> queryInstoreStatus(QueryByMatSnRequest request); public Task<ResponseBase> queryInstoreStatus(QueryByMatSnRequest request);
} }
} }

View File

@ -1,6 +1,7 @@
using SqlSugar; using SqlSugar;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Runtime; using System.Runtime;
@ -120,8 +121,8 @@ namespace WCS.BLL.Services.Service
{ {
lock (stockTakingFlag) lock (stockTakingFlag)
{ {
Thread.Sleep(1); var serialNumber = GetSerialNumber(DocumentTypeEnum.);
return "PD" + DateTime.Now.ToString("yyMMddHHmmssfff"); return "PD" + DateTime.Now.ToString("yyyyMMdd") + serialNumber.ToString().PadLeft(4, '0');
} }
} }
@ -129,9 +130,33 @@ namespace WCS.BLL.Services.Service
{ {
lock (stockTakingFlag) lock (stockTakingFlag)
{ {
Thread.Sleep(1); var serialNumber = GetSerialNumber(DocumentTypeEnum.);
return "CK" + DateTime.Now.ToString("yyMMddHHmmssfff"); return "CK" + DateTime.Now.ToString("yyyyMMdd") + serialNumber.ToString().PadLeft(4, '0');
} }
} }
public int GetSerialNumber(DocumentTypeEnum documentType)
{
var documentSerialNumber = DbHelp.db.Queryable<DocumentSerialNumber>()
.Where(t => t.DocumentType == documentType)
.First();
if (documentSerialNumber != null)
{
//如果日期不是当天
if (documentSerialNumber.UpdateDate.Date != DateTime.Now.Date)
{
documentSerialNumber.CurrentSerialNumber = 0;
documentSerialNumber.UpdateDate = DateTime.Now;
}
var serialNumber = ++documentSerialNumber.CurrentSerialNumber;
DbHelp.db.Updateable(documentSerialNumber).ExecuteCommand();
return serialNumber;
}
else
{
return 0;
}
}
} }
} }

View File

@ -122,25 +122,6 @@ namespace WCS.BLL.Services.Service
public async Task<ResponseBase> queryByMatSn(QueryByMatSnRequest request) public async Task<ResponseBase> queryByMatSn(QueryByMatSnRequest request)
{ {
//获取货架
var shelf = ShelfManager.Shelves.Where(t => t.ShelfCode == request.ShelfCode).FirstOrDefault();
if (shelf == null)//货架不存在
{
return new ResponseCommon<MatInfo>()
{
Code = 201,
Message = $"操作失败:货架[{request.ShelfCode}]不存在!",
};
}
//判断当前是否是入库模式
if (shelf.CurrentMode != Mode.)
{
return new ResponseCommon<MatInfo>()
{
Code = 201,
Message = $"操作失败:货架[{request.ShelfCode}]不在入库模式!\r\n当前为{shelf.CurrentMode}",
};
}
//判断物料是否已入库 //判断物料是否已入库
var inventory = await DbHelp.db.Queryable<InventoryDetail>().Where(t => t.MatSN == request.MatSn).FirstAsync(); var inventory = await DbHelp.db.Queryable<InventoryDetail>().Where(t => t.MatSN == request.MatSn).FirstAsync();
if (inventory != null) if (inventory != null)
@ -148,50 +129,65 @@ namespace WCS.BLL.Services.Service
return new ResponseCommon<MatInfo>() return new ResponseCommon<MatInfo>()
{ {
Code = 201, Code = 201,
Message = $"操作失败:物料{inventory.MatSN}已入库库位为{inventory.StoreCode}", Message = $"操作失败:物料{inventory.MatSN}已入库!库位为{inventory.StoreCode}",
}; };
} }
IShelfBase shelf = null;
if (!request.IsSingleLightIn)
{
//获取货架
shelf = ShelfManager.Shelves.Where(t => t.ShelfCode == request.ShelfCode).FirstOrDefault();
if (shelf == null)//货架不存在
{
return new ResponseCommon<MatInfo>()
{
Code = 201,
Message = $"操作失败:货架[{request.ShelfCode}]不存在!",
};
}
//判断当前是否是入库模式
if (shelf.CurrentMode != Mode.)
{
return new ResponseCommon<MatInfo>()
{
Code = 201,
Message = $"操作失败:货架[{request.ShelfCode}]不在入库模式!\r\n当前为{shelf.CurrentMode}",
};
}
}
#region //调用接口或者直接查询数据库 #region //调用接口或者直接查询数据库
//TODO做成配置 调用接口 //TODO做成配置 调用接口
if (1 != 1) if (LocalFile.Config.IsAccessWMS)
{ {
#region Mes接口获取物料信息 #region WMS接口获取物料信息
try try
{ {
var body = new var body = new
{ {
materialBar = request.MatSn materialBar = request.MatSn
}; };
//var Result = ApiHelp.GetDataFromHttp<ResponseCommon<List<queryByBarResponse>>>("http://192.168.2.23:9213/integrate/instock/queryBybar", body, "POST"); var Result = ApiHelp.GetDataFromHttp<ResponseCommon<List<queryByBarResponse>>>("http://192.168.2.23:9213/integrate/instock/queryBybar", body, "POST");
var Result = new ResponseCommon<List<queryByBarResponse>>()
{
Code = 200,
Data = new List<queryByBarResponse>() {new queryByBarResponse()
{
materialBar = request.MatSn,
materialCode = "100200300",
materialName = "电阻",
materialQty = 1000,
}
}
};
//查询到物料信息 //查询到物料信息
if (Result != null && Result.Code == 200 && Result.Data != null && Result.Data.Count > 0) if (Result != null && Result.Code == 200 && Result.Data != null && Result.Data.Count > 0)
{ {
var data = Result.Data.First(); var data = Result.Data.First();
shelf.InStoreData = new MatInfoResponse() if (!request.IsSingleLightIn && shelf != null)
{ shelf.InStoreData = new MatInfoResponse()
materialBar = data.materialBar, {
materialCode = data.materialCode, materialBar = data.materialBar,
materialName = data.materialName, materialCode = data.materialCode,
materialQty = data.materialQty, materialName = data.materialName,
materialSpec = data.materialSpec, materialQty = data.materialQty,
batchNo = data.batchNo, materialSpec = data.materialSpec,
supplier = "", batchNo = data.batchNo,
customer = data.materialBar, supplier = "",
customer = data.materialBar,
InstoreUser = request.UserName InstoreUser = request.UserName
}; };
var matInfo = new MatInfo() var matInfo = new MatInfo()
{ {
@ -240,26 +236,27 @@ namespace WCS.BLL.Services.Service
} }
#endregion #endregion
} }
//查询数据库 //查询数据库是否存在这个物料
else else
{ {
var matInfo = await DbHelp.db.Queryable<MatInfo>().Where(t => t.MatSn == request.MatSn).FirstAsync(); var matInfo = await DbHelp.db.Queryable<MatInfo>().Where(t => t.MatSn == request.MatSn).FirstAsync();
if (matInfo != null) if (matInfo != null)
{ {
//TODO 改成wcs的实体 //TODO 改成wcs的实体
shelf.InStoreData = new MatInfoResponse() if (!request.IsSingleLightIn && shelf != null)
{ shelf.InStoreData = new MatInfoResponse()
materialBar = matInfo.MatSn, {
materialCode = matInfo.MatCode, materialBar = matInfo.MatSn,
materialName = matInfo.MatName, materialCode = matInfo.MatCode,
materialQty = matInfo.MatQty, materialName = matInfo.MatName,
materialSpec = matInfo.MatSpec, materialQty = matInfo.MatQty,
batchNo = matInfo.MatBatch, materialSpec = matInfo.MatSpec,
supplier = matInfo.MatSupplier, batchNo = matInfo.MatBatch,
customer = matInfo.MatCustomer, supplier = matInfo.MatSupplier,
customer = matInfo.MatCustomer,
InstoreUser = request.UserName InstoreUser = request.UserName
}; };
return new ResponseCommon<MatInfo>() return new ResponseCommon<MatInfo>()
{ {
@ -276,10 +273,47 @@ namespace WCS.BLL.Services.Service
Message = $"不存在物料{request.MatSn}" Message = $"不存在物料{request.MatSn}"
}; };
} }
#endregion #endregion
} }
/// <summary>
/// 单灯出库时查询物料信息 这里返回库存的数据
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public async Task<ResponseBase> queryByMatSnOut(QueryByMatSnRequest request)
{
//判断物料是否已入库
var inventory = await DbHelp.db.Queryable<InventoryDetail>().Where(t => t.MatSN == request.MatSn).FirstAsync();
if (inventory == null)
{
return new ResponseCommon<MatInfo>()
{
Code = 201,
Message = $"操作失败:物料不在库存内,无法进行出库!",
};
}
else
{
return new ResponseCommon<MatInfo>()
{
Code = 200,
Message = $"Success",
Data = new MatInfo()
{
MatSn = inventory.MatSN,
MatCode = inventory.MatCode,
MatName = inventory.MatName,
MatBatch = inventory.MatBatch,
MatQty = inventory.MatQty,
MatSpec = inventory.MatSpec,
MatSupplier = inventory.MatSupplier,
MatCustomer = inventory.MatCustomer,
}
};
}
}
public async Task<ResponseBase> queryInstoreStatus(QueryByMatSnRequest request) public async Task<ResponseBase> queryInstoreStatus(QueryByMatSnRequest request)
{ {
//获取货架 //获取货架

View File

@ -505,20 +505,7 @@ namespace WCS.BLL.Services.Service
try try
{ {
DbHelp.db.BeginTran(); DbHelp.db.BeginTran();
//第一步 物料需求表
////第一步 删除、解锁 放在上一次结束入库时操作
//var outOrderMatDetails = DbHelp.db.Queryable<OutOrderMatDetail>()
// .Where(t => t.OrderId == order.Id)
// .ToList();
//var inventoryIds = outOrderMatDetails.Select(t => t.Id).ToList();
//var inventoryDetails = DbHelp.db.Queryable<InventoryDetail>()
// .Where(t => inventoryIds.Contains(t.Id))
// .ToList();
//inventoryDetails.ForEach(t => { t.IsLocked = false; });
//DbHelp.db.Deleteable(outOrderMatDetails).ExecuteCommand();
//DbHelp.db.Updateable(inventoryDetails).ExecuteCommand();
//第一步 找到需求物料
var outOrderDetails = DbHelp.db.Queryable<OutOrderDetail>() var outOrderDetails = DbHelp.db.Queryable<OutOrderDetail>()
.Where(t => t.OrderId == order.Id) .Where(t => t.OrderId == order.Id)
.ToList(); .ToList();
@ -538,6 +525,7 @@ namespace WCS.BLL.Services.Service
var matInventoryDetails = DbHelp.db.Queryable<InventoryDetail>() var matInventoryDetails = DbHelp.db.Queryable<InventoryDetail>()
.Where(t => t.MatCode == outOrderDetail.MatCode) .Where(t => t.MatCode == outOrderDetail.MatCode)
.WhereIF(!string.IsNullOrEmpty(outOrderDetail.MatBatch), t => t.MatBatch == outOrderDetail.MatBatch) .WhereIF(!string.IsNullOrEmpty(outOrderDetail.MatBatch), t => t.MatBatch == outOrderDetail.MatBatch)
.Where(t => t.IsLocked == false)//未锁定的物料
.OrderBy(t => t.MatBatch)//先进先出 .OrderBy(t => t.MatBatch)//先进先出
.OrderBy(t => t.MatQty)//零散料先出 .OrderBy(t => t.MatQty)//零散料先出
.ToList(); .ToList();

View File

@ -11,5 +11,7 @@ namespace WCS.Model
public string MatSn { get; set; } = string.Empty; public string MatSn { get; set; } = string.Empty;
public string ShelfCode { get; set; } = string.Empty; public string ShelfCode { get; set; } = string.Empty;
public string IpAddress { get; set; } = string.Empty; public string IpAddress { get; set; } = string.Empty;
public bool IsSingleLightIn { get; set; } = false;
} }
} }

View File

@ -92,6 +92,18 @@ namespace WebApi.Controllers
return await _instoreService.queryByMatSn(request); return await _instoreService.queryByMatSn(request);
} }
/// <summary>
/// ɨ<><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[Route("queryByMatSnOut")]
[HttpPost(Name = "queryByMatSnOut")]
public async Task<ResponseBase> queryByMatSnOut(QueryByMatSnRequest request)
{
return await _instoreService.queryByMatSnOut(request);
}
/// <summary> /// <summary>
/// <20><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>״̬ /// <20><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>״̬
/// </summary> /// </summary>

View File

@ -7,7 +7,6 @@ using WCS.Model;
namespace WebApi.Controllers namespace WebApi.Controllers
{ {
//[ServiceFilter(typeof(LogActionFilter))]
[ApiController] [ApiController]
[Route("[controller]")] [Route("[controller]")]
public class OutstoreController : ControllerBase public class OutstoreController : ControllerBase

View File

@ -117,7 +117,7 @@
<DataGridTextColumn IsReadOnly="True" Header="单据状态" Binding="{Binding OrderStatus}"></DataGridTextColumn> <DataGridTextColumn IsReadOnly="True" Header="单据状态" Binding="{Binding OrderStatus}"></DataGridTextColumn>
<DataGridTextColumn IsReadOnly="True" Header="单据执行状态" Binding="{Binding OutOrderExeStatus}"></DataGridTextColumn> <DataGridTextColumn IsReadOnly="True" Header="单据执行状态" Binding="{Binding OutOrderExeStatus}"></DataGridTextColumn>
<DataGridTextColumn IsReadOnly="True" Header="单据同步类型" Binding="{Binding SyncType}"></DataGridTextColumn> <DataGridTextColumn IsReadOnly="True" Header="单据同步类型" Binding="{Binding SyncType}"></DataGridTextColumn>
<DataGridTextColumn IsReadOnly="True" Header="创建时间" Binding="{Binding CreateTime}"></DataGridTextColumn> <DataGridTextColumn IsReadOnly="True" Header="创建时间" Binding="{Binding CreateTime,StringFormat='yyyy-MM-dd HH:mm:ss'}"></DataGridTextColumn>
<DataGridTextColumn IsReadOnly="True" Header="创建人" Binding="{Binding CreateUser}"></DataGridTextColumn> <DataGridTextColumn IsReadOnly="True" Header="创建人" Binding="{Binding CreateUser}"></DataGridTextColumn>
</DataGrid.Columns> </DataGrid.Columns>
</DataGrid> </DataGrid>

View File

@ -114,7 +114,7 @@
<DataGridTextColumn IsReadOnly="True" Header="盘点单据编号" Binding="{Binding StocktakingOrderNumber}"></DataGridTextColumn> <DataGridTextColumn IsReadOnly="True" Header="盘点单据编号" Binding="{Binding StocktakingOrderNumber}"></DataGridTextColumn>
<DataGridTextColumn IsReadOnly="True" Header="盘点单据来源" Binding="{Binding StocktakingOrderSource}"></DataGridTextColumn> <DataGridTextColumn IsReadOnly="True" Header="盘点单据来源" Binding="{Binding StocktakingOrderSource}"></DataGridTextColumn>
<DataGridTextColumn IsReadOnly="True" Header="盘点单据状态" Binding="{Binding StocktakingOrderStatus}"></DataGridTextColumn> <DataGridTextColumn IsReadOnly="True" Header="盘点单据状态" Binding="{Binding StocktakingOrderStatus}"></DataGridTextColumn>
<DataGridTextColumn IsReadOnly="True" Header="创建时间" Binding="{Binding CreateTime}"></DataGridTextColumn> <DataGridTextColumn IsReadOnly="True" Header="创建时间" Binding="{Binding CreateTime,StringFormat='yyyy-MM-dd HH:mm:ss'}"></DataGridTextColumn>
<DataGridTextColumn IsReadOnly="True" Header="创建人" Binding="{Binding CreateUser}"></DataGridTextColumn> <DataGridTextColumn IsReadOnly="True" Header="创建人" Binding="{Binding CreateUser}"></DataGridTextColumn>
</DataGrid.Columns> </DataGrid.Columns>
</DataGrid> </DataGrid>