*-----定义
TYPES:BEGIN OF ty_invoicelist,
goodsname TYPE string, "商品名称
specification TYPE string, "商品规格
unit TYPE string, "单位
quantity(8) TYPE p DECIMALS 8, "数量
* unitprice(8) TYPE p DECIMALS 8, "单价
unitprice TYPE string, "单价
amount(8) TYPE p DECIMALS 2, "净值
taxamount(8) TYPE p DECIMALS 2, "税金
taxrate(8) TYPE p DECIMALS 2, "增值税税率
taxsign TYPE integer, "含税标记
revenuecode TYPE string, "税收分类编码
END OF ty_invoicelist.
DATA:BEGIN OF lv_input,
externaldocumentno TYPE string, "订单号
taxno TYPE string, "销方税号
purchasername TYPE string, "购方名称
purchaseremail TYPE string, "购方邮箱
invoicetype TYPE integer, "发票种类
logisticsflag TYPE integer, "是否邮寄
directinv TYPE integer, "是否直接开票
manualsplitting TYPE integer, "是否手工拆单
purchasertaxno TYPE string, "购方税号
remark TYPE string, "发票备注
purchaserbankaccount TYPE string, "全电购方银行账号
purchaserbankname TYPE string, "购方银行账户
purchasertel TYPE string, "全电购方电话
purchaseraddress TYPE string, "购方地址电话
details TYPE TABLE OF ty_invoicelist, "发票信息List
END OF lv_input,
lo_http_client TYPE REF TO if_http_client,
lv_url TYPE string, "http 服务接口地址
lv_access_token TYPE string,
lv_tax_token TYPE string,
lv_serial_toten TYPE string,
zflag TYPE c, "报错标志
lt_fields TYPE TABLE OF string,
lv_fieldname TYPE slis_fieldname,
lv_fieldtext TYPE slis_fieldname,
ls_invoicelist TYPE ty_invoicelist,
lt_invoicelist TYPE TABLE OF ty_invoicelist,
lv_request TYPE string,
lv_message TYPE string,
lv_code TYPE sysubrc,
lv_resp TYPE string,
BEGIN OF ls_output,
code TYPE string,
message TYPE string,
serialno TYPE string,
data TYPE boolean,
END OF ls_output,
lv_len TYPE i. "发送报文长度
*-----------------------------------------------------准备--------------------------------------------------*
*-----------------------------------------------------------------------------------------------------------*
*&-------获取数据(必填校验)
"X-Access-Token 令牌
SELECT SINGLE token FROM zrtfit142 INTO lv_access_token WHERE udate >= sy-datum .
IF sy-subrc <> 0.
PERFORM frm_msg USING 'E' l_logid '令牌在表zrtfit142中不存在' CHANGING e_msg-type
e_msg-logid
e_msg-message.
ENDIF.
LOOP AT i_itab INTO DATA(ls_itab) .
IF ls_itab-zlsdbh IS INITIAL.
PERFORM frm_msg USING 'E' l_logid '流水单编号不能为空!' CHANGING e_msg-type
e_msg-logid
e_msg-message.
RETURN.
ENDIF.
IF ls_itab-zdjrq IS INITIAL.
PERFORM frm_msg USING 'E' l_logid '单据日期不能为空!' CHANGING e_msg-type
e_msg-logid
e_msg-message.
RETURN.
ENDIF.
IF ls_itab-zsellertaxno IS INITIAL.
PERFORM frm_msg USING 'E' l_logid '销方税号不能为空!' CHANGING e_msg-type
e_msg-logid
e_msg-message.
RETURN.
ENDIF.
IF ls_itab-zbuyername IS INITIAL.
PERFORM frm_msg USING 'E' l_logid '购方名称不能为空!' CHANGING e_msg-type
e_msg-logid
e_msg-message.
RETURN.
ENDIF.
IF ls_itab-zemil IS INITIAL.
PERFORM frm_msg USING 'E' l_logid '电子邮箱不能为空!' CHANGING e_msg-type
e_msg-logid
e_msg-message.
RETURN.
ENDIF.
IF ls_itab-maktx IS INITIAL.
PERFORM frm_msg USING 'E' l_logid '商品描述(短文本)不能为空!' CHANGING e_msg-type
e_msg-logid
e_msg-message.
RETURN.
ENDIF.
IF ls_itab-mspec IS INITIAL.
PERFORM frm_msg USING 'E' l_logid '商品规格不能为空!' CHANGING e_msg-type
e_msg-logid
e_msg-message.
RETURN.
ENDIF.
IF ls_itab-taxamt IS INITIAL.
PERFORM frm_msg USING 'E' l_logid '税金不能为空!' CHANGING e_msg-type
e_msg-logid
e_msg-message.
RETURN.
ENDIF.
IF ls_itab-taxrate IS INITIAL.
PERFORM frm_msg USING 'E' l_logid '增值税税率不能为空!' CHANGING e_msg-type
e_msg-logid
e_msg-message.
RETURN.
ENDIF.
IF ls_itab-zbuyertaxno IS INITIAL.
PERFORM frm_msg USING 'E' l_logid '购方税号不能为空!' CHANGING e_msg-type
e_msg-logid
e_msg-message.
RETURN.
ENDIF.
IF ls_itab-zbuyeraddr IS INITIAL.
PERFORM frm_msg USING 'E' l_logid '购方地址电话不能为空!' CHANGING e_msg-type
e_msg-logid
e_msg-message.
RETURN.
ENDIF.
IF ls_itab-zbuyeracct IS INITIAL.
PERFORM frm_msg USING 'E' l_logid '购方银行账户不能为空!' CHANGING e_msg-type
e_msg-logid
e_msg-message.
RETURN.
ENDIF.
ENDLOOP.
IF e_msg-type <> 'E'.
*&-------设置http接口地址
lv_url = 'https:*‘.
*&------创建客户端请求
CALL METHOD cl_http_client=>create_by_url
EXPORTING
url = lv_url
IMPORTING
client = lo_http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
e_msg-type = 'E'.
e_msg-message = '创建http代理出错'.
e_msg-logid = l_logid.
EXIT.
ENDIF.
*&-----不显示登录界面
lo_http_client->propertytype_logon_popup = lo_http_client->co_disabled.
*&----- 设置content type和character set
lo_http_client->request->set_content_type( content_type = 'application/json; charset=utf-8' ).
*&------设置方法为 post
lo_http_client->request->set_method( if_http_request=>co_request_method_post ).
*&-------参数赋值
CLEAR:ls_itab.
READ TABLE i_itab INTO ls_itab INDEX 1.
IF sy-subrc = 0.
lv_tax_token = ls_itab-zsellertaxno.
lv_serial_toten = ls_itab-zlsdbh.
lv_input-externaldocumentno = ls_itab-zlsdbh.
lv_input-taxno = ls_itab-zsellertaxno.
lv_input-purchasername = ls_itab-zbuyername.
lv_input-purchaseremail = ls_itab-zemil.
IF ls_itab-zfplxdm IS INITIAL .
lv_input-invoicetype = '8'.
ELSE.
IF ls_itab-zfplxdm = '006'.
lv_input-invoicetype = '8'.
ELSEIF ls_itab-zfplxdm = '005'.
lv_input-invoicetype = '7'.
ELSEIF ls_itab-zfplxdm = '004'.
lv_input-invoicetype = '1'.
ELSEIF ls_itab-zfplxdm = '007'.
lv_input-invoicetype = '2'.
ENDIF.
ENDIF.
lv_input-logisticsflag = '0'.
lv_input-directinv = '0'.
lv_input-manualsplitting = '0'.
lv_input-purchasertaxno = ls_itab-zbuyertaxno.
* SPLIT ls_itab-zbuyeraddr AT '' INTO lv_input-purchaseraddress lv_input-purchasertel.
* SPLIT ls_itab-zbuyeracct AT '' INTO lv_input-purchaserbankname lv_input-purchaserbankaccount.
lv_input-purchaseraddress = ls_itab-zbuyeraddr .
lv_input-purchasertel = ls_itab-zgfdh.
lv_input-purchaserbankname = ls_itab-zbuyeracct .
lv_input-purchaserbankaccount = ls_itab-zgfkzh.
lv_input-remark = ls_itab-zremarks.
ENDIF.
CLEAR:ls_itab.
LOOP AT i_itab INTO ls_itab.
ls_invoicelist-goodsname = ls_itab-maktx.
ls_invoicelist-specification = ls_itab-mspec.
ls_invoicelist-unit = ls_itab-meins.
ls_invoicelist-quantity = ls_itab-fkimg.
ls_invoicelist-amount = ls_itab-ztzhje.
ls_invoicelist-taxamount = ls_itab-ztzhse.
SELECT SINGLE zssflbm INTO ls_invoicelist-revenuecode FROM zrtfit143 WHERE matkl = ls_itab-matkl.
IF ls_itab-taxrate IS INITIAL.
* SELECT SINGLE taxrate
* INTO ls_invoicelist-taxrate
* FROM zrtfit129 AS z
* INNER JOIN zrtfit143 AS r ON r~wgbez = z~maktx
* WHERE z~maktx = ls_itab-maktx
* AND r~zssflbm = ls_invoicelist-revenuecode.
ELSE.
ls_invoicelist-taxrate = ls_itab-taxrate.
ENDIF.
IF ls_itab-zhsbz IS INITIAL .
ls_invoicelist-taxsign = '0'.
ELSE.
ls_invoicelist-taxsign = ls_itab-zhsbz.
ENDIF.
APPEND ls_invoicelist TO lt_invoicelist.
CLEAR:ls_invoicelist.
lv_input-details = lt_invoicelist.
ENDLOOP.
*&-----X-Access-Token
lo_http_client->request->if_http_entity~set_header_field(
EXPORTING
name = 'X-Access-Token'
value = lv_access_token
).
*&-----X-Tax-Token
lo_http_client->request->if_http_entity~set_header_field(
EXPORTING
name = 'X-Tax-Token'
value = lv_tax_token
).
*&-----X-Serial-Token
lo_http_client->request->if_http_entity~set_header_field(
EXPORTING
name = 'X-Serial-Token'
value = lv_serial_toten
).
*&-------数据格式转换 DATA-->JSON
/ui2/cl_json=>serialize(
EXPORTING
data = lv_input
compress = abap_false
RECEIVING
r_json = lv_request
).
"大小写转换
REPLACE ALL OCCURRENCES OF 'EXTERNALDOCUMENTNO' IN lv_request WITH 'externalDocumentNo'.
REPLACE ALL OCCURRENCES OF 'TAXNO' IN lv_request WITH 'taxNo'.
REPLACE ALL OCCURRENCES OF 'PURCHASERNAME' IN lv_request WITH 'purchaserName'.
REPLACE ALL OCCURRENCES OF 'PURCHASEREMAIL' IN lv_request WITH 'purchaserEmail'.
REPLACE ALL OCCURRENCES OF 'INVOICETYPE' IN lv_request WITH 'invoiceType'.
REPLACE ALL OCCURRENCES OF 'LOGISTICSFLAG' IN lv_request WITH 'logisticsFlag'.
REPLACE ALL OCCURRENCES OF 'DIRECTINV' IN lv_request WITH 'directInv'.
REPLACE ALL OCCURRENCES OF 'MANUALSPLITTING' IN lv_request WITH 'manualSplitting'.
REPLACE ALL OCCURRENCES OF 'PURCHASERtaxNo' IN lv_request WITH 'purchaserTaxNo'.
REPLACE ALL OCCURRENCES OF 'REMARK' IN lv_request WITH 'remark'.
REPLACE ALL OCCURRENCES OF 'PURCHASERBANKACCOUNT' IN lv_request WITH 'purchaserBankAccount'.
REPLACE ALL OCCURRENCES OF 'PURCHASERBANKNAME' IN lv_request WITH 'purchaserBankName'.
REPLACE ALL OCCURRENCES OF 'PURCHASERTEL' IN lv_request WITH 'purchaserTel'.
REPLACE ALL OCCURRENCES OF 'PURCHASERADDRESS' IN lv_request WITH 'purchaserAddress'.
REPLACE ALL OCCURRENCES OF 'DETAILS' IN lv_request WITH 'details'.
REPLACE ALL OCCURRENCES OF 'GOODSNAME' IN lv_request WITH 'goodsName'.
REPLACE ALL OCCURRENCES OF 'SPECIFICATION' IN lv_request WITH 'specification'.
REPLACE ALL OCCURRENCES OF 'UNIT' IN lv_request WITH 'unit'.
REPLACE ALL OCCURRENCES OF 'QUANTITY' IN lv_request WITH 'quantity'.
REPLACE ALL OCCURRENCES OF 'unitPRICE' IN lv_request WITH 'unitPrice'.
REPLACE ALL OCCURRENCES OF 'AMOUNT' IN lv_request WITH 'amount'.
REPLACE ALL OCCURRENCES OF 'TAXamount' IN lv_request WITH 'taxAmount'.
REPLACE ALL OCCURRENCES OF 'TAXRATE' IN lv_request WITH 'taxRate'.
REPLACE ALL OCCURRENCES OF 'TAXSIGN' IN lv_request WITH 'taxSign'.
REPLACE ALL OCCURRENCES OF 'REVENUECODE' IN lv_request WITH 'revenueCode'.
*&------设置待传输内容
lv_len = strlen( lv_request ).
CALL METHOD lo_http_client->request->set_cdata
EXPORTING
data = lv_request
offset = 0
length = lv_len.
*-----------------------------------------------------发送--------------------------------------------------*
*-----------------------------------------------------------------------------------------------------------*
*&--------- 发送请求
lo_http_client->send(
EXCEPTIONS
http_communication_failure = 1 " Communication Error
http_invalid_state = 2 " Invalid state
http_processing_failed = 3 " Error when processing method
http_invalid_timeout = 4 " Invalid Time Entry
OTHERS = 5
).
IF sy-subrc <> 0.
lo_http_client->get_last_error( IMPORTING message = lv_message code = lv_code ).
e_msg-type = 'E'.
e_msg-message = lv_message.
e_msg-logid = l_logid.
EXIT.
ENDIF.
*-----------------------------------------------------接收--------------------------------------------------*
*-----------------------------------------------------------------------------------------------------------*
*&--------- 读取远程服务返回的结果消息
lo_http_client->receive(
EXCEPTIONS
http_communication_failure = 1 " Communication Error
http_invalid_state = 2 " Invalid state
http_processing_failed = 3 " Error when processing method
OTHERS = 4
).
IF sy-subrc <> 0.
lo_http_client->get_last_error( IMPORTING message = lv_message code = lv_code ).
e_msg-type = 'E'.
e_msg-message = lv_message.
e_msg-logid = l_logid.
EXIT.
ELSE.
*&-------读取返回返回内容
CLEAR lv_resp.
lv_resp = lo_http_client->response->get_cdata( ).
*&-------将字符串中的回车符替换,否则abap将会识别为#
REPLACE ALL OCCURRENCES OF REGEX '\n' IN lv_resp WITH space.
*&-------反序列化
/ui2/cl_json=>deserialize(
EXPORTING
json = lv_resp " JSON string
CHANGING
data = ls_output " Data to serialize
).
*&-------处理接口返回数据
IF ls_output-code = '200' .
e_msg-type = 'S'.
e_msg-message = '流水导入成功:' && ls_itab-zlsdbh && ls_output-message.
ELSE .
e_msg-type = 'E'.
e_msg-message = '流水导入失败:' && ls_itab-zlsdbh && ls_output-message.
ENDIF .
e_msg-logid = l_logid.
ENDIF.
ENDIF.
restful实践二(sap调用第三方)
最新推荐文章于 2024-03-24 14:12:26 发布