PROCEDURE call_web_service(x_return_status OUT NOCOPY VARCHAR2,
x_msg_count OUT NOCOPY NUMBER,
x_msg_data OUT NOCOPY VARCHAR2,
p_enent_rec IN cux_pub_push_iface_dtls%ROWTYPE,
x_request_xmltype OUT NOCOPY sys.xmltype,
x_response_xmltype OUT NOCOPY sys.xmltype) IS
l_api_name CONSTANT VARCHAR2(30) := 'call_web_service';
l_savepoint_name CONSTANT VARCHAR2(30) := 'SP01_call_ws';
l_soap_content CLOB := '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.common.qiku.kmss.landray.com/">
';
-- l_soap_content VARCHAR2(32767);
l_soap_request CLOB;
l_http_req utl_http.req;
l_http_resp utl_http.resp;
l_soap_respond VARCHAR2(32767);
l_resp_xml xmltype;
l_doc dbms_xmldom.domdocument;
l_docelem dbms_xmldom.domelement;
l_nodelist dbms_xmldom.domnodelist;
l_length NUMBER;
l_n dbms_xmldom.domnode;
l_case_num VARCHAR2(30);
l_flag VARCHAR2(30);
l_err_msg VARCHAR2(3000);
l_webservice_url VARCHAR2(3000);
CURSOR cs_info IS
SELECT pla.po_line_id, --行id
pha.org_id, --ou_id
hou.name, --ou名称
pv.vendor_name, --供应商名称--
pv.segment1 vendor_code, --供应商简码--
pha.agent_id, --采购员id
(SELECT ppf.employee_number
FROM per_people_f ppf
WHERE ppf.person_id = pha.agent_id
AND rownum = 1) agent_name, --采购员名称
pha.terms_id,
atv.name term_name, --付款条件--
pha.segment1 po_number, --po号--
pha.revision_num, --版本号--
pla.line_num, --行号--
pla.item_id, --物料id--
msib.segment1 item_code, --物料编码--
msib.description item_desc, --物料名称--
pla.quantity, --数量--
pla.unit_price no_tax_unit_price, --未含税单价--
NULL tax_unit_price, --含税单价--
nvl((SELECT MAX(a.tax_rate) / 100
FROM zx_lines a,
po_line_locations_all pll
WHERE a.application_id = 201
AND a.entity_code = 'PURCHASE_ORDER'
AND a.event_class_code = 'PO_PA'
AND a.trx_id = pll.po_header_id
AND a.trx_line_id = pll.line_location_id
AND pll.po_line_id = pla.po_line_id
AND a.tax_rate IS NOT NULL
/* AND nvl(a.cancel_flag,
'N') = 'N' */
AND (nvl(pll.cancel_flag,
'N') = 'Y' OR nvl(a.cancel_flag,
'N') = 'N')
),
0) tax_rate, --税率--
pla.quantity * pla.unit_price no_tax_total_amount, --未含税总额--
NULL tax_total_amount, --含税总金额--
pha.currency_code, --币种--
nvl(pha.rate,
1) rate, --汇率--
to_char(pha.rate_date,
'yyyy-mm-dd') rate_date, --汇率日期--
0 is_invoice, --是否已开票--
(SELECT nvl(ppf.FULL_NAME,fu.user_name)
FROM per_people_f ppf,
fnd_user fu
WHERE fu.employee_id = ppf.person_id(+)
AND fu.user_id = pha.created_by
AND rownum = 1) creator, --创建人--
to_char(SYSDATE,
'yyyy-mm-dd') create_date, --创建时间--
decode(nvl(pla.cancel_flag,
'N'),
'Y',
'0',
decode(nvl(pha.cancel_flag,
'N'),
'Y',
'0',
decode(nvl(pha.authorization_status,
'INCOMPLETE'),
'APPROVED',
'1',
'0'))) syn_status, --状态--
pha.comments remark --备注--
FROM po_headers_all pha,
po_lines_all pla,
hr_operating_units hou,
po_vendors pv,
ap_terms_vl atv,
mtl_system_items_b msib,
financials_system_params_all fspa
WHERE pha.po_header_id = pla.po_header_id
AND pha.org_id = hou.organization_id
AND pha.vendor_id = pv.vendor_id
AND atv.term_id = pha.terms_id
AND fspa.org_id = pha.org_id
AND pla.item_id = msib.inventory_item_id
AND fspa.inventory_organization_id = msib.organization_id
AND pha.po_header_id = get_number_from_varchar2(p_enent_rec.key_value1);
--l_webservice_url VARCHAR2(3000);
l_sec_content VARCHAR2(20000);
l_param_content VARCHAR2(20000);
l_warehouseid VARCHAR2(2000);
l_returncode VARCHAR2(2000);
l_returndesc VARCHAR2(2000);
l_returnflag NUMBER;
l_resultinfo VARCHAR2(2000);
l_put_flag VARCHAR2(1) := 'N';
--
l_req_txt_tbl dbms_sql.varchar2_table;
l_lengthb NUMBER;
l_round_flag varchar2(10);
BEGIN
-- start activity to create savepoint, check compatibility
-- and initialize message list, include debug message hint to enter api
x_return_status := hss_api.start_activity(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_savepoint_name => l_savepoint_name,
p_init_msg_list => fnd_api.g_false);
raise_exception(x_return_status);
-- API body
-- logging parameters
IF g_debug = 'Y' THEN
NULL;
END IF;
SELECT MAX(def.addition_info)
INTO l_webservice_url
FROM cux_00_imp_iface_system_def def
WHERE def.system_code = p_enent_rec.system_code;
--0.判断库存组织是否满足同步条件,不满足则退出执行
--自行补充逻辑
--1.根据iface_system_code获取web服务地址
--l_webservice_url:=;
--2.获取WMS参数
get_imis_sec_info(p_iface_system_code => p_enent_rec.system_code,
x_sec_content => l_sec_content);
/* cux_pub_iface_comm_api_utl.get_wms_sec_info(p_iface_system_code => p_enent_rec.system_code,
x_sec_content => l_sec_content,
x_param_content => l_param_content,
x_warehouseid => l_warehouseid);*/
--3.封装WMS安全性
l_soap_content := l_soap_content || l_sec_content;
l_soap_content := l_soap_content || ' <soapenv:Body>
<ser:getOrderInfo> ';
select max(get_round_flag(pha.org_id)) into l_round_flag from po_headers_all pha
where pha.po_header_id = get_number_from_varchar2(p_enent_rec.key_value1);
--4.按照业务需求获取单据信息并安装WS的要求封装报文
-- l_soap_content := l_soap_content || output_xml('<poInfo>');
FOR rec_doc_info IN cs_info
LOOP
l_soap_content := l_soap_content || '
<arg0>';
--业务实体--
l_soap_content := l_soap_content || output_xml(rec_doc_info.name,
'businessEntity');
--创建时间--
l_soap_content := l_soap_content || output_xml(rec_doc_info.create_date,
'createTime');
--币种--
l_soap_content := l_soap_content || output_xml(rec_doc_info.currency_code,
'currency');
--创建人--
l_soap_content := l_soap_content || output_xml( rec_doc_info.creator ,
'docCreator');
--汇率--
l_soap_content := l_soap_content || output_xml(rec_doc_info.rate,
'exchangeRate');
--汇率日期--
l_soap_content := l_soap_content || output_xml(rec_doc_info.rate_date,
'exchangeRateTime');
--行id--
l_soap_content := l_soap_content || output_xml(rec_doc_info.po_line_id,
'fdId');
--是否开过票--
l_soap_content := l_soap_content || output_xml(rec_doc_info.is_invoice,
'isGeneratePay');
--物料编码--
l_soap_content := l_soap_content || output_xml(rec_doc_info.item_code,
'materialCode');
--物料名称--
l_soap_content := l_soap_content || output_xml(rec_doc_info.item_desc,
'materialName');
--未含税单价--
l_soap_content := l_soap_content || output_xml(rec_doc_info.no_tax_unit_price,
'noTaxPrice');
--数量--
l_soap_content := l_soap_content || output_xml(rec_doc_info.quantity,
'orderCount');
--订单行号--
l_soap_content := l_soap_content || output_xml(rec_doc_info.line_num,
'orderLine');
--订单行id--
l_soap_content := l_soap_content || output_xml(rec_doc_info.po_line_id,
'orderLineid');
--订单号--
l_soap_content := l_soap_content || output_xml(rec_doc_info.po_number,
'orderNumber');
--版本号--
l_soap_content := l_soap_content || output_xml(rec_doc_info.revision_num,
'orderVersion');
--付款条件--
l_soap_content := l_soap_content || output_xml(rec_doc_info.term_name,
'payConditions');
--采购员--
l_soap_content := l_soap_content || output_xml( rec_doc_info.agent_name ,
'purchaser');
--备注--
l_soap_content := l_soap_content || output_xml(rec_doc_info.remark,
'remark');
--供应商区域--
l_soap_content := l_soap_content || output_xml(NULL,
'supplierArea');
--供应商代码--
l_soap_content := l_soap_content || output_xml(rec_doc_info.vendor_code,
'supplierCode');
--供应商名称--
l_soap_content := l_soap_content || output_xml(rec_doc_info.vendor_name,
'supplierName');
--状态--
l_soap_content := l_soap_content || output_xml(rec_doc_info.syn_status,
'synStatus');
--含税价格--
IF NVL(l_round_flag,'N')='Y' THEN
l_soap_content := l_soap_content || output_xml(round(rec_doc_info.no_tax_unit_price * (1 + nvl(rec_doc_info.tax_rate,
0)),2),
'taxPrice');
ELSE
l_soap_content := l_soap_content || output_xml(round(rec_doc_info.no_tax_unit_price * (1 + nvl(rec_doc_info.tax_rate,
0)),6),
'taxPrice');
END IF;
--税率--
l_soap_content := l_soap_content || output_xml(rec_doc_info.tax_rate,
'taxRate');
--含税金额--
IF NVL(l_round_flag,'N')='Y' THEN
l_soap_content := l_soap_content || output_xml(round(round(rec_doc_info.no_tax_unit_price * (1 + nvl(rec_doc_info.tax_rate,
0)),2) * rec_doc_info.quantity,2),
'taxTotalPrice');
ELSE
l_soap_content := l_soap_content || output_xml(round(round(rec_doc_info.no_tax_unit_price * (1 + nvl(rec_doc_info.tax_rate,
0)),6) * rec_doc_info.quantity,2),
'taxTotalPrice');
END IF;
l_soap_content := l_soap_content || '
</arg0>';
END LOOP;
/* l_soap_content := l_soap_content || output_xml('</poInfo>');
--5.封装WMS参数值
l_soap_content := l_soap_content || '
' || l_param_content;*/
--6.封装报文尾
l_soap_content := l_soap_content || output_xml(' </ser:getOrderInfo>
</soapenv:Body>
</soapenv:Envelope>');
-- DBMS_OUTPUT.put_line(l_soap_content);
--7.发起服务请求
l_soap_request := l_soap_content;
x_request_xmltype := xmltype.createxml(l_soap_request);
/* IF l_put_flag = 'N' THEN
GOTO end_call;
END IF;*/
--CLOB转varchar2数组
l_req_txt_tbl.delete;
l_lengthb := 0;
cux_pub_common_utl.get_clob2varchartbl(p_clob => l_soap_request,
x_varchartbl => l_req_txt_tbl,
x_lengthb => l_lengthb);
l_http_req := utl_http.begin_request(l_webservice_url,
'POST',
sys.utl_http.http_version_1_1);
utl_http.set_header(l_http_req,
'Content-Type',
'text/xml;charset=utf-8');
utl_http.set_header(l_http_req,
'Content-Length',
l_lengthb);
utl_http.set_header(l_http_req,
'SOAPAction',
'');
/* utl_http.write_text(l_http_req,
l_soap_request);*/
--字符数组循环写入报文
IF l_req_txt_tbl.count > 0 THEN
FOR i IN l_req_txt_tbl.first .. l_req_txt_tbl.last
LOOP
utl_http.write_text(l_http_req,
l_req_txt_tbl(i));
END LOOP;
END IF;
--End 20160509
--8.获取响应结果
l_http_resp := utl_http.get_response(l_http_req);
utl_http.read_text(l_http_resp,
l_soap_respond);
utl_http.end_response(l_http_resp);
-- utl_http.end_request(l_http_req);
l_resp_xml := xmltype.createxml(l_soap_respond);
x_response_xmltype := l_resp_xml;
/*l_doc := dbms_xmldom.newdomdocument(l_resp_xml);
l_docelem := dbms_xmldom.getdocumentelement(l_doc);
--9.解析响应报文
\* l_nodelist := dbms_xmldom.getelementsbytagname(l_docelem,
'return');
l_length := dbms_xmldom.getlength(l_nodelist);*\
l_nodelist := dbms_xmldom.getelementsbytagname(l_docelem,
'return');
l_length := dbms_xmldom.getlength(l_nodelist);
FOR i IN 0 .. (l_length - 1)
LOOP
l_n := dbms_xmldom.item(l_nodelist,i);
DBMS_OUTPUT.put_line(l_n.ID);
dbms_xslprocessor.valueof(l_n,
'text()',
l_resultinfo);
\* dbms_xslprocessor.valueof(l_n,
'returnCode/text()',
l_returncode);
dbms_xslprocessor.valueof(l_n,
'returnDesc/text()',
l_returndesc);
dbms_xslprocessor.valueof(l_n,
'returnFlag/text()',
l_returnflag);*\
END LOOP;
*/
BEGIN
SELECT xmltype(l_soap_respond).extract('//return/child::text()').getstringval()
INTO l_resultinfo
FROM dual;
EXCEPTION
WHEN OTHERS THEN
l_resultinfo := NULL;
END;
--10.调用出错,报错抛出异常退出
IF nvl(l_resultinfo,
'0') <> 'success' THEN
hss_api.set_message(p_app_name => 'CUX',
p_msg_name => 'CUX_WIP_CALL_PATS_WS_FAIL',
p_token1 => 'ERROR',
p_token1_value => l_returncode || '-' || l_returndesc || '-' || l_resultinfo);
x_return_status := fnd_api.g_ret_sts_error;
raise_exception(x_return_status);
ELSE
update_po_hearder(get_number_from_varchar2(p_enent_rec.key_value1));
END IF;
--11.调用成功则更新PO订单的attribute15为Y
--逻辑自行补充,注意同时更新last字段
-- <<end_call>>
-- API end body
-- end activity, include debug message hint to exit api
x_return_status := hss_api.end_activity(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_commit => fnd_api.g_false,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
EXCEPTION
WHEN fnd_api.g_exc_error THEN
BEGIN
utl_http.end_response(l_http_resp);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
x_return_status := hss_api.handle_exceptions(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_savepoint_name => l_savepoint_name,
p_exc_name => hss_api.g_exc_name_error,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
WHEN fnd_api.g_exc_unexpected_error THEN
BEGIN
utl_http.end_response(l_http_resp);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
x_return_status := hss_api.handle_exceptions(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_savepoint_name => l_savepoint_name,
p_exc_name => hss_api.g_exc_name_unexp,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
WHEN OTHERS THEN
BEGIN
utl_http.end_response(l_http_resp);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
x_return_status := hss_api.handle_exceptions(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_savepoint_name => l_savepoint_name,
p_exc_name => hss_api.g_exc_name_others,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
END call_web_service;