当前位置: 首页 > news >正文

SAP 附件增删改查与文件服务器交互应用

【需求背景】

非SAP标准附件应用,自定义一套,跟公司内部文档服务器交互,支持各个应用场景的附件增删改查等。

每个附件在文件服务器上都有一个文件唯一ID作为关键字。

应用分两块:SAP GUI端,跟WDA Portal端应用

GUI端效果如下:

1. HTTP接口获取文件

云盘附件获取  token获取 文档解析应用

电子附件地址存储表

tables:t001,ztfi1013_04.
data:gt_data type standard table of ztfi1013_05,
     gt_tab  type standard table of ztfi1013_04,
     gt_log  type standard table of ztfi1013_06,
     wa_data type ztfi1013_05,
     wa_tab  type ztfi1013_04,
     wa_log  type ztfi1013_06.

data:gs_json     type zsdoc003,
     gs_docs     type zsdoc001,
     gt_docs     type ztdoc010,
     gv_guid(36).
form frm_get_data .

  check s_datum[] is not initial.
  if rb_1 is initial..
    select * into corresponding fields of table gt_tab from ztfi1013_04
      where bukrs in s_bukrs
      and   datum in s_datum
      and   zjxzt = ''.
  else.
    select * into corresponding fields of table gt_tab from ztfi1013_04
      where bukrs in s_bukrs
      and   datum in s_datum.
  endif.

endform.

*&---------------------------------------------------------------------*
*&      Form  FRM_ANALYZE_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form frm_analyze_data .

  data:lv_docid    type string,
       ls_json     type zsdoc003,
       ls_docs     type zsdoc001,
       lt_docs     type ztdoc010,
       lt_rows     type standard table of string,
       wa_rows     type string,
       content     type string,
       conv        type ref to cl_abap_conv_in_ce,
       count       type i,
       field01(50),
       field02(50),
       field03(50),
       field04(50),
       field05(50),
       field06(50),
       field07(50),
       field08(50),
       field09(50),
       field10(50),
       field11(50),
       field12(50),
       field13(50),
       field14(50),
       field15(50),
       field16(50),
       field17(50),
       field18(50).
  loop at gt_tab into wa_tab.
    ls_docs-docid = wa_tab-docid_txt.
    lv_docid      = wa_tab-docid_txt.
    append ls_docs to lt_docs.

    perform frm_get_guid changing gv_guid.

    "获取file attr
    zcl_wd_json=>get_files(
      exporting
        it_docs = lt_docs " 文档结构表类型
      importing
        ev_msg  = data(lv_msg)
        es_json = ls_json ).

    "获取token
    zcl_wd_json=>get_docid_token(
          exporting
             iv_docid = lv_docid                            "|14563|
          receiving
             ev_token = data(lv_token) ).

    data(ls_rows) = ls_json-rows[ 1 ].

    data(lv_url) = ls_rows-downloadurl && '&f_token=' && lv_token.

    "getting doc for bin
    zcl_wd_docx=>get(
         exporting
*        iv_type    = 'X'
           iv_url     = lv_url
         importing
           ev_xstring = data(lv_xstring)
           ev_msg     = lv_msg ).

    if lv_xstring is not initial.
      conv = cl_abap_conv_in_ce=>create( input = lv_xstring ).
      conv->read( importing data = content ).
      split content at cl_abap_char_utilities=>cr_lf into table lt_rows .

      loop at lt_rows into wa_rows .
        split wa_rows at cl_abap_char_utilities=>horizontal_tab
        into
        field01
        field02
        field03
        field04
        field05
        field06
        field07
        field08
        field09
        field10
        field11
        field12
        field13
        field14
        field15
        field16
        field17
        field18.

        wa_data-posnm   = field01.
        wa_data-skjlid  = field02.
        wa_data-zskje   = field03.
        wa_data-jylnm   = field04.
        wa_data-zshbm   = field05.
        wa_data-shddh   = field06.
        wa_data-dzriq   = field07.
        wa_data-jyshj   = field08.
        wa_data-jyjin   = field09.
        wa_data-shoux   = field10.
        wa_data-zjies   = field11.
        wa_data-zpici   = field12.
        wa_data-belnr   = field13.
        wa_data-zcank   = field14.
        wa_data-zsdhh   = field15.
        wa_data-qdshh   = field16.
        wa_data-qdzdh   = field17.
        wa_data-possn   = field18.
        wa_data-bukrs   = wa_tab-bukrs.
        wa_data-cname   = sy-uname.
        wa_data-datum   = sy-datum.
        wa_data-uzeit   = sy-uzeit.
        call function 'CIF_GEN4_CONVERT_DATETIME'
          exporting
            iv_date                = sy-datum
            iv_time                = sy-uzeit
            iv_timezone            = sy-zonlo
          importing
            ev_timestamp           = wa_data-timestamp
          exceptions
            time_conversion_failed = 1
            others                 = 2.
        append wa_data to gt_data.
        clear: wa_data.
      endloop .
      count = lines( gt_data ).
      perform frm_add_successful_msg using gv_guid wa_tab-guiid count.
    else.
      perform frm_add_error_msg using gv_guid wa_tab-guiid lv_msg.
    endif.

    clear:lt_docs,ls_json,lv_docid,lv_url,lv_msg,lv_xstring,
          field01,field02,field03,field04,field05,field06,
          field07,field08,field09,field10,field11,field12,
          field13,field14,field15,field16,field17,field18,
          count.
  endloop.
endform.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_GUIID
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_ENDIF  text
*----------------------------------------------------------------------*
form frm_get_guid  changing cv_guid.

  call function 'RS_DME_MG_GENERATE_GUID'
    importing
      e_guid_32 = cv_guid.

endform.

通过HTTP接口获取文档服务器附件

METHOD get_files.

    DATA : ls_c010 TYPE zsdoc001.
    DATA : lv_docs TYPE string.

    DATA : lr_client       TYPE REF TO if_http_client,
           lv_url          TYPE string,
           lv_content_type TYPE string VALUE 'application/x-www-form-urlencoded',
           ev_xstring      TYPE xstring,
           ex_string       TYPE string.

    IF lines( it_docs ) = 0.
      ev_msg = '文档ID不能为空!'.
      RETURN .
    ENDIF.

    "文件ID集
    LOOP AT it_docs INTO ls_c010.
      lv_docs = lv_docs && ls_c010-docid && ','.
    ENDLOOP.

    "get url
    lv_url = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'GET_FILES2' ).

    IF lv_url IS INITIAL.
      ev_msg = '未获取到URL!'.
      RETURN .
    ENDIF.

    "get APIKEY
    DATA(lv_apikey) = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'APIKEY' ).

    lv_url = lv_url && |?fileId=| && lv_docs && |&{ lv_apikey }| .

    TRY .

        "创建http对象
        cl_http_client=>create_by_url(
          EXPORTING
          url                = lv_url
          IMPORTING
          client             = lr_client
           EXCEPTIONS
           argument_not_found = 1
           plugin_not_active  = 2
           internal_error     = 3
           OTHERS             = 4 ).

* set protocol version
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~server_protocol'
            value = 'HTTP/1.1'.
* 提交方式
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~request_method'
            value = 'GET'.
* 传参方式: application/json,application/x-www-form-urlencoded
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = 'Content-Type'
            value = lv_content_type.


* 发送
        CALL METHOD lr_client->send
          EXPORTING
            timeout                    = 200
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3
            OTHERS                     = 4.

        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 获取返回
        CALL METHOD lr_client->receive
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3.
        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 返回
        ev_xstring = lr_client->response->get_data( ).

* XSTRING to STRING
        CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
          EXPORTING
            im_xstring  = ev_xstring
            im_encoding = 'UTF-8'
          IMPORTING
            ex_string   = ex_string.

        CALL TRANSFORMATION id
                         SOURCE XML ex_string
                         RESULT status = es_json-status
                                rows = es_json-rows
                                msg = es_json-msg.

      CATCH cx_root .
        ev_msg = '异常'.
    ENDTRY.

    lr_client->close( ).


  ENDMETHOD.
 

 获取文件token 

METHOD get_docid_token.
    DATA : lr_client       TYPE REF TO if_http_client,
           lv_url          TYPE string,
           lv_content_type TYPE string VALUE 'application/x-www-form-urlencoded',
           ev_xstring      TYPE xstring,
           ex_string       TYPE string.

    DATA : ev_msg TYPE string.

    "获取token地址
*    lv_url = gv_get_token1 && gv_get_token2 && iv_docid.

    IF iv_docid IS INITIAL.
      ev_msg = '文档ID不能为空!'.
      RETURN.
    ENDIF.

    "get url
    lv_url = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'GET_TOKEN' ).

    IF lv_url IS INITIAL.
      ev_msg = '未获取到URL!'.
      RETURN.
    ENDIF.

    DATA(lv_apikey) = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'APIKEY' ).

    lv_url = lv_url && iv_docid && |&{ lv_apikey }|.

    TRY .

        "创建http对象
        cl_http_client=>create_by_url(
          EXPORTING
          url                = lv_url
          IMPORTING
          client             = lr_client
           EXCEPTIONS
           argument_not_found = 1
           plugin_not_active  = 2
           internal_error     = 3
           OTHERS             = 4 ).

* set protocol version
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~server_protocol'
            value = 'HTTP/1.1'.
* 提交方式
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~request_method'
            value = 'GET'.
* 传参方式: application/json,application/x-www-form-urlencoded
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = 'Content-Type'
            value = lv_content_type.

* 发送
        CALL METHOD lr_client->send
          EXPORTING
            timeout                    = 200
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3
            OTHERS                     = 4.

        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 获取返回
        CALL METHOD lr_client->receive
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3.
        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 返回
        ev_xstring = lr_client->response->get_data( ).

* XSTRING to STRING
        CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
          EXPORTING
            im_xstring  = ev_xstring
            im_encoding = 'UTF-8'
          IMPORTING
            ex_string   = ex_string.

        CALL TRANSFORMATION id
                         SOURCE XML ex_string
                         RESULT token = ev_token.
      CATCH cx_root .
        ev_msg = '异常'.
    ENDTRY.

    lr_client->close( ).
  ENDMETHOD.
 

获取文档内容转换成BIN二进制

METHOD get.

    DATA : lr_client       TYPE REF TO if_http_client,
           lv_url          TYPE string,
           lv_content_type TYPE string VALUE 'application/x-www-form-urlencoded',

           ex_string       TYPE string,
           lv_ip           TYPE string.

    TRY .

        IF iv_url IS INITIAL.
          lv_url = 'http://xxx/api.action?acmod=downloadcommfile&id=445&revision=0&apikey=9b11127a9701975c734b8aee81ee3526&usid=fbd672e88c900f26a0221af266cd22ba-fe1b9a223ba095ff-attachment'.
        ELSE.

          IF iv_type EQ 'X'.
            lv_url =   iv_url.
          ELSE.
            lv_ip = get_ip( ).
            lv_url = lv_ip && iv_url.
          ENDIF.

        ENDIF.

        "创建http对象
        cl_http_client=>create_by_url(
          EXPORTING
          url                =  lv_url
          IMPORTING
          client             = lr_client
           EXCEPTIONS
           argument_not_found = 1
           plugin_not_active  = 2
           internal_error     = 3
           OTHERS             = 4 ).


* set protocol version
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~server_protocol'
            value = 'HTTP/1.1'.
* 提交方式
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~request_method'
            value = 'GET'.
* 传参方式: application/json,application/x-www-form-urlencoded
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = 'Content-Type'
            value = lv_content_type.

*        CALL METHOD lr_client->request->set_header_field
*          EXPORTING
*            name  = 'Charset'
*            value = 'utf-16'.


* 发送
        CALL METHOD lr_client->send
          EXPORTING
            timeout                    = 200
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3
            OTHERS                     = 4.

        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).

          RETURN.
        ENDIF.

* 获取返回
        CALL METHOD lr_client->receive
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3.
        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).

          RETURN.
        ENDIF.

        ev_xstring = lr_client->response->get_data( ).

      CATCH cx_abapcg_exception  .
        ev_msg = '异常'.

        RETURN.
    ENDTRY.

* 关闭链接ie
    lr_client->close( ).


  ENDMETHOD.
 

获取文件信息(转成内表)

通过上传URL获取json数据并转换为内表

文件信息转换步骤: XSTRING to STRING, JSON转成内表

* XSTRING to STRING
        CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
          EXPORTING
            im_xstring  = ev_xstring
            im_encoding = 'UTF-8'
          IMPORTING
            ex_string   = ex_string.

*    "json to itab
        CALL TRANSFORMATION id
                             SOURCE XML ex_string
                             RESULT status = es_json-status
                                    msg = es_json-msg
                                    rows = es_json-rows.

METHOD get_itab_for_json.
    DATA : lr_client       TYPE REF TO if_http_client,
           lv_url          TYPE string,
           lv_content_type TYPE string VALUE 'application/x-www-form-urlencoded',
           ev_xstring      TYPE xstring,
           ex_string       TYPE string.

*    IF iv_guid IS INITIAL.
*      lv_url = |http://10.0.2.31/ws/restful/SAPDocRestService/getSAPFormFile?guid=123|.
*    ELSE.
*      lv_url = gv_url_getfiles && iv_guid .
*    ENDIF.

    IF iv_guid IS INITIAL.
      ev_msg = 'GUID不能为空!'.
      RETURN.
    ENDIF.

    "get url
    lv_url = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'GET_FILES' ).

    IF lv_url IS INITIAL.
      ev_msg = '未获取到URL!'.
      RETURN.
    ENDIF.

    "get APIKEY
    DATA(lv_apikey) = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'APIKEY' ).

    lv_url = lv_url && iv_guid && |&{ lv_apikey }|.

    TRY .

        "创建http对象
        cl_http_client=>create_by_url(
          EXPORTING
          url                = lv_url
          IMPORTING
          client             = lr_client
           EXCEPTIONS
           argument_not_found = 1
           plugin_not_active  = 2
           internal_error     = 3
           OTHERS             = 4 ).

* set protocol version
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~server_protocol'
            value = 'HTTP/1.1'.
* 提交方式
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~request_method'
            value = 'GET'.
* 传参方式: application/json,application/x-www-form-urlencoded
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = 'Content-Type'
            value = lv_content_type.

* 填充参数
*  CLEAR lv_len.
*  lv_len = strlen( iv_json ).
*  IF lv_len GT 0.
*    CALL METHOD lr_client->request->set_cdata   " Removed APPEND_CDATA
*      EXPORTING
*        data   = iv_json
*        offset = 0
*        length = lv_len.
*  ENDIF.

* 发送
        CALL METHOD lr_client->send
          EXPORTING
            timeout                    = 200
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3
            OTHERS                     = 4.

        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 获取返回
        CALL METHOD lr_client->receive
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3.
        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 返回
*  CLEAR: lv_xjson .
        ev_xstring = lr_client->response->get_data( ).

* XSTRING to STRING
        CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
          EXPORTING
            im_xstring  = ev_xstring
            im_encoding = 'UTF-8'
          IMPORTING
            ex_string   = ex_string.

*    "json to itab
        CALL TRANSFORMATION id
                             SOURCE XML ex_string
                             RESULT status = es_json-status
                                    msg = es_json-msg
                                    rows = es_json-rows.

      CATCH cx_abapcg_exception  .
        ev_msg = '异常'.
    ENDTRY.

* 关闭链接ie
    lr_client->close( ).
  ENDMETHOD.
 

2. 附件上传到文件服务器

自定义一个FUNCTION GROUP 实现附件上传到文件服务器

FUNCTION zfifm_0010.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(IV_GUID) TYPE  GUID_32
*"     VALUE(IV_PZFJ) TYPE  BOOLEAN OPTIONAL
*"  EXPORTING
*"     REFERENCE(EV_DOCS) TYPE  ZSDOC003
*"----------------------------------------------------------------------
  gv_pzfj = iv_pzfj.  

  lcl_main=>start( iv_guid ).
  ev_docs = lcl_main=>get_docs( ).
ENDFUNCTION.
 

LZFG_FI0012TOP

FUNCTION-POOL zfg_fi0012.                   "MESSAGE-ID ..

* INCLUDE LZFG_FI0012D...                    " Local class definition


*---------------------------------------------------------------------*
*           CONSTANTS DATA                                            *
*---------------------------------------------------------------------*
CONSTANTS:
  c_html TYPE string VALUE 'https://10.0.2.31/common/vanke/erp/pd/attachment.htm',
  c_open TYPE string VALUE 'http://10.0.2.31'.


*---------------------------------------------------------------------*
*           VARIABLES AND INTERNAL TABLES DATA                        *
*---------------------------------------------------------------------*
DATA: ok_code TYPE syst-ucomm,
      save_ok TYPE syst-ucomm.
DATA: lf_flag TYPE flag.     " 为X,则上传;否则打开文档 --
DATA: lr_cont     TYPE REF TO cl_gui_custom_container,
      lr_html     TYPE REF TO cl_gui_html_viewer,
      lr_timer    TYPE REF TO cl_gui_timer. "add yisz 2023/5/16

DATA: gv_surl TYPE c LENGTH 2048."ADD BY CBJ 20200819
DATA  gv_pzfj TYPE boolean.  "add yisz 2023/5/16
 

LZFG_FI0012M01    屏幕的PBO/PAI事件

*&---------------------------------------------------------------------*
*&  包含                LZFG_FI0012M01
*&---------------------------------------------------------------------*


*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.

  DATA fcode TYPE TABLE OF sy-ucomm.
  REFRESH fcode.

  IF gv_pzfj = abap_true.
    APPEND 'ZUP' TO fcode.
    SET PF-STATUS '0100'  EXCLUDING fcode.
  ELSE.
    
    SET PF-STATUS '0100'.
  ENDIF.
  SET TITLEBAR '0100'.
  lcl_main=>exec_html( ).
ENDMODULE. " STATUS_0100 OUTPUT


*&---------------------------------------------------------------------*
*&      Module  EXIT_0100  INPUT
*&---------------------------------------------------------------------*
MODULE exit_0100 INPUT.
  save_ok = ok_code.  CLEAR: ok_code.
  CASE save_ok.
    WHEN  'ESC'.
      SET SCREEN 0.
      LEAVE SCREEN.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE. " EXIT_0100 INPUT


*&---------------------------------------------------------------------*
*&   Module  USER_COMMAND_0100  INPUT  TEXT: 响应键盘鼠标事件 --
*&---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  save_ok = ok_code.  CLEAR: ok_code.
  CASE save_ok.
    WHEN  'S_OK'.
      IF lf_flag IS NOT INITIAL.   "如果是上传文件 --
        lcl_main=>get_file( ).
      ENDIF.
      SET SCREEN 0.  LEAVE SCREEN.
    WHEN 'ZUP'.
      CALL FUNCTION 'CALL_BROWSER'
        EXPORTING
          url                    = gv_surl
*         WINDOW_NAME            = ' '
*         NEW_WINDOW             = ' '
*         BROWSER_TYPE           =
*         CONTEXTSTRING          =
        EXCEPTIONS
          frontend_not_supported = 1
          frontend_error         = 2
          prog_not_found         = 3
          no_batch               = 4
          unspecified_error      = 5
          OTHERS                 = 6.
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ENDIF.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
 

LZFG_FI0012F01

*&---------------------------------------------------------------------*
*&  包含                LZFG_FI0012F01
*&---------------------------------------------------------------------*

*----------------------------------------------------------------------*
*      CLASS lcl_main DEFINITION FINAL CREATE PRIVATE                  *
*----------------------------------------------------------------------*
CLASS lcl_main DEFINITION FINAL CREATE PRIVATE.
  PUBLIC SECTION.
    CLASS-METHODS: start IMPORTING iv_guid TYPE guid_32,
      exec_html, get_file,
      bowr_html IMPORTING iv_surl TYPE clike,
      get_docs RETURNING VALUE(es_data) TYPE zsdoc003,
      open_file IMPORTING iv_guid  TYPE guid_32
                          iv_docid TYPE ze_docid,
      open_url  IMPORTING iv_docid   TYPE ze_docid
                          iv_url_dwn TYPE ze_downloadurl1 .
  PRIVATE SECTION.
    CLASS-DATA: lv_guid TYPE string,
                lv_surl TYPE c LENGTH 2048,
                ls_json TYPE zsdoc003.
ENDCLASS. "lcl_main DEFINITION --

"DATA: evt_receiver TYPE REF TO lcl_main.
"html viewer事件
*CLASS c1_event DEFINITION.
*  PUBLIC SECTION.
*    CLASS-METHODS:m_sapevent FOR EVENT sapevent OF cl_gui_html_viewer
*      IMPORTING action frame getdata postdata query_table.
*ENDCLASS.
*
*CLASS c1_event IMPLEMENTATION.
*  METHOD m_sapevent.
*    DATA:lv_str TYPE string.
*    DATA:lt_postdata TYPE cnht_post_data_tab.
*    DATA:ls_postdata LIKE LINE OF lt_postdata.
*    DATA:lt_edquery TYPE cnht_query_table.
*    DATA:ls_edquery LIKE LINE OF lt_edquery.
*    lv_str = 'action:' && action
*      && ';frame' && frame
*      && ';getdata' && getdata.
*    lt_postdata = postdata.
*    lt_edquery = query_table.
*    IF lt_postdata IS NOT INITIAL.
*      READ TABLE lt_postdata INTO ls_postdata INDEX 1.
*    ENDIF.
*    lv_str = lv_str && ';' && ls_postdata.
*    LOOP AT lt_edquery INTO ls_edquery.
*      lv_str = lv_str && ';name='
*        && ls_edquery-name
*        && '-'
*        && ls_edquery-value.
*    ENDLOOP.
*    MESSAGE lv_str TYPE 'I'.
*  ENDMETHOD.
*ENDCLASS.
"add yisz 2023/5/16 end

*----------------------------------------------------------------------*
*       CLASS lcl_main IMPLEMENTATION                                  *
*----------------------------------------------------------------------*
CLASS lcl_main IMPLEMENTATION.
  METHOD start.             " 程序入口 --
    lv_guid = iv_guid.
    lf_flag = 'X'.

    CALL SCREEN 0100 STARTING AT 5 5
                       ENDING AT 65 20.
  ENDMETHOD.               " start --

  METHOD exec_html.             " 执行附件上传的HTML --
**** modify by Nicolas 20170417 start*******************
    DATA: lv_url TYPE string.
    lv_url = zcl_wd_json=>get_system_url(
       iv_system = 'DMS'
       iv_action = 'UPLOAD' ).

**** modify by Nicolas 20170417 end*******************
    IF lf_flag IS NOT INITIAL.
*      lv_surl = c_html && '?guid=' && lv_guid.
      lv_surl = lv_url && '?guid=' && lv_guid.
      lv_surl = lv_surl && '&apikey=14c20740acb1bff7fc1784625a268a9b'.
      lv_surl = lv_surl && '&usid=fbd672e88c900f26a0221af266cd22ba-79c0917cb7620f12-attachment'.

      "add yisz 2023/5/16 begin
      IF gv_pzfj = abap_true.
*        lv_surl = lv_surl && |&fileTypes=| && 'pdf,PDF,MSG,msg,OFD,ofd,PNG,png,JPG,jpg,xls,XLS,xlsm,XLSM,xlsx,XLSX,eml,EML'.
        lv_surl = lv_surl && |&fileTypes=| && 'pdf,PDF,OFD,ofd,PNG,png,JPG,jpg,xls,XLS,xlsm,XLSM,xlsx,XLSX'.
      ENDIF.
      "add yisz 2023/5/16 end

    ENDIF.
    CLEAR:gv_surl.
    gv_surl = lv_surl."ADD BY CBJ 20200819
    bowr_html( lv_surl ).

    "add yisz 2023/5/16 begin
    IF gv_pzfj = abap_true.
      CALL FUNCTION 'CALL_BROWSER'
        EXPORTING
          url                    = gv_surl
        EXCEPTIONS
          frontend_not_supported = 1
          frontend_error         = 2
          prog_not_found         = 3
          no_batch               = 4
          unspecified_error      = 5
          OTHERS                 = 6.
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ENDIF.
    ENDIF.
    "add yisz 2023/5/16 end

  ENDMETHOD.               " exec_html --


  METHOD bowr_html.             " 浏览网页 --
    DATA: lv_surl TYPE c LENGTH 2048.
    IF lr_cont IS INITIAL.
      CREATE OBJECT lr_cont
        EXPORTING
          container_name = 'HTML'
        EXCEPTIONS
          OTHERS         = 1.

      "create _html_viewer object
      CREATE OBJECT lr_html
        EXPORTING
          parent = lr_cont.

*      "add yisz 2023/5/16 begin
*      IF gv_pzfj = abap_true.
*        "设置event
*        "ls_events-eventid = cl_gui_html_viewer=>m_id_navigate_complete.
*        "APPEND ls_events TO lt_events.
*
*        ls_events-eventid = lr_html->m_id_sapevent.
*        ls_events-appl_event = 'X'.
*        APPEND ls_events TO lt_events.
*        lr_html->set_registered_events( events = lt_events ).
*        SET HANDLER c1_event=>m_sapevent FOR lr_html.
*
**      IF lr_timer IS INITIAL.
**        CREATE OBJECT lr_timer
**          EXCEPTIONS
**            error  = 1
**            OTHERS = 2.
**        IF sy-subrc <> 0.
**          MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
**          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
**        ENDIF.
**
**        lr_timer->interval = 300.
**        CALL METHOD lr_timer->run
**          EXCEPTIONS
**            error  = 1
**            OTHERS = 2.
**      ENDIF.
*      ENDIF.

    ENDIF.

    "使用GUI显示html
    lv_surl = iv_surl.
    CALL METHOD lr_html->show_url
      EXPORTING
        url                  = lv_surl
      EXCEPTIONS
        cnht_error_parameter = 1
        OTHERS               = 2.
    CALL METHOD lr_html->do_refresh.

    IF lf_flag IS INITIAL.
      SET SCREEN 0.
      LEAVE SCREEN.
    ENDIF.
  ENDMETHOD.               " bowr_html --

  METHOD get_file.             " 获取文件信息 --
    DATA: lv_msgt TYPE string.
    CLEAR ls_json.
    zcl_wd_json=>get_itab_for_json(
      EXPORTING iv_guid = lv_guid
      IMPORTING ev_msg  = lv_msgt es_json = ls_json ).
  ENDMETHOD.               " get_file --

  METHOD get_docs.             " 获取文件服务器的文档信息 --
    es_data = ls_json.
    CLEAR:ls_json.
  ENDMETHOD.               " get_docs --

  METHOD open_file.             " 打开文件 --
    DATA: ls_docs  TYPE zsdoc002,
          lt_docs  TYPE ztdoc002,
          lv_docid TYPE string,
          lv_token TYPE string.

    lv_guid = iv_guid.  lf_flag = space.
    get_file( ).
    CHECK ls_json-rows IS NOT INITIAL.
    lt_docs = ls_json-rows.
    "MOD BY CBJ 20190620
*    READ TABLE LT_DOCS INTO LS_DOCS INDEX 1.
    READ TABLE lt_docs INTO ls_docs WITH KEY id = iv_docid.
    "END MOD

    DATA: lv_url TYPE string.
    lv_url = zcl_wd_json=>get_system_url(
       iv_system = 'DMS'
       iv_action = 'IP' ).
*    lv_surl = c_open && ls_docs-downloadurl.
    lv_surl = lv_url && ls_docs-downloadurl.
    lv_docid = iv_docid.
    lv_token = zcl_wd_json=>get_docid_token( iv_docid = lv_docid ).
    lv_surl = lv_surl && '&f_token=' && lv_token.

    CALL SCREEN 0100 STARTING AT 5 5
                       ENDING AT 65 20.
  ENDMETHOD.               " open_file --

  METHOD open_url.
    DATA: ls_docs  TYPE zsdoc002,
          lt_docs  TYPE ztdoc002,
          lv_docid TYPE string,
          lv_token TYPE string.        " 打开文件 --
    lv_surl = iv_url_dwn.

    lv_docid = iv_docid.
    lv_token = zcl_wd_json=>get_docid_token( iv_docid = lv_docid ).
    lv_surl = lv_surl && '&f_token=' && lv_token.

    CALL SCREEN 0100 STARTING AT 5 5
                       ENDING AT 65 20.
  ENDMETHOD.               " open_file --
ENDCLASS. "lcl_main IMPLEMENTATION --
 

调用上传文件服务器

FORM frm_attach_add .

  DATA:
    lv_guid TYPE guid_32,
    ls_d003 TYPE zsdoc003,
    ls_alv2 LIKE gs_alv2,
    ls_d002 TYPE zsdoc002,
    lt_d002 TYPE ztdoc002,
    lv_row  TYPE i.

  CLEAR: lv_row, lv_guid.
  lv_guid = zcl_pubfm=>get_guid( ).
  CALL FUNCTION 'ZFIFM_0010'
    EXPORTING
      iv_guid = lv_guid
    IMPORTING
      ev_docs = ls_d003.
  CHECK ls_d003-rows IS NOT INITIAL.

  lt_d002 = ls_d003-rows.
  READ TABLE lt_d002 INTO ls_d002 INDEX 1.

* 更新 信息
  go_grid2->get_current_cell( IMPORTING e_row = lv_row ).
  READ TABLE gt_alv2 INTO ls_alv2 INDEX lv_row.
  ls_alv2-iguid = lv_guid.       " 文档主键GUID --
  ls_alv2-docid = ls_d002-id.    " JAVA文档ID流水号 --
  ls_alv2-zfjmc = ls_d002-name.  " 文档名称 --
  ls_alv2-erdat = sy-datum.      " 上传日期 --

  MODIFY gt_alv2 FROM ls_alv2 INDEX lv_row.
  CLEAR ls_d003.  FREE lt_d002.

  go_grid2->refresh_table_display( ).

ENDFORM.

3. 其他文档相关方法封装

3.1 删除文档

METHOD delete_files_for_json.
    DATA : ls_c010 TYPE zsdoc001.
    DATA : lv_docs TYPE string.

    DATA : lr_client       TYPE REF TO if_http_client,
           lv_url          TYPE string,
           lv_content_type TYPE string VALUE 'application/x-www-form-urlencoded',
           ev_xstring      TYPE xstring,
           ex_string       TYPE string.

    IF lines( it_docs ) = 0.
      ev_msg = '文档ID不能为空!'.
      RETURN .
    ENDIF.

    "文件ID集
    LOOP AT it_docs INTO ls_c010.
      lv_docs = lv_docs && ls_c010-docid && ','.
    ENDLOOP.

    "删除POST地址
*    lv_url = gv_url_dele && lv_docs.

    "get url
    lv_url = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'DELETE' ).

    IF lv_url IS INITIAL.
      ev_msg = '未获取到URL!'.
      RETURN .
    ENDIF.

    DATA(lv_apikey) = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'APIKEY' ).

    lv_url = lv_url && lv_docs && |&{ lv_apikey }|.

    TRY .

        "创建http对象
        cl_http_client=>create_by_url(
          EXPORTING
          url                = lv_url
          IMPORTING
          client             = lr_client
           EXCEPTIONS
           argument_not_found = 1
           plugin_not_active  = 2
           internal_error     = 3
           OTHERS             = 4 ).

* set protocol version
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~server_protocol'
            value = 'HTTP/1.1'.
* 提交方式
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~request_method'
            value = 'GET'.
* 传参方式: application/json,application/x-www-form-urlencoded
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = 'Content-Type'
            value = lv_content_type.


* 发送
        CALL METHOD lr_client->send
          EXPORTING
            timeout                    = 200
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3
            OTHERS                     = 4.

        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 获取返回
        CALL METHOD lr_client->receive
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3.
        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 返回
        ev_xstring = lr_client->response->get_data( ).

* XSTRING to STRING
        CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
          EXPORTING
            im_xstring  = ev_xstring
            im_encoding = 'UTF-8'
          IMPORTING
            ex_string   = ex_string.

        CALL TRANSFORMATION id
                         SOURCE XML ex_string
                         RESULT status = es_json-status
                                msg = es_json-msg.

      CATCH cx_root .
        ev_msg = '异常'.
    ENDTRY.

    lr_client->close( ).
  ENDMETHOD.
 

3.2 提交业务单据到文档系统

METHOD post_bill_to_doc.
    DATA : lr_client       TYPE REF TO if_http_client,
           lv_url          TYPE string,
           lv_content_type TYPE string VALUE 'application/x-www-form-urlencoded',
           ev_xstring      TYPE xstring,
           ev_string       TYPE string,
           ex_string       TYPE string.

    DATA lv_hash   TYPE md5_fields-hash.
    DATA lv_str    TYPE string.
    DATA lv_tstamp TYPE tzntstmps.

    IF iv_json IS INITIAL AND iv_cate IS INITIAL.
      ev_msg = 'JSON对象和类别不能为空!'.
      RETURN.
    ENDIF.

    "get url
    lv_url = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'POST' ).

    IF lv_url IS INITIAL.
      ev_msg = '未获取到URL'.
      RETURN.
*      lv_url = |http://10.0.2.31/ws/restful/SAPDocRestService/sapFormMetadataAdd|.
    ENDIF.

    DATA(lv_apikey) = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'APIKEY' ).

    TRY .

        "创建http对象
        cl_http_client=>create_by_url(
          EXPORTING
          url                = lv_url
          IMPORTING
          client             = lr_client
           EXCEPTIONS
           argument_not_found = 1
           plugin_not_active  = 2
           internal_error     = 3
           OTHERS             = 4 ).

* set protocol version
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~server_protocol'
            value = 'HTTP/1.1'.
* 提交方式
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~request_method'
            value = 'POST'.
* 传参方式: application/json,application/x-www-form-urlencoded
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = 'Content-Type'
            value = lv_content_type. "'multipart/form-data; boundary=----WebKitFormBoundaryIusB0IWHP4fpJXHA'.

*        DATA(lv_json) = to_lower( iv_json ).

        DATA(lv_json) = iv_json.

        lr_client->request->set_form_field(
         EXPORTING
         name  = 'metadata'
         value = | { lv_json }  | ).

        lr_client->request->set_form_field(
         EXPORTING
         name  = 'formtype'
         value = iv_cate ).

        lr_client->request->set_form_field(
         EXPORTING
         name  = 'apikey'
         value = lv_apikey ).


* 发送
        CALL METHOD lr_client->send
          EXPORTING
            timeout                    = 200
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3
            OTHERS                     = 4.

        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).

          RETURN.
        ENDIF.

* 获取返回
        CALL METHOD lr_client->receive
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3.
        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).

          RETURN.
        ENDIF.

* 返回
*  CLEAR: lv_xjson .
        ev_xstring = lr_client->response->get_data( ).

        IF ev_xstring IS INITIAL.
          ev_msg = '读取流出错'.
        ELSE.
* XSTRING to STRING
          CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
            EXPORTING
              im_xstring  = ev_xstring
              im_encoding = 'UTF-8'
            IMPORTING
              ex_string   = ev_string.

**      必须转换
          ex_string = to_upper( ev_string ).

*    "json to itab
          CALL TRANSFORMATION id
                               SOURCE XML ex_string
                               RESULT status = es_json-status
                                      msg = es_json-msg.
        ENDIF.



      CATCH cx_abapcg_exception  .
        ev_msg = '异常'.
    ENDTRY.

* 关闭链接ie
    lr_client->close( ).


  ENDMETHOD.
 

3.3 获取单据信息转换为json

业务单据信息拼接成JSON,KEY,VALUE键值对形式组装。

  METHOD get_bill_to_json.
    DATA : lt_doc004    TYPE ztdoc004,
           ls_doc004    TYPE zsdoc004,
           lv_status(4).

    DATA : ls_0002 TYPE zspd0002,
           lt_0002 TYPE TABLE OF zspd0002.

    DATA : lv_json_body TYPE string.
    CASE iv_cate.
        "文档评审
      WHEN '1'.
        "上会资料
        SELECT
          ztpd0017~bukrs
          ztpd0017~butxt
          ztpd0017~xmbhc
          ztpd0017~xmbhd
          ztpd0017~fenqi
          ztpd0017~fbukrs
          ztpd0017~fbukrs_d
          ztpd0017~fenqd
          ztpd0020~docid
          ztpd0017~sname
          ztpd0020~rmark
          ztpd0020~biaoq AS bqian
          ztpd0017~pnode
          ztpd0017~noded
          ztpd0017~pdate
          ztpd0017~billn AS pbill
          ztpd0020~itemn
          APPENDING CORRESPONDING FIELDS OF TABLE lt_doc004  FROM ztpd0017
          INNER JOIN ztpd0020 ON ztpd0017~hguid = ztpd0020~hguid
          WHERE ztpd0017~hguid = iv_guid.
    ENDCASE.

    "json拼凑
    DATA(lv_begin) = |[|.
    DATA(lv_end)   = |]|.

    LOOP AT lt_doc004 INTO ls_doc004 WHERE docid IS NOT INITIAL . "文档ID必须有值
      lv_json_body = lv_json_body && ',{'
                 && |"bukrs":"{ ls_doc004-bukrs }",|
                 && |"butxt":"{ ls_doc004-butxt }",|
                 && |"fbukrs":"{ ls_doc004-fbukrs }",|
                 && |"bukrs_p":"{ ls_doc004-fbukrs_d }",|
                 && |"xmbhc":"{ ls_doc004-xmbhc }",|
                 && |"xmbhd":"{ ls_doc004-xmbhd }",|
                 && |"fenqi":"{ ls_doc004-fenqi }",|
                 && |"fenqd":"{ ls_doc004-fenqd }",|
                 && |"docid":"{ ls_doc004-docid }",|
                 && |"billn":"{ ls_doc004-billn }",|
                 && |"lifnr":"{ ls_doc004-lifnr }",|
                 && |"name1":"{ ls_doc004-name1 }",|
                 && |"pnode":"{ ls_doc004-pnode }",|
                 && |"noded":"{ ls_doc004-noded }",|
                 && |"ndate":"{ ls_doc004-ndate }",|
                 && |"bqian":"{ ls_doc004-bqian }",|
                 && |"sname":"{ ls_doc004-sname }",|
                 && |"rmark":"{ ls_doc004-rmark }",|
                 && |"pbill":"{ ls_doc004-pbill }",|
                 && |"qbill":"{ ls_doc004-qbill }",|
                 && |"itemn":"{ ls_doc004-itemn }",|
                 && |"status":"{ lv_status }",|
                 && |"bcate":"{ ls_doc004-bcate }" | && '}'.
    ENDLOOP.
    "如果没有文档信息有返回
    IF lv_json_body IS INITIAL.
      CLEAR ev_json.
      RETURN.
    ENDIF.

    "截取
    DATA(lv_len) = strlen( lv_json_body ) - 1.
    ev_json = lv_begin && lv_json_body+1(lv_len) && lv_end.

    CLEAR : ls_0002,lt_0002.

  ENDMETHOD.
 

3.4  文档移动到文件夹

METHOD FIELS_TO_FOLDER.
    DATA : ls_c010 TYPE zsdoc001.
    DATA : lv_docs TYPE string.

    DATA : lr_client       TYPE REF TO if_http_client,
           lv_url          TYPE string,
           lv_content_type TYPE string VALUE 'application/x-www-form-urlencoded',
           ev_xstring      TYPE xstring,
           ex_string       TYPE string.

    IF lines( it_docs ) = 0.
      ev_msg = '文档ID不能为空!'.
      RETURN .
    ENDIF.

    "文件ID集
    LOOP AT it_docs INTO ls_c010.
      lv_docs = lv_docs && ls_c010-docid && ','.
    ENDLOOP.

    "get url
    lv_url = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'FOLDER_M' ).

    IF lv_url IS INITIAL.
      ev_msg = '未获取到URL!'.
      RETURN .
    ENDIF.

    lv_url = lv_url && |&fileId=| && lv_docs && |&archMode=1| && |&opuser=| && sy-uname && |&pathId=| && iv_folder .
    TRY .

        "创建http对象
        cl_http_client=>create_by_url(
          EXPORTING
          url                = lv_url
          IMPORTING
          client             = lr_client
           EXCEPTIONS
           argument_not_found = 1
           plugin_not_active  = 2
           internal_error     = 3
           OTHERS             = 4 ).

* set protocol version
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~server_protocol'
            value = 'HTTP/1.1'.
* 提交方式
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~request_method'
            value = 'POST'.
* 传参方式: application/json,application/x-www-form-urlencoded
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = 'Content-Type'
            value = lv_content_type.


* 发送
        CALL METHOD lr_client->send
          EXPORTING
            timeout                    = 200
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3
            OTHERS                     = 4.

        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 获取返回
        CALL METHOD lr_client->receive
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3.
        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 返回
        ev_xstring = lr_client->response->get_data( ).

* XSTRING to STRING
        CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
          EXPORTING
            im_xstring  = ev_xstring
            im_encoding = 'UTF-8'
          IMPORTING
            ex_string   = ex_string.

        CALL TRANSFORMATION id
                         SOURCE XML ex_string
                         RESULT status = es_json-status
                                msg = es_json-msg.
      CATCH cx_root .
        ev_msg = '异常'.
    ENDTRY.

    lr_client->close( ).
  ENDMETHOD.
 

3.5 获取DMS目录

  METHOD get_dms_catalog.
    DATA : ls_c010 TYPE zsdoc001.
    DATA : lv_docs TYPE string.

    DATA : lr_client       TYPE REF TO if_http_client,
           lv_url          TYPE string,
           lv_content_type TYPE string VALUE 'application/x-www-form-urlencoded',
           ev_xstring      TYPE xstring,
           ex_string       TYPE string.

    "get url
    lv_url = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = iv_cate ).

    IF lv_url IS INITIAL.
      ev_msg = '未获取到URL!'.
      RETURN .
    ENDIF.

    "get APIKEY
    DATA(lv_apikey) = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'APIKEY' ).

    lv_url = lv_url && |&{ lv_apikey }| .

    TRY .

        "创建http对象
        cl_http_client=>create_by_url(
          EXPORTING
          url                = lv_url
          IMPORTING
          client             = lr_client
           EXCEPTIONS
           argument_not_found = 1
           plugin_not_active  = 2
           internal_error     = 3
           OTHERS             = 4 ).

* set protocol version
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~server_protocol'
            value = 'HTTP/1.1'.
* 提交方式
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~request_method'
            value = 'GET'.
* 传参方式: application/json,application/x-www-form-urlencoded
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = 'Content-Type'
            value = lv_content_type.

* 发送
        CALL METHOD lr_client->send
          EXPORTING
            timeout                    = 200
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3
            OTHERS                     = 4.

        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 获取返回
        CALL METHOD lr_client->receive
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3.
        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 返回
        ev_xstring = lr_client->response->get_data( ).

* XSTRING to STRING
        CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
          EXPORTING
            im_xstring  = ev_xstring
            im_encoding = 'UTF-8'
          IMPORTING
            ex_string   = ex_string.

        CALL TRANSFORMATION id
                         SOURCE XML ex_string
                         RESULT status = es_json-status
                                rows = es_json-rows
                                msg = es_json-msg.

      CATCH cx_root .
        ev_msg = '异常'.
    ENDTRY.

    lr_client->close( ).
  ENDMETHOD.

4. Web Dynpro附件上传公共组件 

ZWD_AB_0003 附件上传公共组件

ZWD_AB_C996 附件上传公共组件(全自动)

COMPONENTCONTROLLER定义 Events Interface: 在扩展应用程序再实例化

定时器事件  

同样调用 zcl_wd_json封装的文档交互methods

METHOD onactionact_timer .
  DATA : ls_upload TYPE wd_this->element_upload.
  DATA : lv_msg  TYPE string.
  DATA : ls_json     TYPE zsdoc003,
         ls_fileinfo TYPE zsdoc002.

  DATA : lv_date TYPE string,
         lv_time TYPE string.

  DATA : ls_item TYPE wd_this->element_item,
         lt_item TYPE wd_this->elements_item.

  DATA : lt_doc TYPE ztdoc010,
         ls_doc TYPE zsdoc001.

  DATA : lv_itemn TYPE ze_itemn VALUE '000000'.

  "获取当前items
  zcl_wd_common=>get_elements(
    EXPORTING
      iv_none = wd_context
      iv_name = 'ITEM'
    IMPORTING
      et_item = lt_item ).

  IF lt_item[] IS NOT INITIAL.
    "获取最大的行项目
    SORT lt_item BY itemn DESCENDING.
    READ TABLE lt_item INTO ls_item INDEX 1.
    lv_itemn = ls_item-itemn.
    CLEAR : ls_item.
  ENDIF.

  zcl_wd_common=>get_element(
    EXPORTING
      iv_none    = wd_context
      iv_name    = 'UPLOAD'
    IMPORTING
      es_stru    =  ls_upload ).

  "获取取消的文档信息
  zcl_wd_upload=>init( EXPORTING ir_usage = wd_this->wd_cpuse_upload( ) ).
  DATA(lv_flag) = wd_this->wd_cpifc_upload( )->get_flag( ).

  "通过业务ID获取文档系统附件清单
  zcl_wd_json=>get_itab_for_json(
     EXPORTING
       iv_guid = |{ ls_upload-guid }|
    IMPORTING
      ev_msg  = lv_msg
      es_json = ls_json ).

  IF ls_json IS NOT INITIAL.
    zcl_wd_common=>set_attribute(
      EXPORTING
        iv_none = wd_context
        iv_name = 'ENABLED'
        iv_attr = || ).

    LOOP AT ls_json-rows INTO ls_fileinfo.

      "清除删除清单的文档ID
      READ TABLE wd_comp_controller->gt_0021_dele INTO DATA(ls_dele) WITH KEY docid_c = ls_fileinfo-id.
      IF sy-subrc = 0.
        CONTINUE." 解决删除文件后点确认再次带出已删除文件的问题
      ENDIF.

      "如果是取消上传,就从内表里清除
      IF lv_flag = 'X'.
        READ TABLE lt_item INTO ls_item WITH KEY docid_c = ls_fileinfo-id.
        IF sy-subrc <> 0.
          ls_doc-docid = ls_fileinfo-id.
          APPEND ls_doc TO lt_doc.
          CLEAR : ls_doc.
          CONTINUE.
        ELSE.
          CONTINUE.
        ENDIF.
      ELSE.
        READ TABLE lt_item INTO ls_item WITH KEY docid_c = ls_fileinfo-id.
        "如果列表中,已存在就不再加载文档清单
        IF sy-subrc = 0.
          CONTINUE.
        ENDIF.
      ENDIF.

      ls_item-docid = ls_fileinfo-id.
      ls_item-docid_c = ls_fileinfo-id.
      ls_item-fdown = ls_fileinfo-downloadurl.
      ls_item-fextn = ls_fileinfo-ext.
      ls_item-fname = ls_fileinfo-name.
      ls_item-fpath = ls_fileinfo-previewurl.
      ls_item-fsize = ls_fileinfo-formatsize.
      lv_itemn = lv_itemn + 10.
      ls_item-itemn = lv_itemn.
      ls_item-ronly = 'X'.
      ls_item-itemn = lv_itemn.
      ls_item-sname = sy-uname.

      lv_date = |{ ls_fileinfo-createdate+0(10) }|.
      REPLACE ALL OCCURRENCES OF '-' IN lv_date WITH '' .
      lv_time = |{ ls_fileinfo-createdate+11(8) }|.
      REPLACE ALL OCCURRENCES OF ':' IN lv_time WITH '' .
      ls_item-sdate = lv_date.
      ls_item-stime = lv_time.
      APPEND ls_item TO lt_item.
      CLEAR : ls_item,ls_fileinfo.
    ENDLOOP.

    "删除文档服务器的文件
    CLEAR :ls_json.
    zcl_wd_json=>delete_files_for_json(
      EXPORTING
        it_docs = lt_doc
      IMPORTING
        es_json = ls_json ).

    SORT lt_item BY itemn.
    zcl_wd_common=>set_elements(
      EXPORTING
        iv_none = wd_context
        iv_name = 'ITEM'
        it_item = lt_item ).
    CLEAR : lv_itemn.

  ENDIF.

  wd_comp_controller->fire_file_check_evt( ).

ENDMETHOD.

VIEW METHOD实现文档交互

在各个WDA 应用里需要用到附件功能的引用上面 的组件:

 


http://www.mrgr.cn/news/95110.html

相关文章:

  • dijkstra算法——47. 参加科学大会
  • PostgreSQL:语言基础与数据库操作
  • 数据大屏标题加载顶部流光
  • LEDNet总结
  • Python Pyecharts面试题及参考答案
  • 数据结构-------栈
  • 【C++】动态规划从入门到精通
  • 详解Sympy:符号计算利器
  • MySQL 调优
  • Firebase崩溃:ViewBinding not init!!
  • Quartus + VScode 实现模块化流水灯
  • MySQL 入门大全:查询语言分类
  • 【免费网址/插件】视频和图片数据采集推荐~
  • Python散点图(Scatt Plot):数据探索的“第一张图表”
  • 数仓开发那些事(10)
  • YOLOv11 目标检测
  • 网络编程之客户端通过服务器与另外一个客户端交流
  • springCloud集成tdengine(原生和mapper方式) 其一
  • SpringBoot对接DeepSeek
  • dify+deepseek联网搜索:免费开源搜索引擎Searxng使用(让你的大模型也拥有联网的功能)