最近仓库提出任务单能不能批量发料功能?从技术角度来说,理论上是可以实现在的。经过对业务部关键用户的需求调研和分析得出如下:
1. 由于不同装配件所有用到的原材料或半成品在不同仓库不同用户有权限发料
2. 部分原材料或半成品实物与系统的现有量不相符,其中原因:实物与系统操作的及时性问题所导致的。关键用户同意按照系统现有量扣帐。
3. 启用批次的物料采用先进先出原则扣帐
4. 采用模拟标准任务单发料直接往表mtl_material_transactions_temp和TL_TRANSACTION_LOTS_TEMP插入数据。
本次开发借鉴标准系统标准API:
1. WIP_POPULATE_TEMP.Insert_Temp 往表mtl_material_transactions_temp
2. inv_quantity_tree_pub.query_quantities 判断现有量 API
主要代码如下,其中核心代码CUX_WIPBATTXMAT_PKG.InsertTemp
————————————————
CREATE OR REPLACE Package CUX_WIPBATTXMAT_PKG As
--任务单装配
Type CUX_WIPDISCRETEJOBS Is Record(
TRANSACTION_HEADER_ID Number,
WIP_ENTITY_ID Number, --任务单ID
WIP_ENTITY_NAME Varchar2(240), --任务单编号
JOB_TYPE_MEANING Varchar2(80), --类型
ASSEMBLY_NUM Varchar2(40), --装配件
ASSEMBLY_DESC Varchar2(240), --装配件说明
CLASS_CODE Varchar2(10), --分类
STATUS_TYPE_DISP Varchar2(80), --状态
START_QUANTITY Number, --数量
DATE_RELEASED Date, --发放日期
INVENTORY_ITEM_ID Number, --装配件ID
TRANSACTION_TYPE Varchar2(80), --事务处理类型
TRANSACTION_DATE Date, --事务处理日期
TRANSFER_SUBINVENTORY Varchar2(8), --子库存
TRANSFER_LOCATION_ID Number, --货位ID
TRANSFER_LOCATION_CODE Varchar2(30) --货位代码
);
--提交请求 GB任务单批量发料请求
procedure SubmitRpt(ERRBUF OUT VARCHAR2,
RETCODE OUT NUMBER,
P_ORGANIZATION_ID NUMBER,
P_GROUP_ID Number,
P_USER_ID Number);
--提交单个任务单组件发放
Procedure WipCmpRelRequest(P_GROUP_ID In Number,
P_WIP_ENTITY_ID IN NUMBER,
P_TRANSACTION_DATE IN Date,
P_ORGANIZATION_ID IN NUMBER,
P_SUBINVENTORY IN VARCHAR2,
P_LOCATOR_ID IN NUMBER,
P_TRANSACTION_HEADER_ID In NUMBER,
P_USER_ID IN NUMBER,
P_DEBUG_FLAG Varchar2);
procedure WipCmpRel(ERRBUF OUT VARCHAR2,
RETCODE OUT NUMBER,
P_GROUP_ID In Number,
P_WIP_ENTITY_ID IN NUMBER,
P_TRANSACTION_DATE IN Varchar2,
P_ORGANIZATION_ID IN NUMBER,
P_SUBINVENTORY IN VARCHAR2,
P_LOCATOR_ID IN NUMBER,
P_TRANSACTION_HEADER_ID In NUMBER,
P_USER_ID IN NUMBER,
P_DEBUG_FLAG Varchar2);
Procedure InsertTemp(P_TRANSACTION_MODE IN NUMBER,
P_WIP_ENTITY_ID IN NUMBER,
P_LINE_ID IN NUMBER,
P_TRANSACTION_DATE IN DATE,
P_TRANSACTION_TYPE_ID IN NUMBER,
P_TRANSACTION_ACTION_ID IN NUMBER,
P_SUBINVENTORY IN VARCHAR2,
P_LOCATOR_ID IN NUMBER,
P_ASSEMBLY_QUANTITY IN NUMBER,
P_OPERATION_SEQ_NUM IN NUMBER,
P_DEPARTMENT_ID IN NUMBER,
P_CRITERIA_SUB IN VARCHAR2,
P_ORGANIZATION_ID IN NUMBER,
P_ACCT_PERIOD_ID IN NUMBER,
P_LAST_UPDATED_BY IN NUMBER,
P_ENTITY_TYPE IN NUMBER,
P_TRANSACTION_HEADER_ID IN NUMBER,
P_DEBUG_FLAG Varchar2,
X_COMMIT_COUNT In Out Number);
End CUX_WIPBATTXMAT_PKG;
————————————————
CREATE OR REPLACE Package Body CUX_WIPBATTXMAT_PKG As
Procedure Log(p_Msg In Varchar2) Is
Begin
Fnd_File.Put_Line(Fnd_File.Log, p_Msg);
End Log;
--===============================================================
-- Output
--===============================================================
Procedure Output(p_Msg In Varchar2) Is
Begin
Fnd_File.Put_Line(Fnd_File.Output, p_Msg);
End Output;
--批量发料失效的明细
procedure WipCmpRelFailure(P_ORGANIZATION_ID NUMBER, P_GROUP_ID Number) Is
Cursor Cr Is
Select WDJ.WIP_ENTITY_ID,
WDJ.WIP_ENTITY_NAME,
WDJ.STATUS_TYPE_DISP,
MSI.SEGMENT1 COMP_NUM,
MSI.DESCRIPTION COMP_DESC,
WRO.REQUIRED_QUANTITY,
WRO.QUANTITY_ISSUED,
WRO.SUPPLY_SUBINVENTORY
From CUX.CUX_WIPBATISSUED_ALL WIPB,
WIP_DISCRETE_JOBS_V WDJ,
WIP_REQUIREMENT_OPERATIONS WRO,
MTL_SYSTEM_ITEMS_B MSI
Where WIPB.WIP_ENTITY_ID = WDJ.WIP_ENTITY_ID
And WDJ.WIP_ENTITY_ID = WRO.WIP_ENTITY_ID
And WRO.Inventory_Item_Id = MSI.INVENTORY_ITEM_ID
And WRO.organization_id = MSI.ORGANIZATION_ID
And WIPB.Group_Id = P_GROUP_ID
And WIPB.ORGANIZATION_ID = P_ORGANIZATION_ID
And (WRO.WIP_SUPPLY_TYPE = 1 Or WRO.WIP_SUPPLY_TYPE = 2)
And WDJ.STATUS_TYPE = 3
And Nvl(WRO.QUANTITY_ISSUED, 0) - WRO.REQUIRED_QUANTITY < 0
Order By WDJ.WIP_ENTITY_ID;
i Number :=1;
Begin
OUTPUT('<TR BGCOLOR="#E6E6FA"><TD COLSPAN="10">任务单未发料明细</TD></TR>');
Output('<tr BGCOLOR="#FFE66F">
<td align="center">序号</td>
<td align="center">任务单</td>
<td align="center">状态</td>
<td align="center">任务单标识</td>
<td align="center">组件</td>
<td align="center">组件说明</td>
<td align="center">子库存</td>
<td align="center">数量</td>
<td align="center">已发料</td>
<td align="center">未发数</td></tr>');
For Rs In Cr Loop
Output('<tr>
<td align="center">'|| i ||'</td>
<td>'||Rs.Wip_Entity_Name||'</td>
<td>'||Rs.Status_Type_Disp||'</td>
<td>'||Rs.Wip_Entity_Id||'</td>
<td>'||Rs.Comp_Num||'</td>
<td>'||Rs.Comp_Desc||'</td>
<td>'||Rs.Supply_Subinventory||'</td>
<td>'||Rs.Required_Quantity||'</td>
<td>'||Rs.Quantity_Issued||'</td>
<td>'||(Rs.Required_Quantity - Nvl(Rs.Quantity_Issued,0))||'</td></tr>');
i := i +1;
End Loop;
End WipCmpRelFailure;
--提交请求 GB任务单批量发料请求
procedure SubmitRpt(ERRBUF OUT VARCHAR2,
RETCODE OUT NUMBER,
P_ORGANIZATION_ID NUMBER,
P_GROUP_ID Number,
P_USER_ID Number) Is
Cursor Cr Is
Select *
From CUX.CUX_WIPBATISSUED_ALL
Where GROUP_ID = P_GROUP_ID
And ORGANIZATION_ID = P_ORGANIZATION_ID
And PROCESS_FLAG =2 ;
l_TrxHdrId Number;
Begin
---更新为处理中
Update CUX.CUX_WIPBATISSUED_ALL
Set PROCESS_FLAG = 2
Where GROUP_ID = P_GROUP_ID
And ORGANIZATION_ID = P_ORGANIZATION_ID
And PROCESS_FLAG = 1;
Commit;
CUX_GOBAOPUBLIC_PKG.HTMLSTART('GB任务单批量发料请求');
OUTPUT('<TABLE CLASS="CONTEXT" BORDERCOLOR="#669933" WIDTH="100%" BORDER=1>
<TR BGCOLOR="#E6E6FA"><TD COLSPAN="10">提交日期:' || TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') || '</TD></TR>
<TR BGCOLOR="#E6E6FA"><TD COLSPAN="10">组标识:' ||P_GROUP_ID || '</TD></TR>');
Select mtl_material_transactions_s.NEXTVAL
INTO l_TrxHdrId
FROM SYS.dual;
For Rs In Cr Loop
WipCmpRelRequest(P_GROUP_ID,
Rs.Wip_Entity_Id,
Rs.Transaction_Date,
Rs.Organization_Id,
Rs.Subinventory_Code,
Rs.Locator_Id,
l_TrxHdrId,
P_USER_ID,
'Y');
End Loop;
WipCmpRelFailure(P_ORGANIZATION_ID, P_GROUP_ID);
OUTPUT('</TABLE></BODY></HTML>');
End SubmitRpt;
--提交单个任务单组件发放
Procedure WipCmpRelRequest(P_GROUP_ID In Number,
P_WIP_ENTITY_ID IN NUMBER,
P_TRANSACTION_DATE IN DATE,
P_ORGANIZATION_ID IN NUMBER,
P_SUBINVENTORY IN VARCHAR2,
P_LOCATOR_ID IN NUMBER,
P_TRANSACTION_HEADER_ID In NUMBER,
P_USER_ID IN NUMBER,
P_DEBUG_FLAG Varchar2) Is
v_ReqID Number;
l_phase Varchar(200);
l_status Varchar(200);
l_dev_phase Varchar(200);
l_dev_status Varchar(200);
l_message Varchar(2000);
l_request_status boolean;
l_TranDate Varchar2(30);
Begin
l_TranDate := To_Char(P_TRANSACTION_DATE,'YYYY/MM/DD HH24:MI:SS');
v_ReqID := fnd_request.submit_request('CUX',
'CUX_WIPBATTXMATSINGLE',
null,
null,
false,
P_GROUP_ID,
P_WIP_ENTITY_ID,
l_TranDate,
P_ORGANIZATION_ID,
P_SUBINVENTORY,
P_LOCATOR_ID,
P_TRANSACTION_HEADER_ID,
P_USER_ID,
P_DEBUG_FLAG);
If (Nvl(v_ReqID, 0) > 0) Then
COMMIT;
Log('请求ID:'||v_ReqID);
l_request_status := Fnd_Concurrent.Wait_For_Request(v_ReqID,
5,
0,
l_phase,
l_status,
l_dev_phase,
l_dev_status,
l_message);
IF l_request_status THEN
IF l_dev_status = 'NORMAL' THEN
Log('[GB任务单组件发放:'|| P_WIP_ENTITY_ID ||']运行成功');
ELSE
Log('[GB任务单组件发放:'|| P_WIP_ENTITY_ID ||']运行失败:' || l_dev_status);
Return;
END IF;
ELSE
Log('请求[GB任务单组件发放:'|| P_WIP_ENTITY_ID ||'未完成,无法查看报表内容!');
Return;
END IF;
End If;
End WipCmpRelRequest;
---任务单装配件输出
procedure WipDiscreteJobsHtml(P_WipDiscreteJobs CUX_WIPDISCRETEJOBS) Is
Begin
CUX_GOBAOPUBLIC_PKG.HTMLSTART('GB任务单组件发放');
OUTPUT('<TABLE CLASS="CONTEXT" BORDERCOLOR="#669933" WIDTH="100%" BORDER=1>