新增MES库区管理功能,包含免密接口、数据处理逻辑及相关控制器、服务和实体的实现。支持库区的增删改查操作,优化用户体验并增强系统的实时数据同步能力。

This commit is contained in:
geht
2026-05-12 14:06:07 +08:00
parent cffe32d896
commit b737dddb2a
74 changed files with 4937 additions and 174 deletions

View File

@@ -0,0 +1,13 @@
using Prism.Events;
namespace YY.Admin.Core.Events;
public class WarehouseAreaChangedPayload
{
public string Action { get; set; } = string.Empty;
public string? WarehouseAreaId { get; set; }
}
public class WarehouseAreaChangedEvent : PubSubEvent<WarehouseAreaChangedPayload>
{
}

View File

@@ -15,4 +15,12 @@ public interface IRawMaterialCardService
Task<bool> DeleteAsync(string id, CancellationToken ct = default);
Task<bool> DeleteBatchAsync(string ids, CancellationToken ct = default);
Task<bool> UpdatePriorityAsync(string id, string priorityPickup, CancellationToken ct = default);
/// <summary>
/// 按拆码明细 ID 列表批量删除原材料卡片。
/// </summary>
/// <param name="splitDetailIds">拆码明细行的 GUID 集合(自动 distinct空跳过</param>
/// <param name="dryRun">为 true 时仅返回匹配数量、不真正删除(用于「重新拆码」弹窗预提示)</param>
/// <returns>匹配/删除的卡片数量;失败返回 -1</returns>
Task<int> DeleteBySplitDetailIdsAsync(IEnumerable<string> splitDetailIds, bool dryRun = false, CancellationToken ct = default);
}

View File

@@ -23,4 +23,10 @@ public interface IRawMaterialEntryService
/// <summary>调用后端接口生成条码/批次号格式QH+物料编码+yyMMdd+序号)</summary>
Task<string?> GenerateBarcodeAsync(string materialCode, CancellationToken ct = default);
/// <summary>
/// 同步读取本地缓存的「全量入场记录」快照(深拷贝),不会触发远端拉取。
/// 主要用于「磅单已入场重量」等跨表实时聚合,且需要保持与后端相同口径的场景。
/// </summary>
IReadOnlyList<MesXslRawMaterialEntry> GetCachedSnapshot();
}

View File

@@ -0,0 +1,54 @@
using YY.Admin.Core.Entity;
namespace YY.Admin.Core.Services;
public record WarehouseAreaPageResult(List<MesXslWarehouseArea> Records, long Total, int PageNo, int PageSize);
/// <summary>
/// 库区管理服务CRUD + 状态切换 + 编码校验)。
/// 走 jeecg 免密接口 /xslmes/mesXslWarehouseArea/anon/*。
///
/// 注意:本接口契约不可随意改签名,被以下调用方引用:
/// - WarehouseAreaListViewModel列表/筛选/启停/删除)
/// - WarehouseAreaEditDialogViewModel新增/编辑/校验)
/// - WarehouseAreaPickerDialogViewModel拆码明细库位选择弹窗
/// </summary>
public interface IWarehouseAreaService
{
/// <summary>
/// 分页查询。参数顺序与 WarehouseAreaListViewModel 调用一致:
/// pageNo, pageSize, areaCode, areaName, warehouseId, status。
/// </summary>
/// <param name="status">"0" 启用 / "1" 停用 / "" 或 null 表示不限</param>
Task<WarehouseAreaPageResult> PageAsync(
int pageNo,
int pageSize,
string? areaCode = null,
string? areaName = null,
string? warehouseId = null,
string? status = null,
CancellationToken ct = default);
/// <summary>按 ID 查单条。</summary>
Task<MesXslWarehouseArea?> GetByIdAsync(string id, CancellationToken ct = default);
/// <summary>新增库区。后端会校验 areaCode 重复。</summary>
Task<bool> AddAsync(MesXslWarehouseArea area, CancellationToken ct = default);
/// <summary>编辑库区(按 ID。</summary>
Task<bool> EditAsync(MesXslWarehouseArea area, CancellationToken ct = default);
/// <summary>按 ID 删除。</summary>
Task<bool> DeleteAsync(string id, CancellationToken ct = default);
/// <summary>切换启停状态:传入目标状态 "0"=启用 / "1"=停用。</summary>
Task<bool> UpdateStatusAsync(string id, string newStatus, CancellationToken ct = default);
/// <summary>
/// 校验库区编码是否可用(不存在则可用)。
/// </summary>
/// <param name="areaCode">待校验的库区编码</param>
/// <param name="excludeId">编辑时排除自身 ID新增传 null 或空</param>
/// <returns>true=可用无重复false=已被占用</returns>
Task<bool> CheckAreaCodeAsync(string areaCode, string? excludeId, CancellationToken ct = default);
}

View File

@@ -0,0 +1,9 @@
using YY.Admin.Core.Entity;
namespace YY.Admin.Core.Services;
public interface IWarehouseService
{
/// <summary>获取全部仓库列表(在线时拉取远端并刷新缓存,离线时返回本地缓存)</summary>
Task<List<MesXslWarehouse>> GetAllAsync(CancellationToken ct = default);
}