对于OracleEBSINV创建货位感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解oracle-ebs,并且为您提供关于APC&INVdifferentaboutitems、c–Mat.i
对于Oracle EBS INV 创建货位感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解oracle-ebs,并且为您提供关于APC&INV different about items、c – Mat.inv()在opencv中产生全零、EBS - INV 接口大全、EBS oracle 批量导入更新 MOQ(最小拆分量、采购提前期、最小订购量、最小包装量)的宝贵知识。
本文目录一览:- Oracle EBS INV 创建货位(oracle-ebs)
- APC&INV different about items
- c – Mat.inv()在opencv中产生全零
- EBS - INV 接口大全
- EBS oracle 批量导入更新 MOQ(最小拆分量、采购提前期、最小订购量、最小包装量)
Oracle EBS INV 创建货位(oracle-ebs)
create or replace PROCEDURE XX_CREATE_LOCATOR AS
-- Common Declarations
l_api_version NUMBER := 1.0;
x_return_status VARCHAR2(2);
x_msg_count NUMBER := 0;
x_msg_data VARCHAR2(255);
-- WHO columns
l_user_id NUMBER := -1;
l_resp_id NUMBER := -1;
l_application_id NUMBER := -1;
l_row_cnt NUMBER := 1;
l_user_name VARCHAR2(30) := ''MFG'';
l_resp_name VARCHAR2(50) := ''Manufacturing and Distribution Manager'';
-- API specific declarations
x_inventory_location_id NUMBER := NULL;
x_locator_exists VARCHAR2(1) := NULL;
BEGIN
-- Get the user_id
SELECT user_id
INTO l_user_id
FROM fnd_user
WHERE user_name = l_user_name;
-- Get the application_id and responsibility_id
SELECT application_id, responsibility_id
INTO l_application_id, l_resp_id
FROM fnd_responsibility_vl
WHERE responsibility_name = l_resp_name;
FND_GLOBAL.APPS_INITIALIZE(l_user_id, l_resp_id, l_application_id);
dbms_output.put_line(''Initialized applications context: ''|| l_user_id || '' ''|| l_resp_id ||'' ''|| l_application_id );
-- call API to update material status
DBMS_OUTPUT.PUT_LINE(''======================================================='');
DBMS_OUTPUT.PUT_LINE(''Calling INV_LOC_WMS_PUB.CREATE_LOCATOR'');
INV_LOC_WMS_PUB.CREATE_LOCATOR
( x_return_status => x_return_status
, x_msg_count => x_msg_count
, x_msg_data => x_msg_data
, x_inventory_location_id => x_inventory_location_id
, x_locator_exists => x_locator_exists
, p_organization_id => 602
, p_organization_code => ''P1''
, p_concatenated_segments => ''A5.A5.A5..''
, p_description => ''Locator from API''
, p_inventory_location_type=> 3
, p_picking_order => NULL
, p_location_maximum_units => NULL
, p_SUBINVENTORY_CODE => ''SU_LOC_SUB''
, p_LOCATION_WEIGHT_UOM_CODE => NULL
, p_mAX_WEIGHT => NULL
, p_vOLUME_UOM_CODE => NULL
, p_mAX_CUBIC_AREA => NULL
, p_x_COORDINATE => NULL
, p_Y_COORDINATE => NULL
, p_Z_COORDINATE => NULL
, p_PHYSICAL_LOCATION_ID => NULL -- required when creating logical locators
, p_PICK_UOM_CODE => NULL
, p_DIMENSION_UOM_CODE => NULL
, p_LENGTH => NULL
, p_WIDTH => NULL
, p_HEIGHT => NULL
, p_STATUS_ID => 1
, p_dropping_order => NULL
, p_attribute_category => NULL
, p_attribute1 => NULL
, p_attribute2 => NULL
, p_attribute3 => NULL
, p_attribute4 => NULL
, p_attribute5 => NULL
, p_attribute6 => NULL
, p_attribute7 => NULL
, p_attribute8 => NULL
, p_attribute9 => NULL
, p_attribute10 => NULL
, p_attribute11 => NULL
, p_attribute12 => NULL
, p_attribute13 => NULL
, p_attribute14 => NULL
, p_attribute15 => NULL
, p_alias => NULL );
DBMS_OUTPUT.PUT_LINE(''======================================================='');
DBMS_OUTPUT.PUT_LINE(''Return Status: ''||x_return_status);
DBMS_OUTPUT.PUT_LINE(''x_locator_exists: ''||x_locator_exists||'' x_inventory_location_id:''||x_inventory_location_id);
IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
DBMS_OUTPUT.PUT_LINE(''Msg Count:''||x_msg_count||'' Error Message :''||x_msg_data);
IF ( x_msg_count > 1 ) THEN
FOR i IN 1 .. x_msg_count LOOP
x_msg_data := fnd_msg_pub.get ( p_msg_index => i , p_encoded =>FND_API.G_FALSE ) ;
dbms_output.put_line ( ''message :'' || x_msg_data);
END LOOP;
END IF;
END IF;
DBMS_OUTPUT.PUT_LINE(''======================================================='');
END XX_CREATE_LOCATOR;
APC&INV different about items
SELECT * FROM (SELECT msib.segment1 item_num, fl_col.descriptive_flex_context_code attr_group_name, fl_col.end_user_column_name attr_internal_name_apc, tl.form_left_prompt attr_name_apc, fl_col.application_column_name database_column_apc, DECODE (fl_col.application_column_name, 'C_EXT_ATTR1',emib.c_ext_attr1, 'C_EXT_ATTR2',emib.c_ext_attr2, 'C_EXT_ATTR3',emib.c_ext_attr3, 'C_EXT_ATTR4',emib.c_ext_attr4, 'C_EXT_ATTR5',emib.c_ext_attr5, 'C_EXT_ATTR6',emib.c_ext_attr6, 'C_EXT_ATTR7',emib.c_ext_attr7, 'C_EXT_ATTR8',emib.c_ext_attr8, 'C_EXT_ATTR9',emib.c_ext_attr9, 'C_EXT_ATTR10',emib.c_ext_attr10, 'C_EXT_ATTR11',emib.c_ext_attr11, 'C_EXT_ATTR12',emib.c_ext_attr12, 'C_EXT_ATTR13',emib.c_ext_attr13, 'C_EXT_ATTR14',emib.c_ext_attr14, 'C_EXT_ATTR15',emib.c_ext_attr15, 'C_EXT_ATTR16',emib.c_ext_attr16, 'C_EXT_ATTR17',emib.c_ext_attr17, 'C_EXT_ATTR18',emib.c_ext_attr18, 'C_EXT_ATTR19',emib.c_ext_attr19, 'C_EXT_ATTR20',emib.c_ext_attr20, 'C_EXT_ATTR21',emib.c_ext_attr21, 'C_EXT_ATTR22',emib.c_ext_attr22, 'C_EXT_ATTR23',emib.c_ext_attr23, 'C_EXT_ATTR24',emib.c_ext_attr24, 'C_EXT_ATTR25',emib.c_ext_attr25, 'C_EXT_ATTR26',emib.c_ext_attr26, 'C_EXT_ATTR27',emib.c_ext_attr27, 'C_EXT_ATTR28',emib.c_ext_attr28, 'C_EXT_ATTR29',emib.c_ext_attr29, 'C_EXT_ATTR30',emib.c_ext_attr30, 'C_EXT_ATTR31',emib.c_ext_attr31, 'C_EXT_ATTR32',emib.c_ext_attr32, 'C_EXT_ATTR33',emib.c_ext_attr33, 'C_EXT_ATTR34',emib.c_ext_attr34, 'C_EXT_ATTR35',emib.c_ext_attr35, 'C_EXT_ATTR36',emib.c_ext_attr36, 'C_EXT_ATTR37',emib.c_ext_attr37, 'C_EXT_ATTR38',emib.c_ext_attr38, 'C_EXT_ATTR39',emib.c_ext_attr39, 'C_EXT_ATTR40',emib.c_ext_attr40 ) attr_name_value_apc, (SELECT MAX (mdev.element_value) FROM mtl_descr_element_values mdev WHERE msib.inventory_item_id = mdev.inventory_item_id AND mdev.element_name = tl.form_left_prompt) attr_value_inv FROM fnd_descr_flex_column_usages fl_col, ego_fnd_dsc_flx_ctx_ext fl_ctx_ext, fnd_descr_flex_col_usage_tl tl, ego_mtl_sy_items_ext_b emib, mtl_system_items_b msib, hr_organization_units hou, mtl_item_catalog_groups_tl mcg, fnd_descr_flex_contexts_tl fdfct WHERE msib.organization_id = hou.organization_id AND hou.NAME = 'Item Master Org - IO' AND (msib.item_type = 'emm' OR msib.item_type = 'OEMOD') AND msib.item_catalog_group_id = mcg.item_catalog_group_id AND fdfct.application_id = fl_col.application_id AND fl_col.application_id = fl_ctx_ext.application_id AND fl_col.descriptive_flex_context_code = fl_ctx_ext.descriptive_flex_context_code AND fl_col.descriptive_flexfield_name = fl_ctx_ext.descriptive_flexfield_name AND tl.application_id = fl_col.application_id AND tl.descriptive_flexfield_name = fl_col.descriptive_flexfield_name AND tl.descriptive_flex_context_code = fl_col.descriptive_flex_context_code AND tl.application_column_name = fl_col.application_column_name AND fl_col.enabled_flag = 'Y' AND tl.LANGUAGE = USERENV ('LANG') AND tl.LANGUAGE = mcg.LANGUAGE AND tl.LANGUAGE = fdfct.LANGUAGE AND emib.organization_id = hou.organization_id AND emib.attr_group_id = fl_ctx_ext.attr_group_id AND fdfct.descriptive_flex_context_code = fl_ctx_ext.descriptive_flex_context_code AND fdfct.descriptive_flex_context_name = mcg.description AND fl_ctx_ext.application_id > 0 AND emib.inventory_item_id = msib.inventory_item_id AND emib.organization_id = msib.organization_id AND fl_col.descriptive_flex_context_code <> 'EMR_PIC_ATTRIBS' -- AND msib.SEGMENT1='EZX2-A20' ) WHERE NVL (attr_name_value_apc,CHR (0)) <> NVL (attr_value_inv,CHR (0))
c – Mat.inv()在opencv中产生全零
cv::Mat temp0 = R.t(); cv::Mat temp1 = R * temp0; cv::Mat temp2(960,960,CV_32FC1); temp2 = temp1.inv(); cv::Size s = temp1.size(); std::cout<<s.height<<" "<<s.width<<std::endl; std::cout<<cv::format(temp1,"numpy" ) << std::endl; std::cout<<cv::format(temp2,"numpy" ) << std::endl;
Transpose工作正常,矩阵乘法也是如此.因此,Mat temp1的大小为960×960.但是,当我执行temp2 = temp1.inv()时,我收到temp2中的所有零.我的意思是零是所有960×960细胞.此外,R仅为CV_32FC1类型.所以它可能不是数据类型问题.我无法理解这里的问题.我用Google搜索了这么多.你能帮忙吗?
编辑
我正在复制Mat :: inv()函数的gdb输出下面.我很难搞清楚这一切,但如果有人更熟悉OpenCV,也许它会有所帮助:)
Breakpoint 1,CreateShares::ConstructShares (this=0x80556d0,channel=...,k=2,n=4) at CreateShares.cpp:165 165 temp2 = temp1.inv(); (gdb) step cv::Mat::operator= (this=0xbffff294,e=...) at /usr/include/opencv2/core/mat.hpp:1373 1373 e.op->assign(e,*this); (gdb) 1374 return *this; (gdb) step 1375 } (gdb) step cv::MatExpr::~MatExpr (this=0xbfffef64,__in_chrg=<optimized out>) at /usr/include/opencv2/core/mat.hpp:1167 1167 class CV_EXPORTS MatExpr (gdb) step cv::Mat::~Mat (this=0xbfffefdc,__in_chrg=<optimized out>) at /usr/include/opencv2/core/mat.hpp:295 295 release(); (gdb) step cv::Mat::release (this=0xbfffefdc) at /usr/include/opencv2/core/mat.hpp:381 381 if( refcount && CV_XADD(refcount,-1) == 1 ) (gdb) step 383 data = datastart = dataend = datalimit = 0; (gdb) step 384 size.p[0] = 0; (gdb) step 385 refcount = 0; (gdb) step 386 } (gdb) step cv::Mat::~Mat (this=0xbfffefdc,__in_chrg=<optimized out>) at /usr/include/opencv2/core/mat.hpp:296 296 if( step.p != step.buf ) (gdb) step 298 } (gdb) step cv::Mat::~Mat (this=0xbfffefa4,__in_chrg=<optimized out>) at /usr/include/opencv2/core/mat.hpp:295 295 release(); (gdb) step cv::Mat::release (this=0xbfffefa4) at /usr/include/opencv2/core/mat.hpp:381 381 if( refcount && CV_XADD(refcount,-1) == 1 ) (gdb) step 383 data = datastart = dataend = datalimit = 0; (gdb) step 384 size.p[0] = 0; (gdb) step 385 refcount = 0; (gdb) step 386 } (gdb) step cv::Mat::~Mat (this=0xbfffefa4,__in_chrg=<optimized out>) at /usr/include/opencv2/core/mat.hpp:296 296 if( step.p != step.buf ) (gdb) step 298 } (gdb) step cv::Mat::~Mat (this=0xbfffef6c,__in_chrg=<optimized out>) at /usr/include/opencv2/core/mat.hpp:295 295 release(); (gdb) step cv::Mat::release (this=0xbfffef6c) at /usr/include/opencv2/core/mat.hpp:381 381 if( refcount && CV_XADD(refcount,-1) == 1 ) (gdb) step 383 data = datastart = dataend = datalimit = 0; (gdb) step 384 size.p[0] = 0; (gdb) step 385 refcount = 0; (gdb) step 386 } (gdb) step cv::Mat::~Mat (this=0xbfffef6c,__in_chrg=<optimized out>) at /usr/include/opencv2/core/mat.hpp:296 296 if( step.p != step.buf ) (gdb) step 298 } (gdb) step CreateShares::ConstructShares (this=0x80556d0,n=4) at CreateShares.cpp:167 167 cv::Size s = temp1.size(); (gdb) step cv::Mat::MSize::operator() (this=0xbffff284) at /usr/include/opencv2/core/mat.hpp:705 705 return Size(p[1],p[0]); (gdb) step cv::Size_<int>::Size_ (this=0xbffff2f8,_width=960,_height=960) at /usr/include/opencv2/core/operations.hpp:1624 1624 : width(_width),height(_height) {} (gdb) step cv::Mat::MSize::operator() (this=0xbffff284) at /usr/include/opencv2/core/mat.hpp:706 706 } (gdb) step
解决方法
来自维基百科:
A square matrix that is not invertible is called singular or
degenerate. A square matrix is singular if and only if its determinant
is 0.
你可以像这样显示行列式……
std::cout<<"determinant(temp1)="<<cv::determinant(temp1)<<"\n";
从the documentation for Mat::inv()开始,有三种方法可供选择:
> DECOMP_LU(默认值)是LU分解.矩阵必须是非单数的.
> DECOMP_CHOLESKY只是对称正定义矩阵的Cholesky分解.这种类型比大矩阵上的LU快两倍.
> DECOMP_SVD是SVD分解.如果矩阵是奇异的或甚至是非正方形,则计算伪反转.
从the documentation for invert()开始,这可能是由Mat :: inv()在内部使用的:
In the case of DECOMP_LU method,the function returns the src
determinant ( src must be square). If it is 0,the matrix is not
inverted and dst is filled with zeros.
这与您所看到的结果一致.
关于数学的注释
我不是数学家,但我觉得反转矩阵可能是一个混乱的事情 – 如果你的矩阵非常大,更是如此.实际上,原则上存在这些反转可能是正确的,但实际上不可能以任何精度计算.在使用您的代码进行一些实验时,我发现在很多情况下,我会得到不完全为零的行列式,但非常接近于零 – 可能表明数值精度可能是限制因素.我尝试使用64位值而不是32来指定矩阵,并且得到了不同,但不一定是更好的答案.
根据计算temp1矩阵的方式,识别它总是对称的可能是有用的. DECOMP_CHOLESKY方法专门设计用于对称positive definite矩阵,因此使用它可能会提供一些优势.
在实验上,我发现归一化(由@cedrou建议)使得反函数更有可能返回非零矩阵(使用DECOMP_LU但不使用DECOMP_CHOLESKY).但是,根据我对如何初始化R矩阵的猜测,得到的矩阵似乎永远不会满足逆矩阵的定义:A * inverse(A)= Identity.但是你并不一定关心这一点 – 这也许是SVD方法计算伪逆的原因.
最后,似乎关于为什么反演失败的这个更深层次的问题可能是数学问题而不是编程问题.基于此我在数学网站上做了一些搜索,结果发现有人已经问过如何做这件事:https://math.stackexchange.com/questions/182662
关于调试的说明
根据您的调试跟踪,我倾向于认为您感兴趣的部分已编译为不可跟踪的库,并在您运行步骤时跳过.换句话说,在第一步之后的那个神秘的空白行代表它实际运行inv()函数的部分.之后,它将结果分配给temp2并破坏临时对象.因此,您的调试跟踪不会告诉我们有关inv()内部发生的事情.
165 temp2 = temp1.inv(); (gdb) step cv::Mat::operator= (this=0xbffff294,*this);
我自己运行了一个调试器,并能够通过内部调用遍历invert()并观察它根据矩阵的内部分析(确定它不可逆)决定失败 – 并因此返回填充的矩阵使用零,匹配您报告的内容.
如果您有兴趣查看源代码,则可以在cxlapack.cpp中定义invert()函数.
EBS - INV 接口大全
#接口 API 列表 | 序号 | 接口名称 | API 名称 | |------------|:------------|:-----------| |1 | 物料 ABC 分类创建 |<a href="#1">inv_abc_assignments_pub.create_abc_assignments</a>| |2 | 创建物料批次 |<a href="#2">inv_lot_api_pub.create_inv_lot</a>| |3 | 物料组织分配 |<a href="#3">ego_item_pub.process_item_org_assignments</a>| |4 | 物料搬运单关闭 | 关闭头:<a href="#4.1">inv_mo_admin_pub.close_order</a><br > 关闭行:<a href="#4.2">inv_mo_admin_pub.close_line</a>|
对应接口测试脚本
##<a name="1">1. 物料 ABC 分类创建 </a>
DECLARE
x_return_status VARCHAR2(10);
x_msg_count NUMBER;
x_msg_data VARCHAR2(2000);
l_abc_assignments_rec inv_abc_assignments_pub.abc_assignments_rec_type := inv_abc_assignments_pub.g_miss_assignments_rec_type;
BEGIN
l_abc_assignments_rec.inventory_item_id := 196161;--物料
l_abc_assignments_rec.assignment_group_id := 2003;--分配组
l_abc_assignments_rec.abc_class_id := 2001;--ABC 分类
inv_abc_assignments_pub.create_abc_assignments(p_init_msg_list => fnd_api.g_true
,p_commit => fnd_api.g_false
,p_api_version_number => 1.0
,x_return_status => x_return_status
,x_msg_count => x_msg_count
,x_msg_data => x_msg_data
,p_abc_assignments_rec => l_abc_assignments_rec);
dbms_output.put_line(''x_msg_data:'' || x_msg_data);
END;
##<a name="2">2. 创建物料批次 </a>
##<a name="3">3. 物料组织分配 </a>
##4. 物料搬运单关闭头 ###<a name="4.1">4.1. 物料搬运单关闭头 </a>
###<a name="4.2">4.2. 物料搬运单关闭行 </a>
EBS oracle 批量导入更新 MOQ(最小拆分量、采购提前期、最小订购量、最小包装量)
EXCEL 的列:组织 id, 供应商编号,供应商地点,料号,最小拆分量、采购提前期、最小订购量、最小包装量
-- 采购导入更新 MOQ 四个值,若有为空的那列,会保留原来的值,不会去更新那列的值
PROCEDURE UPDATE_PO_MOQ AS
CURSOR PO_MOQ_CUR IS
SELECT ID,
TRIM(ORG_ID) ORG_ID,
trim(vendor_no) vendor_no,
trim(vendor_site) vendor_site,
trim(segment1) segment1,
TRIM(min_split_qty) min_split_qty,
TRIM(processing_lead_time) processing_lead_time,
TRIM(min_order_qty) min_order_qty,
TRIM(fixed_order_quantity) fixed_order_quantity
FROM CUX.UPDATE_PO_MOQ_TEMP1; --CUX.EXCEL_BOM_LMH;
E_CHECK EXCEPTION;
V_ERR_MESSAGE VARCHAR2(2000);
L_VENDOR_ID NUMBER :=0;
L_VENDOR_SITE NUMBER :=0;
l_INVENTORY_ITEM_ID number := 0;
-- l_ORGANIZATION_ID number := 0;
L_COUNT NUMBER := 0;
begin
BEGIN
-- 清空导入错误表
DELETE FROM CUX_IMPORT_DATA_ERROR;
FOR PO_MOQ_REC IN PO_MOQ_CUR LOOP
BEGIN
SELECT count(*) into L_COUNT
FROM MEG_CUX_ORG_V
WHERE OPERATING_UNIT = PO_MOQ_REC.ORG_ID;
EXCEPTION
WHEN NO_DATA_FOUND THEN
V_ERR_MESSAGE := '' 业务实体【'' || PO_MOQ_REC.ORG_ID || ''】不存在 -'';
RAISE E_CHECK;
END;
BEGIN
SELECT P.VENDOR_ID into L_VENDOR_ID
FROM PO_VENDORS P
WHERE SEGMENT1 = PO_MOQ_REC.VENDOR_NO;
EXCEPTION
WHEN NO_DATA_FOUND THEN
V_ERR_MESSAGE := '' 供应商编号【'' || PO_MOQ_REC.VENDOR_NO || ''】不存在 -'';
RAISE E_CHECK;
END;
BEGIN
SELECT T.VENDOR_SITE_ID INTO L_VENDOR_SITE
FROM AP_SUPPLIER_SITES_ALL T
WHERE vendor_site_code = PO_MOQ_REC.VENDOR_SITE
and T.VENDOR_ID=L_VENDOR_ID
AND org_id =PO_MOQ_REC.ORG_ID;
EXCEPTION
WHEN NO_DATA_FOUND THEN
V_ERR_MESSAGE := '' 供应商简称 / 地点【'' || PO_MOQ_REC.VENDOR_SITE || ''】不存在 -'';
RAISE E_CHECK;
END ;
BEGIN
select msi.inventory_item_id
into l_INVENTORY_ITEM_ID
from mtl_system_items_b msi
where msi.segment1 = PO_MOQ_REC.SEGMENT1
and msi.organization_id = 140;
EXCEPTION
WHEN NO_DATA_FOUND THEN
V_ERR_MESSAGE := '' 料号【'' || PO_MOQ_REC.SEGMENT1 || ''】不存在 -'';
RAISE E_CHECK;
END;
BEGIN
-- 为空的列,不更新,保留原来的值
UPDATE PO_ASL_ATTRIBUTES PAA
SET PAA.ATTRIBUTE1=nvl(PO_MOQ_REC.MIN_SPLIT_QTY,PAA.ATTRIBUTE1),
PAA.PROCESSING_LEAD_TIME=nvl(PO_MOQ_REC.PROCESSING_LEAD_TIME,PAA.PROCESSING_LEAD_TIME),
PAA.MIN_ORDER_QTY=nvl(PO_MOQ_REC.MIN_ORDER_QTY,PAA.MIN_ORDER_QTY),
PAA.FIXED_LOT_MULTIPLE=nvl(PO_MOQ_REC.FIXED_ORDER_QUANTITY,PAA.FIXED_LOT_MULTIPLE)
WHERE vendor_id= L_VENDOR_ID
AND vendor_site_id =L_VENDOR_SITE
AND item_id =l_INVENTORY_ITEM_ID;
EXCEPTION
WHEN E_CHECK THEN
INSERT INTO CUX_IMPORT_DATA_ERROR
(ID, COLUMN_VALUES, ERR_MESSAGE)
VALUES
(PO_MOQ_REC.ID,
''【'' || PO_MOQ_REC.VENDOR_NO || ''】-【'' ||
PO_MOQ_REC.SEGMENT1 || ''】'',
V_ERR_MESSAGE);
END;
END LOOP;
END;
COMMIT;
end UPDATE_PO_MOQ;
关于Oracle EBS INV 创建货位和oracle-ebs的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于APC&INV different about items、c – Mat.inv()在opencv中产生全零、EBS - INV 接口大全、EBS oracle 批量导入更新 MOQ(最小拆分量、采购提前期、最小订购量、最小包装量)的相关信息,请在本站寻找。
本文标签: