diff --git a/DOAN.Admin.WebApi/Controllers/MES/Quality/IPQC/QcScrapRecordsController.cs b/DOAN.Admin.WebApi/Controllers/MES/Quality/IPQC/QcScrapRecordsController.cs index 04d48fd..27b47e6 100644 --- a/DOAN.Admin.WebApi/Controllers/MES/Quality/IPQC/QcScrapRecordsController.cs +++ b/DOAN.Admin.WebApi/Controllers/MES/Quality/IPQC/QcScrapRecordsController.cs @@ -1,8 +1,8 @@ -using Microsoft.AspNetCore.Mvc; -using DOAN.Model.BZFM.Dto; -using DOAN.Model.BZFM; -using DOAN.Service.BZFM.IService; using DOAN.Admin.WebApi.Filters; +using DOAN.Model.BZFM; +using DOAN.Model.BZFM.Dto; +using DOAN.Service.BZFM.IService; +using Microsoft.AspNetCore.Mvc; //创建时间:2026-01-22 namespace DOAN.Admin.WebApi.Controllers.BZFM @@ -37,7 +37,6 @@ namespace DOAN.Admin.WebApi.Controllers.BZFM return SUCCESS(response); } - /// /// 查询报废记录表详情 /// @@ -142,9 +141,16 @@ namespace DOAN.Admin.WebApi.Controllers.BZFM [HttpPut("approve/{id}")] [ActionPermissionFilter(Permission = "qcscraprecords:approve")] [Log(Title = "审批报废记录", BusinessType = BusinessType.UPDATE)] - public IActionResult ApproveScrapRecord([FromRoute] long id, [FromBody] ScrapApproveDto parm) + public IActionResult ApproveScrapRecord( + [FromRoute] long id, + [FromBody] ScrapApproveDto parm + ) { - var response = _QcScrapRecordsService.ApproveScrapRecord(id, parm.IsApproved, parm.Approver); + var response = _QcScrapRecordsService.ApproveScrapRecord( + id, + parm.IsApproved, + parm.Approver + ); return ToResponse(response); } @@ -190,14 +196,21 @@ namespace DOAN.Admin.WebApi.Controllers.BZFM [Log(Title = "根据工单号创建报废单", BusinessType = BusinessType.INSERT)] public IActionResult CreateScrapOrderByWorkorder([FromBody] QcScrapRecordsDto parm) { - if (string.IsNullOrEmpty(parm.Workorder)) + try { - return ToResponse(StatusCodes.Status400BadRequest, "工单号不能为空"); - } + if (string.IsNullOrEmpty(parm.Workorder)) + { + return ToResponse(StatusCodes.Status400BadRequest, "工单号不能为空"); + } - var modal = parm.Adapt().ToCreate(HttpContext); - var response = _QcScrapRecordsService.CreateScrapOrderByWorkorder(modal); - return SUCCESS(response); + var modal = parm.Adapt().ToCreate(HttpContext); + var response = _QcScrapRecordsService.CreateScrapOrderByWorkorder(modal); + return SUCCESS(response); + } + catch (Exception ex) + { + return ToResponse(StatusCodes.Status500InternalServerError, ex.Message); + } } /// @@ -210,14 +223,21 @@ namespace DOAN.Admin.WebApi.Controllers.BZFM [Log(Title = "根据工单号创建转用单", BusinessType = BusinessType.INSERT)] public IActionResult CreateTransferOrderByWorkorder([FromBody] QcScrapRecordsDto parm) { - if (string.IsNullOrEmpty(parm.Workorder)) + try { - return ToResponse(StatusCodes.Status400BadRequest, "工单号不能为空"); - } + if (string.IsNullOrEmpty(parm.Workorder)) + { + return ToResponse(StatusCodes.Status400BadRequest, "工单号不能为空"); + } - var modal = parm.Adapt().ToCreate(HttpContext); - var response = _QcScrapRecordsService.CreateTransferOrderByWorkorder(modal); - return SUCCESS(response); + var modal = parm.Adapt().ToCreate(HttpContext); + var response = _QcScrapRecordsService.CreateTransferOrderByWorkorder(modal); + return SUCCESS(response); + } + catch (Exception ex) + { + return ToResponse(StatusCodes.Status500InternalServerError, ex.Message); + } } /// @@ -230,8 +250,25 @@ namespace DOAN.Admin.WebApi.Controllers.BZFM [Log(Title = "根据ID撤销不良品记录", BusinessType = BusinessType.UPDATE)] public IActionResult RevokeScrapRecordById([FromRoute] long id) { - var response = _QcScrapRecordsService.RevokeScrapRecordById(id); - return ToResponse(response); + try + { + var response = _QcScrapRecordsService.RevokeScrapRecordById(id); + if (response > 0) + { + return SUCCESS(response); + } + else + { + return ToResponse( + StatusCodes.Status400BadRequest, + "撤销不良品记录失败,可能记录已被审批或不存在" + ); + } + } + catch (Exception ex) + { + return ToResponse(StatusCodes.Status500InternalServerError, ex.Message); + } } } -} \ No newline at end of file +} diff --git a/DOAN.Model/MES/Quality/IPQC/Dto/QcScrapRecordsDto.cs b/DOAN.Model/MES/Quality/IPQC/Dto/QcScrapRecordsDto.cs index 62159b9..ff6c6ab 100644 --- a/DOAN.Model/MES/Quality/IPQC/Dto/QcScrapRecordsDto.cs +++ b/DOAN.Model/MES/Quality/IPQC/Dto/QcScrapRecordsDto.cs @@ -26,77 +26,178 @@ namespace DOAN.Model.BZFM.Dto /// public class QcScrapRecordsDto { - public string WorkStation { get; set; } + /// + /// 主键 ID + /// + public long Id { get; set; } - public int? Version { get; set; } - - public long? TenantId { get; set; } - - public DateTime? UpdatedTime { get; set; } - - public long? UpdatedBy { get; set; } - - public DateTime? CreatedTime { get; set; } - - public long CreatedBy { get; set; } - - public string Remark { get; set; } - - public string LocationCode { get; set; } - - public decimal CostImpact { get; set; } - - public string QualityInspector { get; set; } - - public string Status { get; set; } - - public DateTime? ApprovalDate { get; set; } + /// + /// 报废单号 + /// + public string ScrapOrderNo { get; set; } + /// + /// 报废日期 + /// [Required(ErrorMessage = "报废日期不能为空")] public DateTime? ScrapDate { get; set; } - public string SupervisorName { get; set; } - - public string Operator { get; set; } - - public long Id { get; set; } - - public string DisposalMethod { get; set; } - - public string ScrapType { get; set; } - - public string ScrapReason { get; set; } - - public string Unit { get; set; } - + /// + /// 报废数量 + /// [Required(ErrorMessage = "报废数量不能为空")] public decimal ScrapQuantity { get; set; } - public string BatchNo { get; set; } + /// + /// 计量单位 + /// + public string Unit { get; set; } - public string MaterialName { get; set; } + /// + /// 处置方式 + /// + public string DisposalMethod { get; set; } + /// + /// 报废类型 + /// + public string ScrapType { get; set; } + + /// + /// 报废原因说明 + /// + public string ScrapReason { get; set; } + + /// + /// 成本影响 + /// + public decimal CostImpact { get; set; } + + /// + /// 当前记录状态(如草稿/待审批/...) + /// + public string Status { get; set; } + + /// + /// 状态标签(用于导出 Excel 显示) + /// + [ExcelColumn(Name = "状态:草稿,待审批,已批准,已拒绝")] + public string StatusLabel { get; set; } + + /// + /// 物料编码 + /// [Required(ErrorMessage = "物料编码不能为空")] public string MaterialCode { get; set; } - public string ProductName { get; set; } + /// + /// 物料名称 + /// + public string MaterialName { get; set; } + /// + /// 产品编码 + /// public string ProductCode { get; set; } + /// + /// 产品名称 + /// + public string ProductName { get; set; } + + /// + /// 批次号 + /// + public string BatchNo { get; set; } + + /// + /// 炉号/批次标识 + /// public string StoveCode { get; set; } + /// + /// 线别编码 + /// public string LineCode { get; set; } + /// + /// 库位编码 + /// + public string LocationCode { get; set; } + + /// + /// 工单号 + /// public string Workorder { get; set; } - public string ScrapOrderNo { get; set; } - + /// + /// 供应商编码 + /// public string SupplierCode { get; set; } - + + /// + /// 供应商名称 + /// public string SupplierName { get; set; } + /// + /// 操作人 + /// + public string Operator { get; set; } - [ExcelColumn(Name = "状态:草稿,待审批,已批准,已拒绝")] - public string StatusLabel { get; set; } + /// + /// 质检员 + /// + public string QualityInspector { get; set; } + + /// + /// 班组长/主管 + /// + public string SupervisorName { get; set; } + + /// + /// 审批日期 + /// + public DateTime? ApprovalDate { get; set; } + + /// + /// 备注 + /// + public string Remark { get; set; } + + /// + /// 记录创建者(用户 ID) + /// + public long CreatedBy { get; set; } + + /// + /// 记录创建时间 + /// + public DateTime? CreatedTime { get; set; } + + /// + /// 最近更新者(用户 ID) + /// + public long? UpdatedBy { get; set; } + + /// + /// 最近更新时间 + /// + public DateTime? UpdatedTime { get; set; } + + /// + /// 租户 ID(多租户场景) + /// + public long? TenantId { get; set; } + + /// + /// 版本号(用于并发控制) + /// + public int? Version { get; set; } + + /// + /// 生产线/工位 + /// + public string WorkStation { get; set; } } } \ No newline at end of file diff --git a/DOAN.Model/MES/Quality/IPQC/QcScrapRecords.cs b/DOAN.Model/MES/Quality/IPQC/QcScrapRecords.cs index 5ec2def..7e57549 100644 --- a/DOAN.Model/MES/Quality/IPQC/QcScrapRecords.cs +++ b/DOAN.Model/MES/Quality/IPQC/QcScrapRecords.cs @@ -1,4 +1,3 @@ - namespace DOAN.Model.BZFM { /// @@ -7,197 +6,198 @@ namespace DOAN.Model.BZFM [SugarTable("qc_scrap_records")] public class QcScrapRecords { - /// - /// 工位 - /// - [SugarColumn(ColumnName = "work_station")] - public string WorkStation { get; set; } + // Keep original fields and attributes; only adjusted order for clarity. /// - /// 版本号 - /// - public int? Version { get; set; } - - /// - /// 租户ID - /// - [SugarColumn(ColumnName = "tenant_id")] - public long? TenantId { get; set; } - - /// - /// 更新时间 - /// - [SugarColumn(ColumnName = "updated_time")] - public DateTime? UpdatedTime { get; set; } - - /// - /// 更新人ID - /// - [SugarColumn(ColumnName = "updated_by")] - public long? UpdatedBy { get; set; } - - /// - /// 创建时间 - /// - [SugarColumn(ColumnName = "created_time")] - public DateTime? CreatedTime { get; set; } - - /// - /// 创建人ID - /// - [SugarColumn(ColumnName = "created_by")] - public long CreatedBy { get; set; } - - /// - /// 备注 - /// - public string Remark { get; set; } - - /// - /// 库存编号 - /// - [SugarColumn(ColumnName = "location_code")] - public string LocationCode { get; set; } - - /// - /// 成本影响金额 - /// - [SugarColumn(ColumnName = "cost_impact")] - public decimal CostImpact { get; set; } - - /// - /// 质检员 - /// - [SugarColumn(ColumnName = "quality_inspector")] - public string QualityInspector { get; set; } - - /// - /// 状态:草稿,待审批,已批准,已拒绝 - /// - public string Status { get; set; } - - /// - /// 审批日期 - /// - [SugarColumn(ColumnName = "approval_date")] - public DateTime? ApprovalDate { get; set; } - - /// - /// 报废日期 - /// - [SugarColumn(ColumnName = "scrap_date")] - public DateTime? ScrapDate { get; set; } - - /// - /// 审核人 - /// - [SugarColumn(ColumnName = "supervisor_name")] - public string SupervisorName { get; set; } - - /// - /// 操作员 - /// - public string Operator { get; set; } - - /// - /// 主键ID + /// 主键ID /// [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public long Id { get; set; } /// - /// 处置方式 + /// 报废单号 /// - [SugarColumn(ColumnName = "disposal_method")] - public string DisposalMethod { get; set; } + [SugarColumn(ColumnName = "scrap_order_no")] + public string ScrapOrderNo { get; set; } /// - /// 报废类型:质量缺陷,过期,损坏,工艺错误,其他 + /// 报废日期 /// - [SugarColumn(ColumnName = "scrap_type")] - public string ScrapType { get; set; } + [SugarColumn(ColumnName = "scrap_date")] + public DateTime? ScrapDate { get; set; } /// - /// 报废原因 - /// - [SugarColumn(ColumnName = "scrap_reason")] - public string ScrapReason { get; set; } - - /// - /// 单位 - /// - public string Unit { get; set; } - - /// - /// 报废数量 + /// 报废数量 /// [SugarColumn(ColumnName = "scrap_quantity")] public decimal ScrapQuantity { get; set; } /// - /// 批次号 + /// 单位 /// - [SugarColumn(ColumnName = "batch_no")] - public string BatchNo { get; set; } + public string Unit { get; set; } /// - /// 物料名称 + /// 处置方式 /// - [SugarColumn(ColumnName = "material_name")] - public string MaterialName { get; set; } + [SugarColumn(ColumnName = "disposal_method")] + public string DisposalMethod { get; set; } /// - /// 物料编码 + /// 报废类型 + /// + [SugarColumn(ColumnName = "scrap_type")] + public string ScrapType { get; set; } + + /// + /// 报废原因 + /// + [SugarColumn(ColumnName = "scrap_reason")] + public string ScrapReason { get; set; } + + /// + /// 成本影响金额 + /// + [SugarColumn(ColumnName = "cost_impact")] + public decimal CostImpact { get; set; } = 0.00m; + + /// + /// 当前记录状态 + /// + public string Status { get; set; } = "待审批"; + + /// + /// 审批日期 + /// + [SugarColumn(ColumnName = "approval_date")] + public DateTime? ApprovalDate { get; set; } + + /// + /// 主管/班组长 + /// + [SugarColumn(ColumnName = "supervisor_name")] + public string SupervisorName { get; set; } = string.Empty; + + /// + /// 质检员 + /// + [SugarColumn(ColumnName = "quality_inspector")] + public string QualityInspector { get; set; } = string.Empty; + + /// + /// 操作员 + /// + public string Operator { get; set; } = string.Empty; + + /// + /// 库位编码 + /// + [SugarColumn(ColumnName = "location_code")] + public string LocationCode { get; set; } = string.Empty; + + /// + /// 工位 + /// + [SugarColumn(ColumnName = "work_station")] + public string WorkStation { get; set; } = string.Empty; + + /// + /// 物料编码 /// [SugarColumn(ColumnName = "material_code")] - public string MaterialCode { get; set; } + public string MaterialCode { get; set; } = string.Empty; /// - /// 产品名称 + /// 物料名称 + /// + [SugarColumn(ColumnName = "material_name")] + public string MaterialName { get; set; } = string.Empty; + + /// + /// 产品编码 + /// + [SugarColumn(ColumnName = "product_code")] + public string ProductCode { get; set; } = string.Empty; + + /// + /// 产品名称 /// [SugarColumn(ColumnName = "product_name")] public string ProductName { get; set; } /// - /// 产品编号 + /// 批次号 /// - [SugarColumn(ColumnName = "product_code")] - public string ProductCode { get; set; } + [SugarColumn(ColumnName = "batch_no")] + public string BatchNo { get; set; } = string.Empty; /// - /// 炉号 + /// 炉号 /// [SugarColumn(ColumnName = "stove_code")] - public string StoveCode { get; set; } + public string StoveCode { get; set; } = string.Empty; /// - /// 线别 + /// 线别 /// [SugarColumn(ColumnName = "line_code")] - public string LineCode { get; set; } + public string LineCode { get; set; } = string.Empty; /// - /// 工单号 + /// 工单号 /// - public string Workorder { get; set; } + public string Workorder { get; set; } = string.Empty; /// - /// 报废单号 - /// - [SugarColumn(ColumnName = "scrap_order_no")] - public string ScrapOrderNo { get; set; } - - /// - /// 供应商编码 + /// 供应商编码 /// [SugarColumn(ColumnName = "supplier_code")] - public string SupplierCode { get; set; } - + public string SupplierCode { get; set; } = string.Empty; + /// - /// 供应商名称 + /// 供应商名称 /// [SugarColumn(ColumnName = "supplier_name")] - public string SupplierName { get; set; } + public string SupplierName { get; set; } = string.Empty; + /// + /// 备注 + /// + public string Remark { get; set; } = string.Empty; + + /// + /// 创建人ID + /// + [SugarColumn(ColumnName = "created_by")] + public long CreatedBy { get; set; } + + /// + /// 创建时间 + /// + [SugarColumn(ColumnName = "created_time")] + public DateTime? CreatedTime { get; set; } + + /// + /// 更新人ID + /// + [SugarColumn(ColumnName = "updated_by")] + public long? UpdatedBy { get; set; } + + /// + /// 更新时间 + /// + [SugarColumn(ColumnName = "updated_time")] + public DateTime? UpdatedTime { get; set; } + + /// + /// 租户ID + /// + [SugarColumn(ColumnName = "tenant_id")] + public long? TenantId { get; set; } = 0; + + /// + /// 版本号 + /// + public int? Version { get; set; } = 1; } -} \ No newline at end of file +} diff --git a/DOAN.Service/MES/Quality/IPQC/QcScrapRecordsService.cs b/DOAN.Service/MES/Quality/IPQC/QcScrapRecordsService.cs index 3608ea1..ba6b2b8 100644 --- a/DOAN.Service/MES/Quality/IPQC/QcScrapRecordsService.cs +++ b/DOAN.Service/MES/Quality/IPQC/QcScrapRecordsService.cs @@ -1,9 +1,11 @@ -using Infrastructure.Attribute; -using Infrastructure.Extensions; -using DOAN.Model.BZFM.Dto; using DOAN.Model.BZFM; +using DOAN.Model.BZFM.Dto; +using DOAN.Model.MES.product; using DOAN.Repository; using DOAN.Service.BZFM.IService; +using Infrastructure.Attribute; +using Infrastructure.Extensions; +using SqlSugar.DistributedSystem.Snowflake; namespace DOAN.Service.BZFM { @@ -24,12 +26,12 @@ namespace DOAN.Service.BZFM var response = Queryable() .Where(predicate.ToExpression()) + .OrderByDescending(it => it.CreatedTime) .ToPage(parm); return response; } - /// /// 获取详情 /// @@ -37,9 +39,7 @@ namespace DOAN.Service.BZFM /// public QcScrapRecords GetInfo(long Id) { - var response = Queryable() - .Where(x => x.Id == Id) - .First(); + var response = Queryable().Where(x => x.Id == Id).First(); return response; } @@ -82,14 +82,32 @@ namespace DOAN.Service.BZFM var predicate = Expressionable .Create() // 模糊搜索字段 - .AndIF(!string.IsNullOrEmpty(parm.ScrapOrderNo), it => it.ScrapOrderNo.Contains(parm.ScrapOrderNo)) - .AndIF(!string.IsNullOrEmpty(parm.Workorder), it => it.Workorder.Contains(parm.Workorder)) - .AndIF(!string.IsNullOrEmpty(parm.StoveCode), it => it.StoveCode.Contains(parm.StoveCode)) - .AndIF(!string.IsNullOrEmpty(parm.ProductCode), it => it.ProductCode.Contains(parm.ProductCode)) + .AndIF( + !string.IsNullOrEmpty(parm.ScrapOrderNo), + it => it.ScrapOrderNo.Contains(parm.ScrapOrderNo) + ) + .AndIF( + !string.IsNullOrEmpty(parm.Workorder), + it => it.Workorder.Contains(parm.Workorder) + ) + .AndIF( + !string.IsNullOrEmpty(parm.StoveCode), + it => it.StoveCode.Contains(parm.StoveCode) + ) + .AndIF( + !string.IsNullOrEmpty(parm.ProductCode), + it => it.ProductCode.Contains(parm.ProductCode) + ) .AndIF(!string.IsNullOrEmpty(parm.BatchNo), it => it.BatchNo.Contains(parm.BatchNo)) // 精确搜索字段 - .AndIF(!string.IsNullOrEmpty(parm.MaterialCode), it => it.MaterialCode == parm.MaterialCode) - .AndIF(!string.IsNullOrEmpty(parm.SupplierCode), it => it.SupplierCode == parm.SupplierCode) + .AndIF( + !string.IsNullOrEmpty(parm.MaterialCode), + it => it.MaterialCode == parm.MaterialCode + ) + .AndIF( + !string.IsNullOrEmpty(parm.SupplierCode), + it => it.SupplierCode == parm.SupplierCode + ) .AndIF(!string.IsNullOrEmpty(parm.ScrapType), it => it.ScrapType == parm.ScrapType) .AndIF(!string.IsNullOrEmpty(parm.LineCode), it => it.LineCode == parm.LineCode) .AndIF(!string.IsNullOrEmpty(parm.Status), it => it.Status == parm.Status); @@ -143,20 +161,52 @@ namespace DOAN.Service.BZFM /// public QcScrapRecords CreateScrapOrder(QcScrapRecords parm) { - // 验证物料编码 - if (string.IsNullOrEmpty(parm.MaterialCode)) + try { - throw new Exception("物料编码不能为空"); + QcScrapRecords newQcScrapRecords = parm; + var workorderInfo = Context + .Queryable() + .Where(x => x.Workorder == parm.Workorder) + .First(); + // 工单号创建,根据工单信息填充报废单的相关字段 + if (workorderInfo != null) + { + newQcScrapRecords.ProductCode = workorderInfo.productionCode; + newQcScrapRecords.ProductName = workorderInfo.productionName; + newQcScrapRecords.LineCode = workorderInfo.RouteCode; + newQcScrapRecords.StoveCode = workorderInfo.StoveCode; + newQcScrapRecords.BatchNo = workorderInfo.FeedOrder; + newQcScrapRecords.MaterialCode = workorderInfo.MaterialCode; + newQcScrapRecords.MaterialName = workorderInfo.MaterialName; + // 如有领料记录,则绑定采购记录 + var purchaseInfo = Context + .Queryable() + .Where(it => it.BatchNo == workorderInfo.FeedOrder) + .Where(it => it.TransactionType == "采购入库") + .Where(it => it.Remarks != "已撤销") + .First(); + if (purchaseInfo != null) + { + newQcScrapRecords.SupplierCode = purchaseInfo.SupplierCode; + newQcScrapRecords.SupplierName = purchaseInfo.SupplierName; + newQcScrapRecords.StoveCode = purchaseInfo.StoveCode; + newQcScrapRecords.Unit = purchaseInfo.Unit; + } + } + // 生成报废单号 + newQcScrapRecords.ScrapOrderNo = GenerateScrapOrderNo(); + + // 设置状态为待审批 + newQcScrapRecords.Status = "待审批"; + newQcScrapRecords.ScrapType = "报废"; + newQcScrapRecords.TenantId = 0; + newQcScrapRecords.Version = 1; + return Context.Insertable(newQcScrapRecords).ExecuteReturnEntity(); + } + catch (Exception ex) + { + throw new Exception(ex.Message); } - - // 生成报废单号 - parm.ScrapOrderNo = GenerateScrapOrderNo(); - - // 设置状态为待审批 - parm.Status = "待审批"; - parm.ScrapType = "报废"; - - return Context.Insertable(parm).ExecuteReturnEntity(); } /// @@ -166,26 +216,51 @@ namespace DOAN.Service.BZFM /// public QcScrapRecords CreateTransferOrder(QcScrapRecords parm) { - // 验证物料编码 - if (string.IsNullOrEmpty(parm.MaterialCode)) - { - throw new Exception("物料编码不能为空"); - } - // 验证工单号 if (string.IsNullOrEmpty(parm.Workorder)) { throw new Exception("工单号不能为空"); } + QcScrapRecords newQcScrapRecords = parm; + var workorderInfo = Context + .Queryable() + .Where(x => x.Workorder == parm.Workorder) + .First(); + // 工单号创建,根据工单信息填充报废单的相关字段 + if (workorderInfo != null) + { + newQcScrapRecords.ProductCode = workorderInfo.productionCode; + newQcScrapRecords.ProductName = workorderInfo.productionName; + newQcScrapRecords.LineCode = workorderInfo.RouteCode; + newQcScrapRecords.StoveCode = workorderInfo.StoveCode; + newQcScrapRecords.BatchNo = workorderInfo.FeedOrder; + newQcScrapRecords.MaterialCode = workorderInfo.MaterialCode; + newQcScrapRecords.MaterialName = workorderInfo.MaterialName; + // 如有领料记录,则绑定采购记录 + var purchaseInfo = Context + .Queryable() + .Where(it => it.BatchNo == workorderInfo.FeedOrder) + .Where(it => it.TransactionType == "采购入库") + .Where(it => it.Remarks != "已撤销") + .First(); + if (purchaseInfo != null) + { + newQcScrapRecords.SupplierCode = purchaseInfo.SupplierCode; + newQcScrapRecords.SupplierName = purchaseInfo.SupplierName; + newQcScrapRecords.StoveCode = purchaseInfo.StoveCode; + newQcScrapRecords.Unit = purchaseInfo.Unit; + } + } - // 生成报废单号 - parm.ScrapOrderNo = GenerateScrapOrderNo("ZY"); // ZY表示转用 + // 生成单号 + newQcScrapRecords.ScrapOrderNo = GenerateScrapOrderNo("ZY"); // ZY表示转用 - // 设置状态为待审批,报废类型为转用 - parm.Status = "待审批"; - parm.ScrapType = "转用"; - - return Context.Insertable(parm).ExecuteReturnEntity(); + // 设置状态为待审批,类型为转用 + newQcScrapRecords.Status = "待审批"; + newQcScrapRecords.ScrapType = "转用"; + newQcScrapRecords.TenantId = 0; + newQcScrapRecords.Version = 1; + return Context.Insertable(newQcScrapRecords).ExecuteReturnEntity(); } /// @@ -222,10 +297,19 @@ namespace DOAN.Service.BZFM Status = isApproved ? "已批准" : "已拒绝", ApprovalDate = DateTime.Now, SupervisorName = approver, - UpdatedTime = DateTime.Now + UpdatedTime = DateTime.Now, }; - result = Context.Updateable(updateObj).UpdateColumns(x => new { x.Status, x.ApprovalDate, x.SupervisorName, x.UpdatedTime }).ExecuteCommand(); + result = Context + .Updateable(updateObj) + .UpdateColumns(x => new + { + x.Status, + x.ApprovalDate, + x.SupervisorName, + x.UpdatedTime, + }) + .ExecuteCommand(); if (isApproved) { @@ -235,11 +319,94 @@ namespace DOAN.Service.BZFM // 转用单批准:生成新工单(这里需要根据实际业务调整工单生成逻辑) // 注意:需要确保工单服务的命名空间和方法名正确 // 示例:_proWorkorderService.GenerateWorkorder(record); + + // 如果有工单则工单报废数增加 + if (!string.IsNullOrEmpty(record.Workorder)) + { + var workorderInfo = Context + .Queryable() + .Where(x => x.Workorder == record.Workorder) + .First(); + if (workorderInfo != null) + { + workorderInfo.DefectNum += (int)record.ScrapQuantity; + Context + .Updateable(workorderInfo) + .UpdateColumns(x => new { x.DefectNum }) + .ExecuteCommand(); + } + } + + // 入报废库 + InboundReceiptDto revokeRecepitDto = new() + { + ReceiptType = 1, + MaterialCode = record.ProductCode, + BatchNo = "000", + LocationCode = "ZYK001", + WarehouseCode = "WH005", + SupplierCode = record.SupplierCode, + StoveCode = record.StoveCode, + Workorder = record.Workorder, + WorkorderRaw = record.ScrapOrderNo, + Operator = approver, + Quantity = record.ScrapQuantity, + TransactionType = "转用入库", + Remarks = $"转用入库,转用单号:{record.ScrapOrderNo}", + }; + MmInventoryService mmInventoryService = new(); + string createReceiptresult = mmInventoryService.CreateInboundReceipt( + revokeRecepitDto + ); + if (createReceiptresult != "ok") + { + throw new Exception(createReceiptresult); + } } - else + else if (record.ScrapType == "报废") { // 报废单批准:生成入库单到报废库(这里需要根据实际业务调整入库逻辑) - // 示例:调用入库单服务添加到报废库 + // 如果有工单则工单报废数增加 + if (!string.IsNullOrEmpty(record.Workorder)) + { + var workorderInfo = Context + .Queryable() + .Where(x => x.Workorder == record.Workorder) + .First(); + if (workorderInfo != null) + { + workorderInfo.DefectNum += (int)record.ScrapQuantity; + Context + .Updateable(workorderInfo) + .UpdateColumns(x => new { x.DefectNum }) + .ExecuteCommand(); + } + } + // 调用入库单服务添加到报废库 + InboundReceiptDto revokeRecepitDto = new() + { + ReceiptType = 1, + MaterialCode = record.ProductCode, + BatchNo = "000", + LocationCode = "BFK001", + WarehouseCode = "WH006", + SupplierCode = record.SupplierCode, + StoveCode = record.StoveCode, + Workorder = record.Workorder, + WorkorderRaw = record.ScrapOrderNo, + Operator = approver, + Quantity = record.ScrapQuantity, + TransactionType = "报废入库", + Remarks = $"报废入库,报废单号:{record.ScrapOrderNo}", + }; + MmInventoryService mmInventoryService = new(); + string createReceiptresult = mmInventoryService.CreateInboundReceipt( + revokeRecepitDto + ); + if (createReceiptresult != "ok") + { + throw new Exception(createReceiptresult); + } } } }); @@ -254,29 +421,62 @@ namespace DOAN.Service.BZFM /// public int RevokeScrapRecord(long id) { - // 获取记录信息 - var record = Context.Queryable().Where(x => x.Id == id).First(); - - if (record == null) + int result = 0; + UseTran2(() => { - throw new Exception("记录不存在"); - } + // 获取记录信息 + var record = Context.Queryable().Where(x => x.Id == id).First(); - // 只有待审批状态的记录才能被撤销 - if (record.Status != "已批准") - { - throw new Exception("只有已批准状态的记录才能被撤销"); - } + if (record == null) + { + throw new Exception("记录不存在"); + } - // 撤销:将状态改为待审批 - var updateObj = new QcScrapRecords - { - Id = id, - Status = "待审批", - UpdatedTime = DateTime.Now - }; + // 只有待审批状态的记录才能被撤销 + if (record.Status != "已批准") + { + throw new Exception("只有已批准状态的记录才能被撤销"); + } + // 撤销库存操作记录与工单不良数 + var workorderInfo = Context + .Queryable() + .Where(it => it.Workorder == record.Workorder) + .First(); + if (workorderInfo != null) + { + workorderInfo.DefectNum -= (int)Math.Abs(record.ScrapQuantity); + Context + .Updateable(workorderInfo) + .UpdateColumns(it => new { it.DefectNum }) + .ExecuteCommand(); + } - return Context.Updateable(updateObj).UpdateColumns(x => new { x.Status, x.UpdatedTime }).ExecuteCommand(); + MmInventoryService mmInventoryService = new(); + int InBoundId = Context + .Queryable() + .Where(it => it.WorkorderRaw == record.ScrapOrderNo) + .Select(it => it.Id) + .First(); + if (InBoundId > 0) + { + mmInventoryService.RevokeReceipt( + new MmInventoryRevokeDto { Id = InBoundId, Type = 1 } + ); + } + // 撤销:将状态改为待审批 + var updateObj = new QcScrapRecords + { + Id = id, + Status = "待审批", + UpdatedTime = DateTime.Now, + }; + + result = Context + .Updateable(updateObj) + .UpdateColumns(x => new { x.Status, x.UpdatedTime }) + .ExecuteCommand(); + }); + return result; } /// @@ -286,12 +486,12 @@ namespace DOAN.Service.BZFM /// public PagedInfo GetQcScrapRecordsByWorkorder(string workorder) { - var queryDto = new QcScrapRecordsQueryDto - { - Workorder = workorder - }; - - return GetList(queryDto); + var queryDto = new QcScrapRecordsQueryDto { Workorder = workorder }; + var result = Context + .Queryable() + .Where(x => x.Workorder == workorder) + .ToPage(queryDto); + return result; } /// @@ -306,7 +506,6 @@ namespace DOAN.Service.BZFM { throw new Exception("工单号不能为空"); } - // 调用现有的创建报废单方法 return CreateScrapOrder(parm); } @@ -339,4 +538,4 @@ namespace DOAN.Service.BZFM return RevokeScrapRecord(id); } } -} \ No newline at end of file +} diff --git a/DOAN.Service/Mobile/ReportFlowService.cs b/DOAN.Service/Mobile/ReportFlowService.cs index 5426c41..66db150 100644 --- a/DOAN.Service/Mobile/ReportFlowService.cs +++ b/DOAN.Service/Mobile/ReportFlowService.cs @@ -96,7 +96,22 @@ public class ReportFlowService : BaseService, IReportFlowServic .Select(it => it.NickName) .First(); Worker = string.IsNullOrEmpty(NickName) ? Worker + "|异常人员|" : NickName; - + string stoveCode = stove_code; + // 检查采购记录 + var purchaseInfo = Context + .Queryable() + .Where(it => it.BatchNo == feed_order) + .Where(it => it.TransactionType == "采购入库") + .Where(it => it.Remarks != "已撤销") + .First(); + if (purchaseInfo != null) + { + stoveCode = purchaseInfo.StoveCode; + } + else + { + throw new Exception($"未找到原材料采购批号:{feed_order}"); + } Context.Ado.BeginTran(); if (Exist) {