📦 通用下料模型场景开发使用文档
一、功能概述
在润信制造执行过程中,叫料业务需要 ERP、WCS、WMS、RCS 等多个系统协同完成。之前的开发方式中,各系统需重复开发需求推送、任务搬运、搬运反馈等功能,造成效率低下、逻辑重复。
为此,设计本“通用下料模型”,用于抽象各类叫料场景(如领料、退料等),统一托盘搬运与回调流程,实现业务与搬运任务解耦,提升开发效率与系统可维护性。
二、使用场景流程(以“领料”为例)
-
创建下料需求
-
建立下料清单
WMS_Allocation_Model
。 -
明细分配方式:
- 退料:用户手动选择;
- 领料:通过调用 WMS 接口自动返回。
-
-
发起叫料任务
- 通过调用统一方法
StockOrderOut()
发起搬运任务。
- 通过调用统一方法
-
搬运到位处理
-
搬运任务到达目标库位后:
- 若
IsAutoOut = true
,系统自动完成出库; - 否则,库存停留在终点,等待手动处理。
- 若
-
-
是否拆托
- 可由系统判定或用户输入;
详细业务流程如下图:
三、业务开发指引(仅需实现 3 步)
-
创建下料需求
- 可多次追加明细;
- 总数量不超过申请数量。
-
调用叫料搬运任务
- 自动完成库存下料搬运到目的地。
-
实现特殊出库逻辑
- 非领料单出库的完善对应出库单逻辑。
如下图:开发仅需完善如下即可。
四、数据字段说明:
📄 t_WMS_Allocation_hd
— 下料主表模型(Header)
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
Id |
long | 是 | 主键 ID(任务唯一标识) |
TaskNo |
string | 否 | 任务编号(自动生成或业务指定) |
TaskType |
string | 否 | 任务类型(如:"IN"=入库,"OUT"=出库) |
BillNo |
string | 是 | 业务单据编号(领料单/退料单) |
BillItemId |
int | 是 | 业务单据明细 ID |
Subcompanyid |
string | 是 | 所属事业处编码:03 |
CompanyId |
string | 是 | 公司编码:DG3 |
businesstype |
string | 否 | 业务类型(AppOut:领料出仓 ScrapOut:报废出仓 PurReturn:采购退货 DeliveOut:送货出库 Transfer:转仓出库 WFOut:综合加工出库)=》 关联到自动出库所走策略 |
TargetLocation |
string | 是 | 搬运终点位置(如:产线位置) |
MachineNo |
string | 否 | 机器编号/产线编号 |
ItemNo |
string | 是 | 物料编码 |
MaterialType |
string | 是 | 物料类型(如:Material 原料、WIP 半成品、Product 成品) |
AppQty |
decimal | 是 | 申请/需求数量 |
IsAutoOut |
bool | 是 | 是否自动出库(搬运到位后是否自动出库) |
SourceType |
string | 否 | 任务来源(ERP/VMES) |
status |
string | 否 | 任务状态 -1 取消 0 待分配 1 搬运中 4 部分完成 5 搬运完成 |
CreatedBy |
string | 是 | 创建用户 |
CreatedTime |
DateTime? | 否 | 创建时间 |
CompletedTime |
DateTime? | 否 | 任务完成时间 |
Remark |
string | 否 | 备注信息 |
📄 t_WMS_Allocation_dl
— 下料明细表(Detail)
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
Id |
long | 否 | 主键 ID(雪花 ID) 不需要传 |
zbid |
long | 否 | 主表 ID(关联 t_WMS_Allocation_hd.Id ) 不需要传 |
keyno |
int | 是 | 序号(明细项顺序) |
BillNo |
string | 是 | 业务单号 |
BillID |
int | 是 | 业务明细行号 |
ContainerCode |
string | 是 | 托盘号 |
ItemNo |
string | 是 | 料号(物料编码) |
Qty |
decimal | 是 | 实际托盘数量 |
AppQty |
decimal | 是 | 需求数量 |
Lotno |
string | 是 | 批次号 |
Unit |
string | 是 | 单位(PCS、KG 等) |
ProductNo |
string | 否 | 工程单号(如适用) |
SeqNo |
int | 否 | 作号(工单子任务编号) |
Currlocation |
string | 是 | 当前托盘所在库位 |
TargetLocation |
string | 是 | 目标下料位置 |
SourceLocation |
string | 是 | 来源库位 |
status |
string | 否 | 状态标识: 0=等待搬运 1=搬运中 2=待拆托 3=待出库 4=已完成 -1=已取消 |
MaterialType |
string | 是 | 物料类型(与主表一致) |
SplitFlag |
bool | 是 | 是否需要拆托处理 |
SourceLocType |
string | 是 | 起始仓库类型(L=立库,P=平库) |
MachineNo |
string | 否 | 目标设备编号(产线、工站等) |
laneno |
string | 否 | 巷道号(立库使用)=》如果是从立库下料则必填 |
buildno |
string | 否 | 栋号(立库使用)=》如果是从立库下料则必填 |
floorno |
string | 否 | 楼层号(立库使用)=》如果是从立库下料则必填 |
Remark |
string | 否 | 备注信息 |
五、接口说明与调用样例
1、出库需求单相关接口
✅ 1. 新增下料需求
using VoionERP.Modules.IMS.WIP.Services.Service;
var newRequestList = new List<WMS_Allocation_Model>
{
new WMS_Allocation_Model
{
BillNo = "BO20250401",
BillItemId = 1,
CompanyId = "C001",
TaskType = "IN",
TargetLocation = "A1-01",
MachineNo = "M123",
ItemNo = "ITM456",
AppQty = 10,
Details = new List<t_WMS_Allocation_dl>
{
new t_WMS_Allocation_dl {
ContainerCode= "",
ItemNo ="",
Lotno="",
Currlocation = "",
TargetLocation = "",
SourceLocation = "",
SplitFlag = false,
SourceLocType = "L",
AppQty = 4
}
}
}
};
var result = EngineContext.Current.Resolve<IWCSService>()
.AddStockOrder(tran, newRequestList);
✏️ 2. 修改下料需求
同上接口 AddStockOrder
,重新传入结构即可。
❌ 3. 按单据取消需求
using VoionERP.Modules.IMS.WIP.Services.Service;
// 取消整单
var result = EngineContext.Current.Resolve<IWCSService>()
.CancelStockOrder(tran, "业务单号", "公司ID", 0);
// 取消某一条明细
var result = EngineContext.Current.Resolve<IWCSService>()
.CancelStockOrder(tran, "业务单号", "公司ID", 1);
❌ 4. 按托盘取消叫料
using VoionERP.Modules.IMS.WIP.Services.Service;
var result = EngineContext.Current.Resolve<IWCSService>()
.CancelStockOrderByPackId(tran, "业务单号", "公司ID", "托盘号");
➕ 5. 多次新增托盘明细
using VoionERP.Modules.IMS.WIP.Services.Service;
var packList = new List<t_WMS_Allocation_dl>
{
new t_WMS_Allocation_dl {
ContainerCode= "",
ItemNo ="",
Lotno="",
Currlocation = "",
TargetLocation = "",
SourceLocation = "",
SplitFlag = false,
SourceLocType = "P",
AppQty = 6,
status = "0"
}
};
var result = EngineContext.Current.Resolve<IWCSService>()
.AddStockPackOrder(tran, "业务单号", "公司ID", 1, packList);
🔄 6. 托盘状态更新
using VoionERP.Modules.IMS.WIP.Services.Service;
// 状态码 "4" = 已完成
var result = EngineContext.Current.Resolve<IWCSService>()
.UpdateStockOrderStatus(tran, "业务单号", "公司ID", "托盘号", "4", "当前位置");
🔢 7. 拆托回报更新数量
暂未完成
2、下料搬运相关接口
🚚 1. 发起下料搬运任务
using VoionERP.Modules.IMS.WIP.Services.Service;
var result = EngineContext.Current.Resolve<IWCSService>()
.StockOrderOut(tran, "业务单号", "公司ID");
3、最终出库接口实现
出库默认实现了领料单出库的方法,如果有其他特殊场景出库还需要实现,具体实现图下图,继承 IstockOrderOut 实现即可
如果是非领料单出库,实现了对应的出库之后,完善下述代码即可:
namespace VoionERP.Modules.IMS.Repository
{
public static class StockRepository
{
public static ServiceResponseResult CreateStockOrderOut(ServiceToken token, WMS_Allocation_Model stockOrder, t_WMS_Allocation_dl detail,string startCode,string endCode, ref string BillNo, ITransactionManager tran = null)
{
ServiceResponseResult result = new ServiceResponseResult();
switch (stockOrder.businesstype)
{
case "":
case "partout":
case "ProApp":
return new StockOrderOutContext(new StockOrderOut_AppOut()).CreateStockOrderOut(token, stockOrder, detail, startCode, BillNo, ref BillNo, tran);
}
result.Success = false;
result.ErrorMsg = "未知业务类型";
return result;
}
}
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于