feat(工单管理): 新增批量删除工单和批量领料功能
- 在工单DTO中增加领料数和成品在库数字段 - 实现批量删除工单功能并进行前置校验 - 实现根据工单ID批量领料功能 - 优化原材料领料外联查询显示炉号 - 修复领料查询条件忽略备注为null的记录问题
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
using Aliyun.OSS;
|
||||
using DOAN.Model.BZFM;
|
||||
using DOAN.Model.MES.order;
|
||||
using DOAN.Model.MES.order.Dto;
|
||||
@@ -9,6 +10,7 @@ using DOAN.Service.MES.product.IService;
|
||||
using DOAN.Service.Mobile;
|
||||
using Infrastructure.Attribute;
|
||||
using MailKit.Search;
|
||||
using Microsoft.Data.SqlClient;
|
||||
using Microsoft.IdentityModel.Tokens;
|
||||
using SqlSugar.DistributedSystem.Snowflake;
|
||||
using System.Collections.Generic;
|
||||
@@ -37,7 +39,7 @@ namespace DOAN.Service.MES.product
|
||||
.Queryable<MmRecordOutbound>()
|
||||
.Where(it => it.Workorder == workorder)
|
||||
.Where(it => it.TransactionType == "领料出库")
|
||||
.Where(it => it.Remarks != "已撤销")
|
||||
.Where(it => it.Remarks != "已撤销" || it.Remarks == null)
|
||||
//.WhereIF(isHideZero, it => it != "已撤销")
|
||||
.Select(it => new MaterialTakeDto
|
||||
{
|
||||
@@ -88,7 +90,7 @@ namespace DOAN.Service.MES.product
|
||||
.Queryable<MmRecordInbound>()
|
||||
.Where(it => it.Workorder == workorder)
|
||||
.Where(it => it.TransactionType == "生产入库")
|
||||
.Where(it => it.Remarks != "已撤销")
|
||||
.Where(it => it.Remarks != "已撤销" || it.Remarks == null)
|
||||
.Select(it => new ProductStorageDto
|
||||
{
|
||||
Id = it.Id,
|
||||
@@ -119,7 +121,7 @@ namespace DOAN.Service.MES.product
|
||||
.Queryable<MmRecordOutbound>()
|
||||
.Where(it => it.Workorder == workorder)
|
||||
.Where(it => it.TransactionType == "出货出库")
|
||||
.Where(it => it.Remarks != "已撤销")
|
||||
.Where(it => it.Remarks != "已撤销" || it.Remarks == null)
|
||||
.Select(it => new ShipmentDto
|
||||
{
|
||||
Id = it.Id,
|
||||
@@ -271,7 +273,7 @@ namespace DOAN.Service.MES.product
|
||||
.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) => mri.Remarks != "已撤销" || mri.Remarks == null)
|
||||
//.Where((mri, pro) => pro.ShipmentNum < pro.PlanNum)
|
||||
.OrderByDescending((mri, pro) => mri.Workorder)
|
||||
.Select(
|
||||
@@ -476,6 +478,7 @@ namespace DOAN.Service.MES.product
|
||||
);
|
||||
// 示例返回true
|
||||
return result;
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -485,6 +488,122 @@ namespace DOAN.Service.MES.product
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 工单批量领料
|
||||
/// </summary>
|
||||
/// <param name="parm"></param>
|
||||
/// <returns></returns>
|
||||
public int BatchTakeMaterialByIds(WorkOrderBatchDto parm)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 删除参数校验
|
||||
if (parm == null)
|
||||
{
|
||||
throw new Exception("传入参数parm为空");
|
||||
}
|
||||
List<string> workorderIds = parm.Ids;
|
||||
if (workorderIds.Count == 0)
|
||||
{
|
||||
throw new Exception("传入参数Ids为空,无修改工单");
|
||||
}
|
||||
// 检查是否有采购记录
|
||||
var inboundRecordInfo = Context.Queryable<MmRecordInbound>()
|
||||
.Where(it => it.BatchNo == parm.BatchNo)
|
||||
.Where(it => it.TransactionType == "采购入库")
|
||||
.Where(it => it.Remarks != "已撤销" || it.Remarks == null)
|
||||
.First();
|
||||
if (inboundRecordInfo == null)
|
||||
{
|
||||
throw new Exception($"批次号{parm.BatchNo}无对应采购记录,请检查");
|
||||
}
|
||||
// 批量领料业务
|
||||
int result = 0;
|
||||
string standardMaterialCode = string.Empty;
|
||||
// 业务处理前校验
|
||||
List<ProWorkorder> batchTakeMaterialWorkOrderList = new();
|
||||
foreach (string workOrderId in workorderIds)
|
||||
{
|
||||
ProWorkorder workOrderInfo = Context
|
||||
.Queryable<ProWorkorder>()
|
||||
.Where(it => it.Id == workOrderId)
|
||||
.First();
|
||||
if (workOrderInfo == null || string.IsNullOrEmpty(workOrderInfo.Workorder))
|
||||
{
|
||||
throw new Exception($"工单异常{workOrderId},未找到工单");
|
||||
}
|
||||
if(workOrderInfo.RouteCode == "10")
|
||||
{
|
||||
throw new Exception("10线工单不可批量领料");
|
||||
}
|
||||
if (string.IsNullOrEmpty(standardMaterialCode))
|
||||
{
|
||||
standardMaterialCode = workOrderInfo.MaterialCode;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(standardMaterialCode != workOrderInfo.MaterialCode)
|
||||
{
|
||||
throw new Exception($"工单{workOrderInfo.Workorder}原材料与上一个工单不一致,上一个工单{standardMaterialCode}");
|
||||
}
|
||||
}
|
||||
string workOrder = workOrderInfo.Workorder;
|
||||
// 是否有领料记录
|
||||
bool hasOutMaterialRecord = Context.Queryable<MmRecordOutbound>()
|
||||
.Where(it => it.Workorder == workOrder)
|
||||
.Where(it => it.TransactionType == "领料出库")
|
||||
.Where(it => it.Remarks != "已撤销" || it.Remarks == null)
|
||||
.Any();
|
||||
if (hasOutMaterialRecord)
|
||||
{
|
||||
throw new Exception($"该工单{workOrder}已存在领料记录,无法再次领料");
|
||||
}
|
||||
batchTakeMaterialWorkOrderList.Add(workOrderInfo);
|
||||
}
|
||||
if(batchTakeMaterialWorkOrderList.Count == 0)
|
||||
{
|
||||
throw new Exception($"待领料工单数量异常");
|
||||
}
|
||||
// 检查库存容量是否足够
|
||||
var inventoryInfo = Context.Queryable<MmInventory>()
|
||||
.Where(it => it.BatchNo == parm.BatchNo)
|
||||
.Where(it => it.MaterialCode == batchTakeMaterialWorkOrderList[0].MaterialCode)
|
||||
.Where(it => it.LocationCode == "YCL001")
|
||||
.First();
|
||||
if (inventoryInfo.CurrentQty < batchTakeMaterialWorkOrderList.Count * parm.Quantity)
|
||||
{
|
||||
throw new Exception($"该批次库存数不足,目前库存数{inventoryInfo.CurrentQty},需要{batchTakeMaterialWorkOrderList.Count * parm.Quantity}");
|
||||
}
|
||||
|
||||
foreach (var workorderInfo in batchTakeMaterialWorkOrderList)
|
||||
{
|
||||
MaterialTakeRequestDto takeDto = new()
|
||||
{
|
||||
Workorder = workorderInfo.Workorder,
|
||||
WorkorderRaw = string.Empty,
|
||||
Quantity = parm.Quantity,
|
||||
MaterialInventoryId = inventoryInfo.Id,
|
||||
StoveCode = inboundRecordInfo.StoveCode,
|
||||
Operator = parm.Operator
|
||||
};
|
||||
bool isOk = TakeMaterial(takeDto);
|
||||
if (isOk)
|
||||
{
|
||||
result++;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception($"领料异常结束,只成功{result}个工单");
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 工单成品入库接口
|
||||
/// </summary>
|
||||
@@ -617,5 +736,6 @@ namespace DOAN.Service.MES.product
|
||||
throw new Exception(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user