feat(物料管理): 新增物料库存相关功能及接口
- 在MmMaterial类中添加ParentMaterialCode字段支持物料层级关系 - 扩展MmRecordOutbound类增加供应商信息字段 - 重构FeedProcessReportwork方法支持原材料工单领料和库存ID指定 - 新增物料库存查询、领料、成品入库、出货等接口 - 完善库存操作逻辑,支持根据库存ID直接操作 - 添加相关DTO类支持新功能的数据传输
This commit is contained in:
@@ -1,9 +1,16 @@
|
||||
using System.Collections.Generic;
|
||||
using DOAN.Model.BZFM;
|
||||
using DOAN.Model.MES.order;
|
||||
using DOAN.Model.MES.order.Dto;
|
||||
using DOAN.Model.MES.product;
|
||||
using DOAN.Model.MES.product.Dto;
|
||||
using DOAN.Model.Mobile.Dto;
|
||||
using DOAN.Service.MES.product.IService;
|
||||
using DOAN.Service.Mobile;
|
||||
using Infrastructure.Attribute;
|
||||
using MailKit.Search;
|
||||
using Microsoft.IdentityModel.Tokens;
|
||||
using SqlSugar.DistributedSystem.Snowflake;
|
||||
|
||||
namespace DOAN.Service.MES.product
|
||||
{
|
||||
@@ -19,7 +26,7 @@ namespace DOAN.Service.MES.product
|
||||
IProWorkorderMaterialService
|
||||
{
|
||||
/// <summary>
|
||||
/// 根据工单号查询领料清单
|
||||
/// 根据工单号查询工单已领料清单
|
||||
/// </summary>
|
||||
/// <param name="workorder">工单号</param>
|
||||
/// <returns>领料清单数据</returns>
|
||||
@@ -32,8 +39,11 @@ namespace DOAN.Service.MES.product
|
||||
.Where(it => it.Remarks != "已撤销")
|
||||
.Select(it => new MaterialTakeDto
|
||||
{
|
||||
Id = it.Id,
|
||||
MaterialCode = it.MaterialCode,
|
||||
MaterialName = it.MaterialName,
|
||||
SupplierCode = it.SupplierCode,
|
||||
SupplierName = it.SupplierName,
|
||||
BatchNo = it.BatchNo,
|
||||
Quantity = it.Quantity,
|
||||
Unit = it.Unit,
|
||||
@@ -48,7 +58,7 @@ namespace DOAN.Service.MES.product
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据工单号查询成品入库清单
|
||||
/// 根据工单号查询工单已成品入库清单
|
||||
/// </summary>
|
||||
/// <param name="workorder">工单号</param>
|
||||
/// <returns>成品入库清单数据</returns>
|
||||
@@ -61,6 +71,7 @@ namespace DOAN.Service.MES.product
|
||||
.Where(it => it.Remarks != "已撤销")
|
||||
.Select(it => new ProductStorageDto
|
||||
{
|
||||
Id = it.Id,
|
||||
MaterialCode = it.MaterialCode,
|
||||
MaterialName = it.MaterialName,
|
||||
BatchNo = it.BatchNo,
|
||||
@@ -77,7 +88,7 @@ namespace DOAN.Service.MES.product
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据工单号查询出货清单
|
||||
/// 根据工单号查询工单已出货清单
|
||||
/// </summary>
|
||||
/// <param name="workorder">工单号</param>
|
||||
/// <returns>出货清单数据</returns>
|
||||
@@ -90,6 +101,7 @@ namespace DOAN.Service.MES.product
|
||||
.Where(it => it.Remarks != "已撤销")
|
||||
.Select(it => new ShipmentDto
|
||||
{
|
||||
Id = it.Id,
|
||||
MaterialCode = it.MaterialCode,
|
||||
MaterialName = it.MaterialName,
|
||||
BatchNo = it.BatchNo,
|
||||
@@ -105,5 +117,443 @@ namespace DOAN.Service.MES.product
|
||||
.ToList();
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据工单查询物料库存接口
|
||||
/// </summary>
|
||||
/// <param name="workorder">工单号</param>
|
||||
/// <returns>物料库存信息列表</returns>
|
||||
public List<MaterialInventoryDto> GetMaterialInventoryList(string workorder)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 参数验证
|
||||
if (string.IsNullOrEmpty(workorder))
|
||||
{
|
||||
throw new ArgumentNullException(nameof(workorder), "工单号不能为空");
|
||||
}
|
||||
|
||||
var workorderInfo = Context
|
||||
.Queryable<ProWorkorder>()
|
||||
.First(it => it.Workorder == workorder);
|
||||
if (workorderInfo == null)
|
||||
{
|
||||
throw new ArgumentException("工单号不存在", nameof(workorder));
|
||||
}
|
||||
var result = new List<MaterialInventoryDto>();
|
||||
// 单原材料
|
||||
if (workorderInfo.RouteCode != "10")
|
||||
{
|
||||
var materialCode = workorderInfo.MaterialCode;
|
||||
var InventoryList = Context
|
||||
.Queryable<MmInventory>()
|
||||
.Where(it => it.MaterialCode == materialCode)
|
||||
.Where(it => it.LocationCode == "YCL001")
|
||||
.Where(it => it.CurrentQty > 0)
|
||||
.Select(it => new MaterialInventoryDto
|
||||
{
|
||||
MaterialId = it.Id,
|
||||
MaterialCode = it.MaterialCode,
|
||||
MaterialName = it.MaterialName,
|
||||
CurrentQuantity = it.CurrentQty,
|
||||
SupplierCode = it.SupplierCode,
|
||||
SupplierName = it.SupplierName,
|
||||
Unit = it.Unit,
|
||||
BatchNo = it.BatchNo,
|
||||
})
|
||||
.ToList();
|
||||
result = InventoryList;
|
||||
}
|
||||
else
|
||||
{
|
||||
//组合材料
|
||||
var bomList = Context
|
||||
.Queryable<MmMaterial>()
|
||||
.Where(it => it.ParentMaterialCode == workorderInfo.productionCode)
|
||||
.ToList();
|
||||
foreach (MmMaterial mmMaterial in bomList)
|
||||
{
|
||||
var InventoryList = Context
|
||||
.Queryable<MmInventory>()
|
||||
.Where(it => it.MaterialCode == mmMaterial.MaterialCode)
|
||||
.Where(it => it.SupplierCode == mmMaterial.SupplierCode)
|
||||
.Where(it => it.LocationCode == "YCL001" || it.LocationCode == "CP001")
|
||||
.Where(it => it.CurrentQty > 0)
|
||||
.Select(it => new MaterialInventoryDto
|
||||
{
|
||||
MaterialId = it.Id,
|
||||
MaterialCode = it.MaterialCode,
|
||||
MaterialName = it.MaterialName,
|
||||
CurrentQuantity = it.CurrentQty,
|
||||
SupplierCode = it.SupplierCode,
|
||||
SupplierName = it.SupplierName,
|
||||
Unit = it.Unit,
|
||||
BatchNo = it.BatchNo,
|
||||
})
|
||||
.ToList();
|
||||
result.AddRange(InventoryList);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 集成现有系统的日志记录
|
||||
// Log.Error("查询物料库存失败", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 工单领料接口
|
||||
/// </summary>
|
||||
/// <param name="request">领料请求参数</param>
|
||||
/// <returns>操作结果</returns>
|
||||
public bool TakeMaterial(MaterialTakeRequestDto request)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 参数验证
|
||||
if (request == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(request), "领料请求参数不能为空");
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(request.Workorder))
|
||||
{
|
||||
throw new ArgumentNullException(nameof(request.Workorder), "工单号不能为空");
|
||||
}
|
||||
|
||||
if (request.Quantity <= 0)
|
||||
{
|
||||
throw new ArgumentException("领料数量必须大于0", nameof(request.Quantity));
|
||||
}
|
||||
|
||||
var materialInventory = Context
|
||||
.Queryable<MmInventory>()
|
||||
.First(it => it.Id == request.MaterialInventoryId);
|
||||
if (materialInventory == null)
|
||||
{
|
||||
throw new ArgumentNullException(
|
||||
nameof(request.MaterialInventoryId),
|
||||
"物料库存ID查询失败"
|
||||
);
|
||||
}
|
||||
// 业务逻辑实现部分留空待后续补充
|
||||
// 此处应实现验证库存是否充足,更新库存数量,记录领料记录
|
||||
ReportFlowService _reportFlowService = new ReportFlowService();
|
||||
string workorder = request.Workorder;
|
||||
string workorderRaw = request.WorkorderRaw;
|
||||
int processId = 10;
|
||||
int finishNum = (int)request.Quantity;
|
||||
string stoveCode = request.StoveCode;
|
||||
string feedOrder = materialInventory.BatchNo;
|
||||
string worker = request.Operator;
|
||||
var result = _reportFlowService.FeedProcessReportwork(
|
||||
workorder,
|
||||
processId,
|
||||
finishNum,
|
||||
stoveCode,
|
||||
feedOrder,
|
||||
worker,
|
||||
workorderRaw,
|
||||
materialInventory.Id
|
||||
);
|
||||
// 示例返回true
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 集成现有系统的日志记录
|
||||
// Log.Error("领料操作失败", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 工单成品入库接口
|
||||
/// </summary>
|
||||
/// <param name="request">成品入库请求参数</param>
|
||||
/// <returns>操作结果</returns>
|
||||
public bool StoreProduct(ProductStorageRequestDto request)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 参数验证
|
||||
if (request == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(request), "成品入库请求参数不能为空");
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(request.Workorder))
|
||||
{
|
||||
throw new ArgumentNullException(nameof(request.Workorder), "工单号不能为空");
|
||||
}
|
||||
|
||||
if (request.Quantity <= 0)
|
||||
{
|
||||
throw new ArgumentException("成品数量必须大于0", nameof(request.Quantity));
|
||||
}
|
||||
|
||||
var workorderInfo = Context
|
||||
.Queryable<ProWorkorder>()
|
||||
.First(it => it.Workorder == request.Workorder);
|
||||
if (workorderInfo == null)
|
||||
{
|
||||
throw new ArgumentException("工单不存在", nameof(request.Workorder));
|
||||
}
|
||||
ReportFlowService _reportFlowService = new ReportFlowService();
|
||||
string workorder = request.Workorder;
|
||||
int processId = 70;
|
||||
int finishNum = (int)request.Quantity;
|
||||
int badNum = 0;
|
||||
string worker = request.Operator;
|
||||
var result = _reportFlowService.ProcessReportWork(
|
||||
workorder,
|
||||
processId,
|
||||
finishNum,
|
||||
badNum,
|
||||
worker
|
||||
);
|
||||
// 示例返回true
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 集成现有系统的日志记录
|
||||
// Log.Error("成品入库操作失败", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 工单出货接口
|
||||
/// </summary>
|
||||
/// <param name="request">出货请求参数</param>
|
||||
/// <returns>操作结果</returns>
|
||||
public bool ShipProduct(ShipmentRequestDto request)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 参数验证
|
||||
if (request == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(request), "出货请求参数不能为空");
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(request.Workorder))
|
||||
{
|
||||
throw new ArgumentNullException(nameof(request.Workorder), "工单号不能为空");
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(request.OrderId))
|
||||
{
|
||||
throw new ArgumentNullException(nameof(request.OrderId), "订单ID不能为空");
|
||||
}
|
||||
|
||||
// 业务逻辑实现部分留空待后续补充
|
||||
// 此处应实现验证库存是否充足,更新库存状态,记录出货信息
|
||||
OrderPurchase orderPurchase = Context
|
||||
.Queryable<OrderPurchase>()
|
||||
.Where(o => o.Id == request.OrderId)
|
||||
.First();
|
||||
|
||||
ReportFlowService _reportFlowService = new ReportFlowService();
|
||||
string workorder = request.Workorder;
|
||||
int processId = 90;
|
||||
int finishNum = (int)request.Quantity;
|
||||
int badNum = 0;
|
||||
string customerOrder = orderPurchase.OrderNoMes;
|
||||
string worker = request.Operator;
|
||||
var result = _reportFlowService.ShipmentProcessReportwork(
|
||||
workorder,
|
||||
processId,
|
||||
finishNum,
|
||||
badNum,
|
||||
customerOrder,
|
||||
worker
|
||||
);
|
||||
return result == 1;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 集成现有系统的日志记录
|
||||
// Log.Error("出货操作失败", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据工单号获取可领料工单清单(产成品领取半成品)
|
||||
/// </summary>
|
||||
/// <param name="workorder">工单号</param>
|
||||
/// <returns>可领料工单清单</returns>
|
||||
public List<ProWorkorderDto> GetPickableWorkordersByWorkorder(string workorder)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 参数验证
|
||||
if (string.IsNullOrEmpty(workorder))
|
||||
{
|
||||
throw new ArgumentNullException(nameof(workorder), "工单号不能为空");
|
||||
}
|
||||
|
||||
var workorderInfo = Context
|
||||
.Queryable<ProWorkorder>()
|
||||
.First(it => it.Workorder == workorder);
|
||||
if (workorderInfo == null)
|
||||
{
|
||||
throw new ArgumentException("工单不存在", nameof(workorder));
|
||||
}
|
||||
// 需要领取半成品
|
||||
if (workorderInfo.RouteCode == "10")
|
||||
{
|
||||
return Context
|
||||
.Queryable<MmRecordInbound>()
|
||||
.LeftJoin<ProWorkorder>((mri,pro)=>mri.Workorder == pro.Workorder)
|
||||
.Where((mri, pro) => mri.MaterialCode == workorderInfo.MaterialCode)
|
||||
.Where((mri, pro) => mri.TransactionType == "生产入库")
|
||||
.Where((mri, pro) => mri.Remarks != "已撤销")
|
||||
//.Where((mri, pro) => pro.ShipmentNum < pro.PlanNum)
|
||||
.OrderByDescending((mri, pro) => mri.Workorder)
|
||||
.Select(
|
||||
(mri, pro) => new ProWorkorderDto
|
||||
{
|
||||
Id = pro.Id,
|
||||
Workorder = mri.Workorder,
|
||||
productionName = mri.MaterialCode,
|
||||
productionCode = mri.MaterialName,
|
||||
MaterialCode = mri.MaterialCode,
|
||||
MaterialName = mri.MaterialName,
|
||||
ShipmentNum = pro.ShipmentNum ?? 0,
|
||||
PlanNum = pro.PlanNum ?? 0,
|
||||
Remark01 = mri.Remarks
|
||||
},
|
||||
true
|
||||
)
|
||||
.Take(30)
|
||||
.ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
// 非10线则返回库存
|
||||
|
||||
// 示例返回空列表
|
||||
return new List<ProWorkorderDto>();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 集成现有系统的日志记录
|
||||
// Log.Error("获取可领料工单清单失败", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据工单号获取可出货订单清单
|
||||
/// </summary>
|
||||
/// <param name="workorder">工单号</param>
|
||||
/// <returns>可出货订单清单</returns>
|
||||
public List<OrderPurchaseDto> GetShippableOrdersByWorkorder(string workorder)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 参数验证
|
||||
if (string.IsNullOrEmpty(workorder))
|
||||
{
|
||||
throw new ArgumentNullException(nameof(workorder), "工单号不能为空");
|
||||
}
|
||||
|
||||
var workorderInfo = Context
|
||||
.Queryable<ProWorkorder>()
|
||||
.First(it => it.Workorder == workorder);
|
||||
if (workorderInfo == null)
|
||||
{
|
||||
throw new ArgumentException("工单不存在", nameof(workorder));
|
||||
}
|
||||
var orderPurchaseList = Context
|
||||
.Queryable<OrderPurchase>()
|
||||
.Where(o => o.MaterialCode == workorderInfo.productionCode)
|
||||
.Where(it => it.Orderindicator == 0)
|
||||
.OrderBy(it => it.DeliveryDate)
|
||||
.Select(
|
||||
o => new OrderPurchaseDto
|
||||
{
|
||||
Id = o.Id,
|
||||
OrderNoMes = o.OrderNoMes,
|
||||
MaterialCode = o.MaterialCode,
|
||||
MaterialName = o.MaterialName,
|
||||
DemandQuantity = o.DemandQuantity,
|
||||
DeliveryQuantity = o.DeliveryQuantity,
|
||||
DeliveryDate = o.DeliveryDate,
|
||||
},
|
||||
true
|
||||
)
|
||||
.ToList();
|
||||
|
||||
// 示例返回空列表
|
||||
return orderPurchaseList;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 集成现有系统的日志记录
|
||||
// Log.Error("获取可出货订单清单失败", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据工单号查询成品库存
|
||||
/// </summary>
|
||||
/// <param name="workorder">工单号</param>
|
||||
/// <returns>成品库存信息列表</returns>
|
||||
public List<MaterialInventoryDto> GetProductInventoryList(string workorder)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 参数验证
|
||||
if (string.IsNullOrEmpty(workorder))
|
||||
{
|
||||
throw new ArgumentNullException(nameof(workorder), "工单号不能为空");
|
||||
}
|
||||
|
||||
var workorderInfo = Context
|
||||
.Queryable<ProWorkorder>()
|
||||
.First(it => it.Workorder == workorder);
|
||||
if (workorderInfo == null)
|
||||
{
|
||||
throw new ArgumentException("工单不存在", nameof(workorder));
|
||||
}
|
||||
var result = Context
|
||||
.Queryable<MmInventory>()
|
||||
.Where(it => it.MaterialCode == workorderInfo.productionCode)
|
||||
.Where(it => it.LocationCode == "CP001")
|
||||
.Where(it => it.CurrentQty > 0)
|
||||
.Select(it => new MaterialInventoryDto
|
||||
{
|
||||
MaterialId = it.Id,
|
||||
MaterialCode = it.MaterialCode,
|
||||
MaterialName = it.MaterialName,
|
||||
CurrentQuantity = it.CurrentQty,
|
||||
SupplierCode = it.SupplierCode,
|
||||
SupplierName = it.SupplierName,
|
||||
Unit = it.Unit,
|
||||
BatchNo = it.BatchNo,
|
||||
})
|
||||
.OrderByDescending(it => it.BatchNo)
|
||||
.Take(10)
|
||||
.ToList();
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 集成现有系统的日志记录
|
||||
// Log.Error("查询成品库存失败", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user