新增BZFM物料管理相关后端接口与服务实现

本次提交为BZFM模块新增了物料管理相关的核心后端能力,包括库位、物料、物料分类、出入库记录、出入库类别等6张表的Controller、实体、DTO、Service及接口定义,实现了标准的增删改查接口,支持权限校验、AOP日志、分页查询等,完善了物料管理基础后端支撑。
This commit is contained in:
2025-12-25 12:02:03 +08:00
parent 8ef5202077
commit 4fa187e11d
30 changed files with 2057 additions and 0 deletions

View File

@@ -0,0 +1,53 @@
namespace DOAN.Model.BZFM.Dto
{
/// <summary>
/// 库位表查询对象
/// </summary>
public class MmLocationQueryDto : PagerInfo
{
}
/// <summary>
/// 库位表输入输出对象
/// </summary>
public class MmLocationDto
{
[Required(ErrorMessage = "主键ID不能为空")]
public int Id { get; set; }
[Required(ErrorMessage = "库位编码不能为空")]
public string LocationCode { get; set; }
[Required(ErrorMessage = "库位名称不能为空")]
public string LocationName { get; set; }
[Required(ErrorMessage = "仓库编码不能为空")]
public string WarehouseCode { get; set; }
public string WarehouseName { get; set; }
public string AreaCode { get; set; }
public string AreaName { get; set; }
public decimal Capacity { get; set; }
public string Unit { get; set; }
public string LocationType { get; set; }
public string Status { get; set; }
public DateTime? CreatedTime { get; set; }
public DateTime? UpdatedTime { get; set; }
public string Description { get; set; }
[ExcelColumn(Name = "库位类型(半成品/成品/临时/返工/报废)")]
public string LocationTypeLabel { get; set; }
}
}

View File

@@ -0,0 +1,42 @@
namespace DOAN.Model.BZFM.Dto
{
/// <summary>
/// 物料分类表查询对象
/// </summary>
public class MmMaterialCategoryQueryDto : PagerInfo
{
}
/// <summary>
/// 物料分类表输入输出对象
/// </summary>
public class MmMaterialCategoryDto
{
[Required(ErrorMessage = "主键ID不能为空")]
public int Id { get; set; }
[Required(ErrorMessage = "分类编码不能为空")]
public string CategoryCode { get; set; }
[Required(ErrorMessage = "分类名称不能为空")]
public string CategoryName { get; set; }
public string ParentCode { get; set; }
public int? LevelNo { get; set; }
public string Description { get; set; }
public string Status { get; set; }
public DateTime? CreatedTime { get; set; }
public DateTime? UpdatedTime { get; set; }
[ExcelColumn(Name = "状态(0/1)")]
public string StatusLabel { get; set; }
}
}

View File

@@ -0,0 +1,54 @@
namespace DOAN.Model.BZFM.Dto
{
/// <summary>
/// 物料表查询对象
/// </summary>
public class MmMaterialQueryDto : PagerInfo
{
}
/// <summary>
/// 物料表输入输出对象
/// </summary>
public class MmMaterialDto
{
[Required(ErrorMessage = "主键ID不能为空")]
public int Id { get; set; }
[Required(ErrorMessage = "物料编码不能为空")]
public string MaterialCode { get; set; }
[Required(ErrorMessage = "物料名称不能为空")]
public string MaterialName { get; set; }
public string Specification { get; set; }
public string CategoryCode { get; set; }
public string CategoryName { get; set; }
public string Unit { get; set; }
public string Type { get; set; }
public string SupplierCode { get; set; }
public string SupplierName { get; set; }
public decimal SafetyStock { get; set; }
public string Status { get; set; }
public DateTime? CreatedTime { get; set; }
public DateTime? UpdatedTime { get; set; }
public string Description { get; set; }
[ExcelColumn(Name = "物料类型(原材料/半成品/产成品/打包材料/辅料)")]
public string TypeLabel { get; set; }
}
}

View File

@@ -0,0 +1,65 @@
namespace DOAN.Model.BZFM.Dto
{
/// <summary>
/// 入库记录表查询对象
/// </summary>
public class MmRecordInboundQueryDto : PagerInfo
{
}
/// <summary>
/// 入库记录表输入输出对象
/// </summary>
public class MmRecordInboundDto
{
public string Unit { get; set; }
public DateTime? CreatedTime { get; set; }
public string Remarks { get; set; }
public string Operator { get; set; }
public string SupplierName { get; set; }
public string SupplierCode { get; set; }
public DateTime? ExpiryDate { get; set; }
public DateTime? ProductionDate { get; set; }
public string BatchNo { get; set; }
[Required(ErrorMessage = "入库类型不能为空")]
public string TransactionType { get; set; }
[Required(ErrorMessage = "主键ID不能为空")]
public int Id { get; set; }
[Required(ErrorMessage = "入库数量不能为空")]
public decimal Quantity { get; set; }
public string LocationName { get; set; }
public string LocationCode { get; set; }
public string WarehouseName { get; set; }
[Required(ErrorMessage = "仓库编码不能为空")]
public string WarehouseCode { get; set; }
public string MaterialName { get; set; }
[Required(ErrorMessage = "物料编码不能为空")]
public string MaterialCode { get; set; }
[Required(ErrorMessage = "入库单号不能为空")]
public string InboundNo { get; set; }
[ExcelColumn(Name = "入库类型")]
public string TransactionTypeLabel { get; set; }
}
}

View File

@@ -0,0 +1,59 @@
namespace DOAN.Model.BZFM.Dto
{
/// <summary>
/// 出库记录表查询对象
/// </summary>
public class MmRecordOutboundQueryDto : PagerInfo
{
}
/// <summary>
/// 出库记录表输入输出对象
/// </summary>
public class MmRecordOutboundDto
{
[Required(ErrorMessage = "主键ID不能为空")]
public int Id { get; set; }
[Required(ErrorMessage = "出库单号不能为空")]
public string OutboundNo { get; set; }
[Required(ErrorMessage = "物料编码不能为空")]
public string MaterialCode { get; set; }
public string MaterialName { get; set; }
[Required(ErrorMessage = "仓库编码不能为空")]
public string WarehouseCode { get; set; }
public string WarehouseName { get; set; }
public string LocationCode { get; set; }
public string LocationName { get; set; }
[Required(ErrorMessage = "出库数量不能为空")]
public decimal Quantity { get; set; }
public string Unit { get; set; }
[Required(ErrorMessage = "出库类型不能为空")]
public string TransactionType { get; set; }
public string BatchNo { get; set; }
public string OrderNo { get; set; }
public string Operator { get; set; }
public string Remarks { get; set; }
public DateTime? CreatedTime { get; set; }
[ExcelColumn(Name = "出库类型")]
public string TransactionTypeLabel { get; set; }
}
}

View File

@@ -0,0 +1,41 @@
namespace DOAN.Model.BZFM.Dto
{
/// <summary>
/// 出入库类别对照表查询对象
/// </summary>
public class MmTransactionTypeQueryDto : PagerInfo
{
}
/// <summary>
/// 出入库类别对照表输入输出对象
/// </summary>
public class MmTransactionTypeDto
{
[Required(ErrorMessage = "主键ID不能为空")]
public int Id { get; set; }
[Required(ErrorMessage = "类别编码不能为空")]
public string TypeCode { get; set; }
[Required(ErrorMessage = "类别名称不能为空")]
public string TypeName { get; set; }
[Required(ErrorMessage = "操作方向(入库/出库)不能为空")]
public string TransactionDirection { get; set; }
public string Description { get; set; }
public string Status { get; set; }
public DateTime? CreatedTime { get; set; }
public DateTime? UpdatedTime { get; set; }
[ExcelColumn(Name = "状态(停用/启用)")]
public string StatusLabel { get; set; }
}
}

View File

@@ -0,0 +1,91 @@
namespace DOAN.Model.BZFM
{
/// <summary>
/// 库位表
/// </summary>
[SugarTable("mm_location")]
public class MmLocation
{
/// <summary>
/// 主键ID
/// </summary>
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
/// <summary>
/// 库位编码
/// </summary>
[SugarColumn(ColumnName = "location_code")]
public string LocationCode { get; set; }
/// <summary>
/// 库位名称
/// </summary>
[SugarColumn(ColumnName = "location_name")]
public string LocationName { get; set; }
/// <summary>
/// 仓库编码
/// </summary>
[SugarColumn(ColumnName = "warehouse_code")]
public string WarehouseCode { get; set; }
/// <summary>
/// 仓库名称
/// </summary>
[SugarColumn(ColumnName = "warehouse_name")]
public string WarehouseName { get; set; }
/// <summary>
/// 区域编码
/// </summary>
[SugarColumn(ColumnName = "area_code")]
public string AreaCode { get; set; }
/// <summary>
/// 区域名称
/// </summary>
[SugarColumn(ColumnName = "area_name")]
public string AreaName { get; set; }
/// <summary>
/// 容量
/// </summary>
public decimal Capacity { get; set; }
/// <summary>
/// 容量单位
/// </summary>
public string Unit { get; set; }
/// <summary>
/// 库位类型(半成品/成品/临时/返工/报废)
/// </summary>
[SugarColumn(ColumnName = "location_type")]
public string LocationType { get; set; }
/// <summary>
/// 状态(停用/启用)
/// </summary>
public string Status { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[SugarColumn(ColumnName = "created_time")]
public DateTime? CreatedTime { get; set; }
/// <summary>
/// 更新时间
/// </summary>
[SugarColumn(ColumnName = "updated_time")]
public DateTime? UpdatedTime { get; set; }
/// <summary>
/// 描述
/// </summary>
public string Description { get; set; }
}
}

View File

@@ -0,0 +1,96 @@
namespace DOAN.Model.BZFM
{
/// <summary>
/// 物料表
/// </summary>
[SugarTable("mm_material")]
public class MmMaterial
{
/// <summary>
/// 主键ID
/// </summary>
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
/// <summary>
/// 物料编码
/// </summary>
[SugarColumn(ColumnName = "material_code")]
public string MaterialCode { get; set; }
/// <summary>
/// 物料名称
/// </summary>
[SugarColumn(ColumnName = "material_name")]
public string MaterialName { get; set; }
/// <summary>
/// 规格型号
/// </summary>
public string Specification { get; set; }
/// <summary>
/// 物料分类编码
/// </summary>
[SugarColumn(ColumnName = "category_code")]
public string CategoryCode { get; set; }
/// <summary>
/// 物料分类名称
/// </summary>
[SugarColumn(ColumnName = "category_name")]
public string CategoryName { get; set; }
/// <summary>
/// 计量单位
/// </summary>
public string Unit { get; set; }
/// <summary>
/// 物料类型(原材料/半成品/产成品/打包材料/辅料)
/// </summary>
public string Type { get; set; }
/// <summary>
/// 供应商编码
/// </summary>
[SugarColumn(ColumnName = "supplier_code")]
public string SupplierCode { get; set; }
/// <summary>
/// 供应商名称
/// </summary>
[SugarColumn(ColumnName = "supplier_name")]
public string SupplierName { get; set; }
/// <summary>
/// 安全库存
/// </summary>
[SugarColumn(ColumnName = "safety_stock")]
public decimal SafetyStock { get; set; }
/// <summary>
/// 状态(停用/启用)
/// </summary>
public string Status { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[SugarColumn(ColumnName = "created_time")]
public DateTime? CreatedTime { get; set; }
/// <summary>
/// 更新时间
/// </summary>
[SugarColumn(ColumnName = "updated_time")]
public DateTime? UpdatedTime { get; set; }
/// <summary>
/// 描述
/// </summary>
public string Description { get; set; }
}
}

View File

@@ -0,0 +1,63 @@
namespace DOAN.Model.BZFM
{
/// <summary>
/// 物料分类表
/// </summary>
[SugarTable("mm_material_category")]
public class MmMaterialCategory
{
/// <summary>
/// 主键ID
/// </summary>
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
/// <summary>
/// 分类编码
/// </summary>
[SugarColumn(ColumnName = "category_code")]
public string CategoryCode { get; set; }
/// <summary>
/// 分类名称
/// </summary>
[SugarColumn(ColumnName = "category_name")]
public string CategoryName { get; set; }
/// <summary>
/// 父级分类编码
/// </summary>
[SugarColumn(ColumnName = "parent_code")]
public string ParentCode { get; set; }
/// <summary>
/// 层级
/// </summary>
[SugarColumn(ColumnName = "level_no")]
public int? LevelNo { get; set; }
/// <summary>
/// 描述
/// </summary>
public string Description { get; set; }
/// <summary>
/// 状态(0/1)
/// </summary>
public string Status { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[SugarColumn(ColumnName = "created_time")]
public DateTime? CreatedTime { get; set; }
/// <summary>
/// 更新时间
/// </summary>
[SugarColumn(ColumnName = "updated_time")]
public DateTime? UpdatedTime { get; set; }
}
}

View File

@@ -0,0 +1,121 @@
namespace DOAN.Model.BZFM
{
/// <summary>
/// 入库记录表
/// </summary>
[SugarTable("mm_record_inbound")]
public class MmRecordInbound
{
/// <summary>
/// 计量单位
/// </summary>
public string Unit { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[SugarColumn(ColumnName = "created_time")]
public DateTime? CreatedTime { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remarks { get; set; }
/// <summary>
/// 操作员
/// </summary>
public string Operator { get; set; }
/// <summary>
/// 供应商名称
/// </summary>
[SugarColumn(ColumnName = "supplier_name")]
public string SupplierName { get; set; }
/// <summary>
/// 供应商编码
/// </summary>
[SugarColumn(ColumnName = "supplier_code")]
public string SupplierCode { get; set; }
/// <summary>
/// 有效期至
/// </summary>
[SugarColumn(ColumnName = "expiry_date")]
public DateTime? ExpiryDate { get; set; }
/// <summary>
/// 生产日期
/// </summary>
[SugarColumn(ColumnName = "production_date")]
public DateTime? ProductionDate { get; set; }
/// <summary>
/// 批次号
/// </summary>
[SugarColumn(ColumnName = "batch_no")]
public string BatchNo { get; set; }
/// <summary>
/// 入库类型
/// </summary>
[SugarColumn(ColumnName = "transaction_type")]
public string TransactionType { get; set; }
/// <summary>
/// 主键ID
/// </summary>
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
/// <summary>
/// 入库数量
/// </summary>
public decimal Quantity { get; set; }
/// <summary>
/// 库位名称
/// </summary>
[SugarColumn(ColumnName = "location_name")]
public string LocationName { get; set; }
/// <summary>
/// 库位编码
/// </summary>
[SugarColumn(ColumnName = "location_code")]
public string LocationCode { get; set; }
/// <summary>
/// 仓库名称
/// </summary>
[SugarColumn(ColumnName = "warehouse_name")]
public string WarehouseName { get; set; }
/// <summary>
/// 仓库编码
/// </summary>
[SugarColumn(ColumnName = "warehouse_code")]
public string WarehouseCode { get; set; }
/// <summary>
/// 物料名称
/// </summary>
[SugarColumn(ColumnName = "material_name")]
public string MaterialName { get; set; }
/// <summary>
/// 物料编码
/// </summary>
[SugarColumn(ColumnName = "material_code")]
public string MaterialCode { get; set; }
/// <summary>
/// 入库单号
/// </summary>
[SugarColumn(ColumnName = "inbound_no")]
public string InboundNo { get; set; }
}
}

View File

@@ -0,0 +1,103 @@
namespace DOAN.Model.BZFM
{
/// <summary>
/// 出库记录表
/// </summary>
[SugarTable("mm_record_outbound")]
public class MmRecordOutbound
{
/// <summary>
/// 主键ID
/// </summary>
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
/// <summary>
/// 出库单号
/// </summary>
[SugarColumn(ColumnName = "outbound_no")]
public string OutboundNo { get; set; }
/// <summary>
/// 物料编码
/// </summary>
[SugarColumn(ColumnName = "material_code")]
public string MaterialCode { get; set; }
/// <summary>
/// 物料名称
/// </summary>
[SugarColumn(ColumnName = "material_name")]
public string MaterialName { get; set; }
/// <summary>
/// 仓库编码
/// </summary>
[SugarColumn(ColumnName = "warehouse_code")]
public string WarehouseCode { get; set; }
/// <summary>
/// 仓库名称
/// </summary>
[SugarColumn(ColumnName = "warehouse_name")]
public string WarehouseName { get; set; }
/// <summary>
/// 库位编码
/// </summary>
[SugarColumn(ColumnName = "location_code")]
public string LocationCode { get; set; }
/// <summary>
/// 库位名称
/// </summary>
[SugarColumn(ColumnName = "location_name")]
public string LocationName { get; set; }
/// <summary>
/// 出库数量
/// </summary>
public decimal Quantity { get; set; }
/// <summary>
/// 计量单位
/// </summary>
public string Unit { get; set; }
/// <summary>
/// 出库类型
/// </summary>
[SugarColumn(ColumnName = "transaction_type")]
public string TransactionType { get; set; }
/// <summary>
/// 批次号
/// </summary>
[SugarColumn(ColumnName = "batch_no")]
public string BatchNo { get; set; }
/// <summary>
/// 关联订单号
/// </summary>
[SugarColumn(ColumnName = "order_no")]
public string OrderNo { get; set; }
/// <summary>
/// 操作员
/// </summary>
public string Operator { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remarks { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[SugarColumn(ColumnName = "created_time")]
public DateTime? CreatedTime { get; set; }
}
}

View File

@@ -0,0 +1,57 @@
namespace DOAN.Model.BZFM
{
/// <summary>
/// 出入库类别对照表
/// </summary>
[SugarTable("mm_transaction_type")]
public class MmTransactionType
{
/// <summary>
/// 主键ID
/// </summary>
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
/// <summary>
/// 类别编码
/// </summary>
[SugarColumn(ColumnName = "type_code")]
public string TypeCode { get; set; }
/// <summary>
/// 类别名称
/// </summary>
[SugarColumn(ColumnName = "type_name")]
public string TypeName { get; set; }
/// <summary>
/// 操作方向(入库/出库)
/// </summary>
[SugarColumn(ColumnName = "transaction_direction")]
public string TransactionDirection { get; set; }
/// <summary>
/// 描述
/// </summary>
public string Description { get; set; }
/// <summary>
/// 状态(停用/启用)
/// </summary>
public string Status { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[SugarColumn(ColumnName = "created_time")]
public DateTime? CreatedTime { get; set; }
/// <summary>
/// 更新时间
/// </summary>
[SugarColumn(ColumnName = "updated_time")]
public DateTime? UpdatedTime { get; set; }
}
}