From dbe9dc93117cacdc33c5b70ce8afc042b0b2def2 Mon Sep 17 00:00:00 2001 From: git_rabbit Date: Wed, 25 Feb 2026 18:42:57 +0800 Subject: [PATCH] =?UTF-8?q?feat(IPQC):=20=E5=AE=8C=E5=96=84=E6=8A=A5?= =?UTF-8?q?=E5=BA=9F=E5=92=8C=E8=BD=AC=E7=94=A8=E5=8D=95=E5=A4=84=E7=90=86?= =?UTF-8?q?=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构报废和转用单创建逻辑,使用DefectApproveDto作为参数 新增批次号、处理数量和操作人字段 实现不良品出库和报废/转用入库的完整流程 --- .../Quality/IPQC/QcScrapRecordsController.cs | 43 +++-- .../MES/Quality/IPQC/Dto/ScrapApproveDto.cs | 12 ++ .../IPQC/IService/IQcScrapRecordsService.cs | 8 +- .../MES/Quality/IPQC/QcScrapRecordsService.cs | 178 ++++++++++++++++-- 4 files changed, 208 insertions(+), 33 deletions(-) diff --git a/DOAN.Admin.WebApi/Controllers/MES/Quality/IPQC/QcScrapRecordsController.cs b/DOAN.Admin.WebApi/Controllers/MES/Quality/IPQC/QcScrapRecordsController.cs index a2e8c7f..4b3402f 100644 --- a/DOAN.Admin.WebApi/Controllers/MES/Quality/IPQC/QcScrapRecordsController.cs +++ b/DOAN.Admin.WebApi/Controllers/MES/Quality/IPQC/QcScrapRecordsController.cs @@ -194,7 +194,7 @@ namespace DOAN.Admin.WebApi.Controllers.BZFM [HttpPost("scrapOrder/byWorkorder")] [ActionPermissionFilter(Permission = "qcscraprecords:add")] [Log(Title = "根据工单号创建报废单", BusinessType = BusinessType.INSERT)] - public IActionResult CreateScrapOrderByWorkorder([FromBody] QcScrapRecordsDto parm) + public IActionResult CreateScrapOrderByWorkorder([FromBody] DefectApproveDto parm) { try { @@ -202,14 +202,20 @@ namespace DOAN.Admin.WebApi.Controllers.BZFM { return ToResponse(StatusCodes.Status400BadRequest, "工单号不能为空"); } - - var modal = parm.Adapt().ToCreate(HttpContext); - var response = _QcScrapRecordsService.CreateScrapOrderByWorkorder(modal); - return SUCCESS(response); + var response = _QcScrapRecordsService.CreateScrapOrderByWorkorder(parm); + if(response == "ok") + { + return SUCCESS(response); + } + else + { + return ToResponse(new ApiResult(StatusCodes.Status500InternalServerError, response)); + } + } catch (Exception ex) { - return ToResponse(StatusCodes.Status500InternalServerError, ex.Message); + return ToResponse(new ApiResult(StatusCodes.Status500InternalServerError, ex.Message)); } } @@ -221,7 +227,7 @@ namespace DOAN.Admin.WebApi.Controllers.BZFM [HttpPost("transferOrder/byWorkorder")] [ActionPermissionFilter(Permission = "qcscraprecords:add")] [Log(Title = "根据工单号创建转用单", BusinessType = BusinessType.INSERT)] - public IActionResult CreateTransferOrderByWorkorder([FromBody] QcScrapRecordsDto parm) + public IActionResult CreateTransferOrderByWorkorder([FromBody] DefectApproveDto parm) { try { @@ -229,14 +235,19 @@ namespace DOAN.Admin.WebApi.Controllers.BZFM { return ToResponse(StatusCodes.Status400BadRequest, "工单号不能为空"); } - - var modal = parm.Adapt().ToCreate(HttpContext); - var response = _QcScrapRecordsService.CreateTransferOrderByWorkorder(modal); - return SUCCESS(response); + var response = _QcScrapRecordsService.CreateTransferOrderByWorkorder(parm); + if (response == "ok") + { + return SUCCESS(response); + } + else + { + return ToResponse(new ApiResult(StatusCodes.Status500InternalServerError, response)); + } } catch (Exception ex) { - return ToResponse(StatusCodes.Status500InternalServerError, ex.Message); + return ToResponse(new ApiResult(StatusCodes.Status500InternalServerError, ex.Message)); } } @@ -263,7 +274,7 @@ namespace DOAN.Admin.WebApi.Controllers.BZFM } catch (Exception ex) { - return ToResponse(StatusCodes.Status500InternalServerError, ex.Message); + return ToResponse(new ApiResult(StatusCodes.Status500InternalServerError, ex.Message)); } } @@ -286,15 +297,15 @@ namespace DOAN.Admin.WebApi.Controllers.BZFM } else { - return ToResponse( + return ToResponse(new ApiResult( StatusCodes.Status400BadRequest, "撤销不良品记录失败,可能记录已被审批或不存在" - ); + )); } } catch (Exception ex) { - return ToResponse(StatusCodes.Status500InternalServerError, ex.Message); + return ToResponse(new ApiResult(StatusCodes.Status500InternalServerError, ex.Message)); } } } diff --git a/DOAN.Model/MES/Quality/IPQC/Dto/ScrapApproveDto.cs b/DOAN.Model/MES/Quality/IPQC/Dto/ScrapApproveDto.cs index 178028a..5e747b0 100644 --- a/DOAN.Model/MES/Quality/IPQC/Dto/ScrapApproveDto.cs +++ b/DOAN.Model/MES/Quality/IPQC/Dto/ScrapApproveDto.cs @@ -35,5 +35,17 @@ namespace DOAN.Model.BZFM.Dto /// 工单号 /// public string Workorder { get; set; } + /// + /// 处理批次号 + /// + public string BatchNo { get; set; } + /// + /// 处理数量 + /// + public decimal ScrapQuantity { get; set; } + /// + /// 操作人 + /// + public string Operator { get; set; } } } \ No newline at end of file diff --git a/DOAN.Service/MES/Quality/IPQC/IService/IQcScrapRecordsService.cs b/DOAN.Service/MES/Quality/IPQC/IService/IQcScrapRecordsService.cs index 98df8cb..f4a5189 100644 --- a/DOAN.Service/MES/Quality/IPQC/IService/IQcScrapRecordsService.cs +++ b/DOAN.Service/MES/Quality/IPQC/IService/IQcScrapRecordsService.cs @@ -54,18 +54,18 @@ namespace DOAN.Service.BZFM.IService PagedInfo GetQcScrapRecordsByWorkorder(string workorder); /// - /// 根据工单号填写报废单 + /// 根据工单号填写报废单(入报废库) /// /// 报废单数据 /// - QcScrapRecords CreateScrapOrderByWorkorder(QcScrapRecords parm); + string CreateScrapOrderByWorkorder(DefectApproveDto parm); /// - /// 根据工单号填写转用单 + /// 根据工单号填写转用单(入转用库) /// /// 转用单数据 /// - QcScrapRecords CreateTransferOrderByWorkorder(QcScrapRecords parm); + string CreateTransferOrderByWorkorder(DefectApproveDto parm); /// /// 根据工单号填写不良品单 diff --git a/DOAN.Service/MES/Quality/IPQC/QcScrapRecordsService.cs b/DOAN.Service/MES/Quality/IPQC/QcScrapRecordsService.cs index e4a68df..4941f96 100644 --- a/DOAN.Service/MES/Quality/IPQC/QcScrapRecordsService.cs +++ b/DOAN.Service/MES/Quality/IPQC/QcScrapRecordsService.cs @@ -502,15 +502,92 @@ namespace DOAN.Service.BZFM /// /// 报废单数据 /// - public QcScrapRecords CreateScrapOrderByWorkorder(QcScrapRecords parm) + public string CreateScrapOrderByWorkorder(DefectApproveDto parm) { - // 验证工单号 - if (string.IsNullOrEmpty(parm.Workorder)) + try { - throw new Exception("工单号不能为空"); + // 验证工单号 + if (string.IsNullOrEmpty(parm.Workorder)) + { + throw new Exception("工单号不能为空"); + } + // 工单信息查看 + var workorderInfo = Context + .Queryable() + .Where(it => it.Workorder == parm.Workorder) + .First(); + if (workorderInfo == null) + { + throw new Exception($"工单信息为空{parm.Workorder}"); + } + var inboundRecordInfo = Context + .Queryable() + .Where(it => it.Id == parm.Id) + .First(); + if (inboundRecordInfo == null) + { + throw new Exception($"入库记录不存在{parm.Id}"); + } + + // 不良出库 + MmInventoryService mmInventoryService = new(); + + OutboundReceiptDto outboundRecepitDto = new() + { + ReceiptType = 1, + InventoryId = -1, + MaterialCode = inboundRecordInfo.MaterialCode, + SupplierCode = inboundRecordInfo.SupplierCode, + BatchNo = inboundRecordInfo.BatchNo, + StoveCode = inboundRecordInfo.StoveCode, + LocationCode = inboundRecordInfo.LocationCode, + WarehouseCode = inboundRecordInfo.WarehouseCode, + OrderNo = workorderInfo.CustomerOrder, + Workorder = inboundRecordInfo.Workorder, + WorkorderRaw = inboundRecordInfo.WorkorderRaw, + Operator = parm.Operator, + Quantity = parm.ScrapQuantity, + TransactionType = "不良出库", + Remarks = $"不良品报废出库,数量为{parm.ScrapQuantity}", + }; + string outboundReceiptResult = mmInventoryService.CreateOutboundReceipt( + outboundRecepitDto + ); + if (outboundReceiptResult != "ok") + { + throw new Exception(outboundReceiptResult); + } + + // 报废入库 + InboundReceiptDto inboundRecepitDto = new() + { + ReceiptType = 1, + MaterialCode = inboundRecordInfo.MaterialCode, + BatchNo = parm.BatchNo, + LocationCode = "BFK001", + WarehouseCode = "WH006", + SupplierCode = inboundRecordInfo.SupplierCode, + StoveCode = inboundRecordInfo.StoveCode, + Workorder = inboundRecordInfo.Workorder, + WorkorderRaw = inboundRecordInfo.WorkorderRaw, + Operator = parm.Operator, + Quantity = parm.ScrapQuantity, + TransactionType = "报废入库", + Remarks = $"报废入库,来源不良单号:{inboundRecordInfo.InboundNo}", + }; + string inboundReceiptresult = mmInventoryService.CreateInboundReceipt(inboundRecepitDto); + if (inboundReceiptresult != "ok") + { + throw new Exception(inboundReceiptresult); + } + inboundRecordInfo.Remarks += $"[已报废{parm.ScrapQuantity}]"; + Context.Updateable(inboundRecordInfo).UpdateColumns(it => new { it.Remarks }).ExecuteCommand(); + return "ok"; + } + catch (Exception ex) + { + throw new Exception(ex.Message); } - // 调用现有的创建报废单方法 - return CreateScrapOrder(parm); } /// @@ -518,16 +595,91 @@ namespace DOAN.Service.BZFM /// /// 转用单数据 /// - public QcScrapRecords CreateTransferOrderByWorkorder(QcScrapRecords parm) + public string CreateTransferOrderByWorkorder(DefectApproveDto parm) { - // 验证工单号 - if (string.IsNullOrEmpty(parm.Workorder)) + try { - throw new Exception("工单号不能为空"); - } + // 验证工单号 + if (string.IsNullOrEmpty(parm.Workorder)) + { + throw new Exception("工单号不能为空"); + } + // 工单信息查看 + var workorderInfo = Context + .Queryable() + .Where(it => it.Workorder == parm.Workorder) + .First(); + if (workorderInfo == null) + { + throw new Exception($"工单信息为空{parm.Workorder}"); + } + var inboundRecordInfo = Context + .Queryable() + .Where(it => it.Id == parm.Id) + .First(); + if (inboundRecordInfo == null) + { + throw new Exception($"入库记录不存在{parm.Id}"); + } + // 不良出库 + MmInventoryService mmInventoryService = new(); - // 调用现有的创建转用单方法 - return CreateTransferOrder(parm); + OutboundReceiptDto outboundRecepitDto = new() + { + ReceiptType = 1, + InventoryId = -1, + MaterialCode = inboundRecordInfo.MaterialCode, + SupplierCode = inboundRecordInfo.SupplierCode, + BatchNo = inboundRecordInfo.BatchNo, + StoveCode = inboundRecordInfo.StoveCode, + LocationCode = inboundRecordInfo.LocationCode, + WarehouseCode = inboundRecordInfo.WarehouseCode, + OrderNo = workorderInfo.CustomerOrder, + Workorder = inboundRecordInfo.Workorder, + WorkorderRaw = inboundRecordInfo.WorkorderRaw, + Operator = parm.Operator, + Quantity = parm.ScrapQuantity, + TransactionType = "不良出库", + Remarks = $"不良品报废出库,数量为{parm.ScrapQuantity}", + }; + string outboundReceiptResult = mmInventoryService.CreateOutboundReceipt( + outboundRecepitDto + ); + if (outboundReceiptResult != "ok") + { + throw new Exception(outboundReceiptResult); + } + + // 报废入库 + InboundReceiptDto inboundRecepitDto = new() + { + ReceiptType = 1, + MaterialCode = inboundRecordInfo.MaterialCode, + BatchNo = parm.BatchNo, + LocationCode = "ZYK001", + WarehouseCode = "WH005", + SupplierCode = inboundRecordInfo.SupplierCode, + StoveCode = inboundRecordInfo.StoveCode, + Workorder = inboundRecordInfo.Workorder, + WorkorderRaw = inboundRecordInfo.WorkorderRaw, + Operator = parm.Operator, + Quantity = parm.ScrapQuantity, + TransactionType = "转用入库", + Remarks = $"转用入库,来源不良单号:{inboundRecordInfo.InboundNo}", + }; + string inboundReceiptresult = mmInventoryService.CreateInboundReceipt(inboundRecepitDto); + if (inboundReceiptresult != "ok") + { + throw new Exception(inboundReceiptresult); + } + inboundRecordInfo.Remarks += $"[已转用{parm.ScrapQuantity}]"; + Context.Updateable(inboundRecordInfo).UpdateColumns(it => new { it.Remarks }).ExecuteCommand(); + return "ok"; + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } } ///