feat(报废管理): 增强报废单功能并完善相关业务逻辑
refactor(报废单): 重构报废单DTO和实体类结构 fix(报废单): 修复审批和撤销逻辑中的问题 feat(报废单): 添加工单关联和库存操作功能 style(报废单): 优化代码格式和注释
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 查询报废记录表详情
|
||||
/// </summary>
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -189,6 +195,8 @@ namespace DOAN.Admin.WebApi.Controllers.BZFM
|
||||
[ActionPermissionFilter(Permission = "qcscraprecords:add")]
|
||||
[Log(Title = "根据工单号创建报废单", BusinessType = BusinessType.INSERT)]
|
||||
public IActionResult CreateScrapOrderByWorkorder([FromBody] QcScrapRecordsDto parm)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (string.IsNullOrEmpty(parm.Workorder))
|
||||
{
|
||||
@@ -199,6 +207,11 @@ namespace DOAN.Admin.WebApi.Controllers.BZFM
|
||||
var response = _QcScrapRecordsService.CreateScrapOrderByWorkorder(modal);
|
||||
return SUCCESS(response);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return ToResponse(StatusCodes.Status500InternalServerError, ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据工单号填写转用单
|
||||
@@ -209,6 +222,8 @@ namespace DOAN.Admin.WebApi.Controllers.BZFM
|
||||
[ActionPermissionFilter(Permission = "qcscraprecords:add")]
|
||||
[Log(Title = "根据工单号创建转用单", BusinessType = BusinessType.INSERT)]
|
||||
public IActionResult CreateTransferOrderByWorkorder([FromBody] QcScrapRecordsDto parm)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (string.IsNullOrEmpty(parm.Workorder))
|
||||
{
|
||||
@@ -219,6 +234,11 @@ namespace DOAN.Admin.WebApi.Controllers.BZFM
|
||||
var response = _QcScrapRecordsService.CreateTransferOrderByWorkorder(modal);
|
||||
return SUCCESS(response);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return ToResponse(StatusCodes.Status500InternalServerError, ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据不良品记录ID撤销不良品记录
|
||||
@@ -229,9 +249,26 @@ namespace DOAN.Admin.WebApi.Controllers.BZFM
|
||||
[ActionPermissionFilter(Permission = "qcscraprecords:revoke")]
|
||||
[Log(Title = "根据ID撤销不良品记录", BusinessType = BusinessType.UPDATE)]
|
||||
public IActionResult RevokeScrapRecordById([FromRoute] long id)
|
||||
{
|
||||
try
|
||||
{
|
||||
var response = _QcScrapRecordsService.RevokeScrapRecordById(id);
|
||||
return ToResponse(response);
|
||||
if (response > 0)
|
||||
{
|
||||
return SUCCESS(response);
|
||||
}
|
||||
else
|
||||
{
|
||||
return ToResponse(
|
||||
StatusCodes.Status400BadRequest,
|
||||
"撤销不良品记录失败,可能记录已被审批或不存在"
|
||||
);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return ToResponse(StatusCodes.Status500InternalServerError, ex.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -26,77 +26,178 @@ namespace DOAN.Model.BZFM.Dto
|
||||
/// </summary>
|
||||
public class QcScrapRecordsDto
|
||||
{
|
||||
public string WorkStation { get; set; }
|
||||
/// <summary>
|
||||
/// 主键 ID
|
||||
/// </summary>
|
||||
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; }
|
||||
/// <summary>
|
||||
/// 报废单号
|
||||
/// </summary>
|
||||
public string ScrapOrderNo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 报废日期
|
||||
/// </summary>
|
||||
[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; }
|
||||
|
||||
/// <summary>
|
||||
/// 报废数量
|
||||
/// </summary>
|
||||
[Required(ErrorMessage = "报废数量不能为空")]
|
||||
public decimal ScrapQuantity { get; set; }
|
||||
|
||||
public string BatchNo { get; set; }
|
||||
/// <summary>
|
||||
/// 计量单位
|
||||
/// </summary>
|
||||
public string Unit { get; set; }
|
||||
|
||||
public string MaterialName { get; set; }
|
||||
/// <summary>
|
||||
/// 处置方式
|
||||
/// </summary>
|
||||
public string DisposalMethod { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 报废类型
|
||||
/// </summary>
|
||||
public string ScrapType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 报废原因说明
|
||||
/// </summary>
|
||||
public string ScrapReason { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 成本影响
|
||||
/// </summary>
|
||||
public decimal CostImpact { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前记录状态(如草稿/待审批/...)
|
||||
/// </summary>
|
||||
public string Status { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 状态标签(用于导出 Excel 显示)
|
||||
/// </summary>
|
||||
[ExcelColumn(Name = "状态:草稿,待审批,已批准,已拒绝")]
|
||||
public string StatusLabel { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 物料编码
|
||||
/// </summary>
|
||||
[Required(ErrorMessage = "物料编码不能为空")]
|
||||
public string MaterialCode { get; set; }
|
||||
|
||||
public string ProductName { get; set; }
|
||||
/// <summary>
|
||||
/// 物料名称
|
||||
/// </summary>
|
||||
public string MaterialName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 产品编码
|
||||
/// </summary>
|
||||
public string ProductCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 产品名称
|
||||
/// </summary>
|
||||
public string ProductName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 批次号
|
||||
/// </summary>
|
||||
public string BatchNo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 炉号/批次标识
|
||||
/// </summary>
|
||||
public string StoveCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 线别编码
|
||||
/// </summary>
|
||||
public string LineCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 库位编码
|
||||
/// </summary>
|
||||
public string LocationCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 工单号
|
||||
/// </summary>
|
||||
public string Workorder { get; set; }
|
||||
|
||||
public string ScrapOrderNo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 供应商编码
|
||||
/// </summary>
|
||||
public string SupplierCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 供应商名称
|
||||
/// </summary>
|
||||
public string SupplierName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 操作人
|
||||
/// </summary>
|
||||
public string Operator { get; set; }
|
||||
|
||||
[ExcelColumn(Name = "状态:草稿,待审批,已批准,已拒绝")]
|
||||
public string StatusLabel { get; set; }
|
||||
/// <summary>
|
||||
/// 质检员
|
||||
/// </summary>
|
||||
public string QualityInspector { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 班组长/主管
|
||||
/// </summary>
|
||||
public string SupervisorName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 审批日期
|
||||
/// </summary>
|
||||
public DateTime? ApprovalDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 备注
|
||||
/// </summary>
|
||||
public string Remark { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 记录创建者(用户 ID)
|
||||
/// </summary>
|
||||
public long CreatedBy { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 记录创建时间
|
||||
/// </summary>
|
||||
public DateTime? CreatedTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 最近更新者(用户 ID)
|
||||
/// </summary>
|
||||
public long? UpdatedBy { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 最近更新时间
|
||||
/// </summary>
|
||||
public DateTime? UpdatedTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 租户 ID(多租户场景)
|
||||
/// </summary>
|
||||
public long? TenantId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 版本号(用于并发控制)
|
||||
/// </summary>
|
||||
public int? Version { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 生产线/工位
|
||||
/// </summary>
|
||||
public string WorkStation { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
namespace DOAN.Model.BZFM
|
||||
{
|
||||
/// <summary>
|
||||
@@ -7,97 +6,7 @@ namespace DOAN.Model.BZFM
|
||||
[SugarTable("qc_scrap_records")]
|
||||
public class QcScrapRecords
|
||||
{
|
||||
/// <summary>
|
||||
/// 工位
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "work_station")]
|
||||
public string WorkStation { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 版本号
|
||||
/// </summary>
|
||||
public int? Version { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 租户ID
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "tenant_id")]
|
||||
public long? TenantId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 更新时间
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "updated_time")]
|
||||
public DateTime? UpdatedTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 更新人ID
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "updated_by")]
|
||||
public long? UpdatedBy { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "created_time")]
|
||||
public DateTime? CreatedTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建人ID
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "created_by")]
|
||||
public long CreatedBy { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 备注
|
||||
/// </summary>
|
||||
public string Remark { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 库存编号
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "location_code")]
|
||||
public string LocationCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 成本影响金额
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "cost_impact")]
|
||||
public decimal CostImpact { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 质检员
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "quality_inspector")]
|
||||
public string QualityInspector { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 状态:草稿,待审批,已批准,已拒绝
|
||||
/// </summary>
|
||||
public string Status { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 审批日期
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "approval_date")]
|
||||
public DateTime? ApprovalDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 报废日期
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "scrap_date")]
|
||||
public DateTime? ScrapDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 审核人
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "supervisor_name")]
|
||||
public string SupervisorName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 操作员
|
||||
/// </summary>
|
||||
public string Operator { get; set; }
|
||||
// Keep original fields and attributes; only adjusted order for clarity.
|
||||
|
||||
/// <summary>
|
||||
/// 主键ID
|
||||
@@ -105,6 +14,29 @@ namespace DOAN.Model.BZFM
|
||||
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
|
||||
public long Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 报废单号
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "scrap_order_no")]
|
||||
public string ScrapOrderNo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 报废日期
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "scrap_date")]
|
||||
public DateTime? ScrapDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 报废数量
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "scrap_quantity")]
|
||||
public decimal ScrapQuantity { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 单位
|
||||
/// </summary>
|
||||
public string Unit { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 处置方式
|
||||
/// </summary>
|
||||
@@ -112,7 +44,7 @@ namespace DOAN.Model.BZFM
|
||||
public string DisposalMethod { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 报废类型:质量缺陷,过期,损坏,工艺错误,其他
|
||||
/// 报废类型
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "scrap_type")]
|
||||
public string ScrapType { get; set; }
|
||||
@@ -124,33 +56,68 @@ namespace DOAN.Model.BZFM
|
||||
public string ScrapReason { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 单位
|
||||
/// 成本影响金额
|
||||
/// </summary>
|
||||
public string Unit { get; set; }
|
||||
[SugarColumn(ColumnName = "cost_impact")]
|
||||
public decimal CostImpact { get; set; } = 0.00m;
|
||||
|
||||
/// <summary>
|
||||
/// 报废数量
|
||||
/// 当前记录状态
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "scrap_quantity")]
|
||||
public decimal ScrapQuantity { get; set; }
|
||||
public string Status { get; set; } = "待审批";
|
||||
|
||||
/// <summary>
|
||||
/// 批次号
|
||||
/// 审批日期
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "batch_no")]
|
||||
public string BatchNo { get; set; }
|
||||
[SugarColumn(ColumnName = "approval_date")]
|
||||
public DateTime? ApprovalDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 物料名称
|
||||
/// 主管/班组长
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "material_name")]
|
||||
public string MaterialName { get; set; }
|
||||
[SugarColumn(ColumnName = "supervisor_name")]
|
||||
public string SupervisorName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 质检员
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "quality_inspector")]
|
||||
public string QualityInspector { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 操作员
|
||||
/// </summary>
|
||||
public string Operator { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 库位编码
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "location_code")]
|
||||
public string LocationCode { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 工位
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "work_station")]
|
||||
public string WorkStation { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 物料编码
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "material_code")]
|
||||
public string MaterialCode { get; set; }
|
||||
public string MaterialCode { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 物料名称
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "material_name")]
|
||||
public string MaterialName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 产品编码
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "product_code")]
|
||||
public string ProductCode { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 产品名称
|
||||
@@ -159,45 +126,78 @@ namespace DOAN.Model.BZFM
|
||||
public string ProductName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 产品编号
|
||||
/// 批次号
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "product_code")]
|
||||
public string ProductCode { get; set; }
|
||||
[SugarColumn(ColumnName = "batch_no")]
|
||||
public string BatchNo { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 炉号
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "stove_code")]
|
||||
public string StoveCode { get; set; }
|
||||
public string StoveCode { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 线别
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "line_code")]
|
||||
public string LineCode { get; set; }
|
||||
public string LineCode { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 工单号
|
||||
/// </summary>
|
||||
public string Workorder { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 报废单号
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "scrap_order_no")]
|
||||
public string ScrapOrderNo { get; set; }
|
||||
public string Workorder { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 供应商编码
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "supplier_code")]
|
||||
public string SupplierCode { get; set; }
|
||||
public string SupplierCode { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 供应商名称
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "supplier_name")]
|
||||
public string SupplierName { get; set; }
|
||||
public string SupplierName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 备注
|
||||
/// </summary>
|
||||
public string Remark { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 创建人ID
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "created_by")]
|
||||
public long CreatedBy { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "created_time")]
|
||||
public DateTime? CreatedTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 更新人ID
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "updated_by")]
|
||||
public long? UpdatedBy { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 更新时间
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "updated_time")]
|
||||
public DateTime? UpdatedTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 租户ID
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "tenant_id")]
|
||||
public long? TenantId { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// 版本号
|
||||
/// </summary>
|
||||
public int? Version { get; set; } = 1;
|
||||
}
|
||||
}
|
||||
@@ -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<QcScrapRecords, QcScrapRecordsDto>(parm);
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取详情
|
||||
/// </summary>
|
||||
@@ -37,9 +39,7 @@ namespace DOAN.Service.BZFM
|
||||
/// <returns></returns>
|
||||
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<QcScrapRecords>()
|
||||
// 模糊搜索字段
|
||||
.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
|
||||
/// <returns></returns>
|
||||
public QcScrapRecords CreateScrapOrder(QcScrapRecords parm)
|
||||
{
|
||||
// 验证物料编码
|
||||
if (string.IsNullOrEmpty(parm.MaterialCode))
|
||||
try
|
||||
{
|
||||
throw new Exception("物料编码不能为空");
|
||||
QcScrapRecords newQcScrapRecords = parm;
|
||||
var workorderInfo = Context
|
||||
.Queryable<ProWorkorder>()
|
||||
.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<MmRecordInbound>()
|
||||
.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();
|
||||
newQcScrapRecords.ScrapOrderNo = GenerateScrapOrderNo();
|
||||
|
||||
// 设置状态为待审批
|
||||
parm.Status = "待审批";
|
||||
parm.ScrapType = "报废";
|
||||
|
||||
return Context.Insertable(parm).ExecuteReturnEntity();
|
||||
newQcScrapRecords.Status = "待审批";
|
||||
newQcScrapRecords.ScrapType = "报废";
|
||||
newQcScrapRecords.TenantId = 0;
|
||||
newQcScrapRecords.Version = 1;
|
||||
return Context.Insertable(newQcScrapRecords).ExecuteReturnEntity();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -166,26 +216,51 @@ namespace DOAN.Service.BZFM
|
||||
/// <returns></returns>
|
||||
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<ProWorkorder>()
|
||||
.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<MmRecordInbound>()
|
||||
.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();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -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<ProWorkorder>()
|
||||
.Where(x => x.Workorder == record.Workorder)
|
||||
.First();
|
||||
if (workorderInfo != null)
|
||||
{
|
||||
workorderInfo.DefectNum += (int)record.ScrapQuantity;
|
||||
Context
|
||||
.Updateable(workorderInfo)
|
||||
.UpdateColumns(x => new { x.DefectNum })
|
||||
.ExecuteCommand();
|
||||
}
|
||||
else
|
||||
}
|
||||
|
||||
// 入报废库
|
||||
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 if (record.ScrapType == "报废")
|
||||
{
|
||||
// 报废单批准:生成入库单到报废库(这里需要根据实际业务调整入库逻辑)
|
||||
// 示例:调用入库单服务添加到报废库
|
||||
// 如果有工单则工单报废数增加
|
||||
if (!string.IsNullOrEmpty(record.Workorder))
|
||||
{
|
||||
var workorderInfo = Context
|
||||
.Queryable<ProWorkorder>()
|
||||
.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);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -253,6 +420,9 @@ namespace DOAN.Service.BZFM
|
||||
/// <param name="id">记录ID</param>
|
||||
/// <returns></returns>
|
||||
public int RevokeScrapRecord(long id)
|
||||
{
|
||||
int result = 0;
|
||||
UseTran2(() =>
|
||||
{
|
||||
// 获取记录信息
|
||||
var record = Context.Queryable<QcScrapRecords>().Where(x => x.Id == id).First();
|
||||
@@ -267,16 +437,46 @@ namespace DOAN.Service.BZFM
|
||||
{
|
||||
throw new Exception("只有已批准状态的记录才能被撤销");
|
||||
}
|
||||
// 撤销库存操作记录与工单不良数
|
||||
var workorderInfo = Context
|
||||
.Queryable<ProWorkorder>()
|
||||
.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();
|
||||
}
|
||||
|
||||
MmInventoryService mmInventoryService = new();
|
||||
int InBoundId = Context
|
||||
.Queryable<MmRecordInbound>()
|
||||
.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
|
||||
UpdatedTime = DateTime.Now,
|
||||
};
|
||||
|
||||
return Context.Updateable(updateObj).UpdateColumns(x => new { x.Status, x.UpdatedTime }).ExecuteCommand();
|
||||
result = Context
|
||||
.Updateable(updateObj)
|
||||
.UpdateColumns(x => new { x.Status, x.UpdatedTime })
|
||||
.ExecuteCommand();
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -286,12 +486,12 @@ namespace DOAN.Service.BZFM
|
||||
/// <returns></returns>
|
||||
public PagedInfo<QcScrapRecordsDto> GetQcScrapRecordsByWorkorder(string workorder)
|
||||
{
|
||||
var queryDto = new QcScrapRecordsQueryDto
|
||||
{
|
||||
Workorder = workorder
|
||||
};
|
||||
|
||||
return GetList(queryDto);
|
||||
var queryDto = new QcScrapRecordsQueryDto { Workorder = workorder };
|
||||
var result = Context
|
||||
.Queryable<QcScrapRecords>()
|
||||
.Where(x => x.Workorder == workorder)
|
||||
.ToPage<QcScrapRecords, QcScrapRecordsDto>(queryDto);
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -306,7 +506,6 @@ namespace DOAN.Service.BZFM
|
||||
{
|
||||
throw new Exception("工单号不能为空");
|
||||
}
|
||||
|
||||
// 调用现有的创建报废单方法
|
||||
return CreateScrapOrder(parm);
|
||||
}
|
||||
|
||||
@@ -96,7 +96,22 @@ public class ReportFlowService : BaseService<ProReportwork01>, IReportFlowServic
|
||||
.Select(it => it.NickName)
|
||||
.First();
|
||||
Worker = string.IsNullOrEmpty(NickName) ? Worker + "|异常人员|" : NickName;
|
||||
|
||||
string stoveCode = stove_code;
|
||||
// 检查采购记录
|
||||
var purchaseInfo = Context
|
||||
.Queryable<MmRecordInbound>()
|
||||
.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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user