• 自动发送EMAIL 石头


    *&---------------------------------------------------------------------*
    *& Report  ZPP_SEND_EMAIL
    *&变更配方自动发送EMAIL
    *&---------------------------------------------------------------------*
    *&2013.6.28
    *&
    *&---------------------------------------------------------------------*

    REPORT  ZPP_SEND_EMAIL.

    data: begin of tab_g_mail occurs 0.
      include structure cdpos.

    data: matnr like mara-matnr.
    data: IDNRK like stpo-IDNRK.
    DATA: WERKS LIKE MAST-WERKS.
    DATA: STLAL LIKE MAST-STLAL.
    data: DDTEXT like dd04t-DDTEXT.
    *DATA:
    data:end of tab_g_mail.
    DATA: LT_CDHDR LIKE TABLE OF CDHDR WITH HEADER LINE.
    DATA: LT_CDHDR_TEMP LIKE TABLE OF CDHDR WITH HEADER LINE.
    DATA: LT_CDPOS LIKE TABLE OF TAB_G_MAIL WITH HEADER LINE.
    DATA: BEGIN OF tab_werks OCCURS 0.
    DATA: TABNAME LIKE CDPOS-TABNAME.
    DATA: TABKEY LIKE CDPOS-TABKEY.
    DATA: WERKS LIKE MAST-WERKS.
    DATA: STLBE LIKE STZU-STLBE.
    data: IDNRK like stpo-IDNRK.
    data: END OF tab_werks.
    data: lt_werks like TABLE OF tab_werks WITH HEADER LINE.
    data: ld_start like CDHDR-UDATE,ld_end like CDHDR-UDATE.
    DATA: li_count type i.
    data: ldt_now type cdhdr-UDATE,ldt_time type cdhdr-UTIME,ldt_starttime type cdhdr-UTIME.
    DATA: LS_TIME(14TYPE C.

    ldt_now SY-DATUM.
    ldt_time SY-UZEIT.
    *LDT_NOW = '20130628'.
    *ldt_time = '160000'.
    *LS_TIME = LDT_NOW + LDT_TIME.
    IF ldt_time < '040000'. "四小时
      ld_start ldt_now 1.
    else.
      ld_start ldt_now.
    endif.
      ldt_starttime ldt_time 14400. "四小时

    PERFORM get_data.

    perform send_mail tables tab_g_mail.

    *&---------------------------------------------------------------------*
    *&      Form  SEND_MAIL
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    form send_mail tables tab_l_mail like tab_g_mail[].
      DATA: i_objpack LIKE sopcklsti1 OCCURS WITH HEADER LINE,
          i_objtxt  LIKE solisti1 OCCURS WITH HEADER LINE,
          i_objbin  LIKE solisti1 OCCURS WITH HEADER LINE,
          i_reclist LIKE somlreci1 OCCURS WITH HEADER LINE,
          i_record  LIKE solisti1 OCCURS WITH HEADER LINE,
          rec_l_contents  type solisti1,
          v_objhead TYPE soli_tab ,
          v_lines_txt TYPE i,
          v_lines_bin TYPE i,
          v_docchgi TYPE sodocchgi1,
          v_lines_bin_all TYPE i ,
          filelen TYPE i.
      data: begin of tab_l_mailadd occurs 0,
              pmail(30type c,
            end of tab_l_mailadd.

       data: begin of tab_mail occurs 0,
              pmail(30type c,
            end of tab_mail.

       DATA: BEGIN OF itab_text OCCURS 0 , "内表作为邮件附件
            MATNR LIKE MAST-MATNR,
            STLAL LIKE MAST-STLAL,
            tabname like cdpos-tabname,
            tabkey like cdpos-tabkey,
            FNAME like cdpos-FNAME,
            DDTEXT like dd04t-DDTEXT,
            IDNRK LIKE stpo-IDNRK,
            CHNGIND like cdpos-FNAME,
            VALUE_OLD like cdpos-VALUE_OLD,
            VALUE_NEW LIKE CDPOS-VALUE_OLD,
          END OF itab_text.
       DATA:ls_name(100type c.
       DATA: DDTEXT LIKE DD03T-DDTEXT,EDDTEXT LIKE DD04T-DDTEXT,DDDTEXT LIKE DD01T-DDTEXT.
    LOOP AT TAB_WERKS.
    ***附近内容
      itab_text-matnr '物料代码'.
      itab_text-stlal '可选BOM'.
      itab_text-tabname '表名'.
      itab_text-tabkey '表关键字'.
      itab_text-FNAME '字段名'.
      itab_text-DDTEXT '字段描述'.
      itab_text-idnrk '组件'.
      itab_text-CHNGIND '操作'.
      ITAB_TEXT-VALUE_OLD '旧值'.
      ITAB_TEXT-VALUE_NEW '新值'.
      APPEND itab_text.

      v_docchgi-obj_name 'SAPSEND'.
      v_docchgi-expiry_dat sy-datum + 2 . "过期日期
      v_docchgi-sensitivty 'F'. "Functional object
      v_docchgi-doc_size v_lines_txt * 255.
      v_docchgi-obj_descr =  '研究院配方变更'.

    *邮件内容
      concatenate '以下是变更信息:' rec_l_contents into rec_l_contents separated by space.
      append rec_l_contents to i_objtxt.

      loop at tab_g_mail where tabname tab_werks-tabname and TABKEY tab_werks-TABKEY.
    *** 取字段名称
         SELECT SINGLE dd04t~DDTEXT dd03t~ddtext dd01t~ddtext
         into (ddtext,eddtext,dddtext)
         FROM DD03L LEFT JOIN DD03T
             ON DD03L~TABNAME DD03T~TABNAME
                AND DD03L~FIELDNAME DD03T~FIELDNAME
                AND DD03T~DDLANGUAGE SY-LANGU
             LEFT JOIN DD04T
               ON DD03L~ROLLNAME DD04T~ROLLNAME
                AND DD04T~DDLANGUAGE SY-LANGU
             LEFT JOIN DD01T
               ON DD03L~DOMNAME DD01T~DOMNAME
               AND DD01T~DDLANGUAGE SY-LANGU
         WHERE DD03L~TABNAME tab_werks-tabname and
               DD03L~FIELDNAME tab_g_mail-FNAME.
         IF DDTEXT SPACE.
            IF EDDTEXT SPACE.
               tab_g_mail-ddtext DDDTEXT.
            ELSE.
               tab_g_mail-ddtext EDDTEXT.
            ENDIF.
         else.
           tab_g_mail-ddtext ddtext.
          ENDIF.
        clear rec_l_contents.
        concatenate '物料代码' tab_g_mail-matnr
        '可选BOM' tab_g_mail-stlal "'编号:' tab_werks-TABKEY
        '组件:' tab_werks-IDNRK
        "'表名:' tab_g_mail-tabname
        "'字段:' tab_g_mail-FNAME
        '字段名称' tab_g_mail-ddtext
        '操作:' itab_text-CHNGIND
        '旧值:' tab_g_mail-VALUE_OLD '新值:' tab_g_mail-VALUE_NEW
        into rec_l_contents separated by space.
        append rec_l_contents to i_objtxt.

    *** 附件内容
        CLEAR:itab_text.
        itab_text-matnr tab_g_mail-matnr.
        itab_text-stlal tab_g_mail-stlal.
        itab_text-tabname tab_werks-tabname.
        itab_text-tabkey tab_werks-TABKEY.
        itab_text-FNAME tab_g_mail-FNAME.
        itab_text-ddtext tab_g_mail-ddtext.
        itab_text-idnrk tab_werks-IDNRK.
        itab_text-CHNGIND tab_g_mail-CHNGIND.
        itab_text-VALUE_OLD tab_g_mail-VALUE_OLD.
        itab_text-VALUE_NEW tab_g_mail-VALUE_NEW.
        APPEND itab_text.
      endloop.

      clear rec_l_contents.
      concatenate rec_l_contents '详细信息请查阅附件,谢谢!' into rec_l_contents separated by space.
      append rec_l_contents to i_objtxt.
      DESCRIBE TABLE i_objtxt LINES v_lines_txt.

      i_objpack-transf_bin ''.
      i_objpack-head_start 1.
      i_objpack-head_num 0.
      i_objpack-body_start 1.
      i_objpack-body_num v_lines_txt.
      i_objpack-doc_type 'RAW'.
      APPEND i_objpack.

    **内表作为邮件附件
      DATA: tmpstr TYPE string .
      CLEAR: tmpstr,i_record,i_record[].
      PERFORM itabtostr TABLES itab_text USING tmpstr.
      PERFORM strtorecord TABLES i_record USING tmpstr filelen.
      APPEND LINES OF i_record TO i_objbin.
      DESCRIBE TABLE i_record LINES v_lines_bin.
      DESCRIBE TABLE i_objbin LINES v_lines_bin_all.

      i_objpack-transf_bin 'X'.
      i_objpack-body_start v_lines_bin_all v_lines_bin + 1 .
      i_objpack-body_num v_lines_bin.
      i_objpack-doc_type 'XLS'.
      i_objpack-obj_name 'text'.
      i_objpack-doc_size v_lines_bin * 255.

      CONCATENATE tab_werks-TABKEY '.xls' '' INTO i_objpack-obj_descr."附件名
      APPEND i_objpack.

    **接收人
    *  CLEAR i_reclist.
    *  i_reclist-receiver = ''.
    *  i_reclist-express = 'X'.
    *  i_reclist-rec_type = 'U'.
    *  APPEND i_reclist.
    ****收件人
      SELECT EMAIL as pmail
      INTO CORRESPONDING FIELDS OF TABLE tab_mail
      FROM ZPP_0810
      WHERE WERKS TAB_WERKS-WERKS AND
            STLBE TAB_WERKS-STLBE OR STLBE '*').

      LOOP AT TAB_MAIL.
         CLEAR i_reclist.
        i_reclist-receiver tab_mail-pmail.
        i_reclist-express 'X'.
        i_reclist-rec_type 'U'.
        APPEND i_reclist.
      ENDLOOP.
      REFRESH tab_mail.
      CLEAR:tab_mail.

      SELECT EMAIL as pmail
      INTO CORRESPONDING FIELDS OF TABLE tab_mail
      FROM ZPP_0810
      WHERE WERKS TAB_WERKS-WERKS OR WERKS '*' AND
            STLBE TAB_WERKS-STLBE ).

      LOOP AT TAB_MAIL.
        CLEAR i_reclist.
        i_reclist-receiver tab_mail-pmail.
        i_reclist-express 'X'.
        i_reclist-rec_type 'U'.
        APPEND i_reclist.
      ENDLOOP.
       REFRESH tab_mail.
      CLEAR:tab_mail.

       SELECT EMAIL as pmail
      INTO CORRESPONDING FIELDS OF TABLE tab_mail
      FROM ZPP_0810
      WHERE WERKS '*' AND
            STLBE '*').

      LOOP AT TAB_MAIL.
        CLEAR i_reclist.
        i_reclist-receiver tab_mail-pmail.
        i_reclist-express 'X'.
        i_reclist-rec_type 'U'.
        APPEND i_reclist.
      ENDLOOP.
       REFRESH tab_mail.
      CLEAR:tab_mail.

    ***删除重复
       sort i_reclist.
       DELETE ADJACENT DUPLICATES FROM i_reclist COMPARING ALL FIELDS.

      CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
        EXPORTING
          document_data              v_docchgi
          put_in_outbox              'X'
          commit_work                'X'
        TABLES
          packing_list               i_objpack
          object_header              v_objhead
          contents_bin               i_objbin
          contents_txt               i_objtxt
          receivers                  i_reclist
        EXCEPTIONS
          too_many_receivers         1
          document_not_sent          2
          document_type_not_exist    3
          operation_no_authorization 4
          parameter_error            5
          x_error                    6
          enqueue_error              7
          OTHERS                     8.

      REFRESH: i_objpack,v_objhead,i_objbin,i_objtxt,i_reclist,itab_text.
      CLEAR:i_objpack,v_objhead,i_objbin,i_objtxt,i_reclist,v_docchgi,itab_text.

    ENDLOOP.

      wait up to seconds.
      submit rsconn01 with mode 'INT'
                    with output 'X' and RETURN.
    endform.                    "SEND_MAIL
    *&---------------------------------------------------------------------*
    *&      Form  GET_DATA
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *  -->  p1        text
    *  <--  p2        text
    *----------------------------------------------------------------------*
    FORM GET_DATA .
      IF ld_start ldt_now. "同一天
      select from CDHDR
    *  join CDHDR ON
    *    CDHDR~MANDANT = CDPOS~MANDANT AND
    *     CDHDR~OBJECTCLAS = CDPOS~OBJECTCLAS AND
    *    CDHDR~OBJECTID = CDPOS~OBJECTID AND
    *    CDHDR~CHANGENR = CDPOS~CHANGENR
      into CORRESPONDING FIELDS OF TABLE LT_CDHDR_TEMP
      WHERE CDHDR~TCODE IN ('CS02','CV02N'AND
        CDHDR~UDATE LD_START AND
        CDHDR~UTIME >= ldt_starttime AND
        CDHDR~UTIME < ldt_time.

        APPEND LINES OF LT_CDHDR_TEMP TO LT_CDHDR.
      else."跨日
        select from CDHDR
    *  join CDHDR ON
    *    CDHDR~MANDANT = CDPOS~MANDANT AND
    *     CDHDR~OBJECTCLAS = CDPOS~OBJECTCLAS AND
    *    CDHDR~OBJECTID = CDPOS~OBJECTID AND
    *    CDHDR~CHANGENR = CDPOS~CHANGENR
      into CORRESPONDING FIELDS OF TABLE LT_CDHDR_TEMP
      WHERE CDHDR~TCODE IN ('CS02','CV02N'AND
        CDHDR~UDATE LD_START AND
        CDHDR~UTIME >= ldt_starttime AND
        CDHDR~UTIME <= '235959'.

          APPEND LINES OF LT_CDHDR_TEMP TO LT_CDHDR.

          select from CDHDR
    *  join CDHDR ON
    *    CDHDR~MANDANT = CDPOS~MANDANT AND
    *     CDHDR~OBJECTCLAS = CDPOS~OBJECTCLAS AND
    *    CDHDR~OBJECTID = CDPOS~OBJECTID AND
    *    CDHDR~CHANGENR = CDPOS~CHANGENR
      into CORRESPONDING FIELDS OF TABLE LT_CDHDR_TEMP
      WHERE CDHDR~TCODE IN ('CS02','CV02N'AND
        CDHDR~UDATE LDT_NOW AND
        CDHDR~UTIME < LDT_TIME.

         APPEND LINES OF LT_CDHDR_TEMP TO LT_CDHDR.
      endif.

      LOOP AT LT_CDHDR.
        SELECT FROM CDPOS
        INTO CORRESPONDING FIELDS OF TABLE LT_CDPOS
        WHERE CDPOS~MANDANT LT_CDHDR-MANDANT AND
          CDPOS~OBJECTCLAS LT_CDHDR-OBJECTCLAS AND
          CDPOS~OBJECTID  LT_CDHDR-OBJECTID AND
          CDPOS~CHANGENR LT_CDHDR-CHANGENR.
    *      AND
    *      CDPOS~TABKEY IN ('300M000002190000001800000037','300M000002190000000500000010').
    *      AND
    *      CDPOS~OBJECTID = '300M00000219' AND
    *      CDPOS~TABNAME = 'STPO'.

        LOOP AT LT_CDPOS.
          SELECT count(*into li_count
          FROM ZMM_SEND_MAIL
          WHERE ZMM_SEND_MAIL~TABNAME LT_CDPOS-TABNAME AND
             ZMM_SEND_MAIL~FNAME LT_CDPOS-FNAME AND
             ZMM_SEND_MAIL~CHNGIND LT_CDPOS-CHNGIND.

          IF sy-subrc 0.
            APPEND LT_CDPOS TO TAB_G_MAIL.
            CLEAR:LT_CDPOS.
          ENDIF.
        ENDLOOP.
      ENDLOOP.

      DATA: S_STLTY LIKE STPO-STLTY.
      DATA: M_STLNR LIKE MAST-STLNR.
      DATA: M_STLAL LIKE MAST-STLAL.
      DATA: S_STLNR LIKE STPO-STLNR.
      DATA: S_STLKN LIKE STPO-STLKN.
      DATA: S_STPOZ LIKE STPO-STPOZ.
      DATA: S_IDNRK LIKE STPO-IDNRK.
      data: C_TABNAME LIKE CDPOS-TABNAME.
      LOOP AT TAB_G_MAIL.
    ****取工厂
        C_TABNAME TAB_G_MAIL-TABNAME.
        IF C_TABNAME 'STPO' OR C_TABNAME 'STPU'.
          S_STLTY TAB_G_MAIL-TABKEY+3(1).
          S_STLNR TAB_G_MAIL-TABKEY+4(8).
          S_STLKN TAB_G_MAIL-TABKEY+12(8).
          S_STPOZ TAB_G_MAIL-TABKEY+20(8).


          SELECT SINGLE STLAL INTO M_STLAL
          FROM STKO
          WHERE STLTY S_STLTY AND
                STLNR S_STLNR.

          SELECT SINGLE STLAL INTO M_STLAL
          FROM STAS
          WHERE STLTY S_STLTY AND
            STLNR S_STLNR AND
            STLKN S_STLKN .

    ***取主键信息
          SELECT SINGLE IDNRK INTO S_IDNRK
          FROM STPO
          WHERE STLTY S_STLTY AND
                STLNR S_STLNR AND
                STLKN S_STLKN AND
                STPOZ S_STPOZ.
        ENDIF.
        IF C_TABNAME 'STAS'.
          S_STLTY TAB_G_MAIL-TABKEY+3(1).
          S_STLNR TAB_G_MAIL-TABKEY+4(8).
          M_STLAL TAB_G_MAIL-TABKEY+12(2).
          S_STLKN TAB_G_MAIL-TABKEY+14(8).
          S_STPOZ TAB_G_MAIL-TABKEY+22(8).
    ***取主键信息
          SELECT SINGLE IDNRK INTO S_IDNRK
          FROM STPO
          WHERE STLTY S_STLTY AND
                STLNR S_STLNR AND
                STLKN S_STLKN AND
                STPOZ S_STPOZ.
        ENDIF.
        IF C_TABNAME 'STKO'.
          S_STLTY TAB_G_MAIL-TABKEY+3(1).
          S_STLNR TAB_G_MAIL-TABKEY+4(8).
          M_STLAL TAB_G_MAIL-TABKEY+12(2).
          S_STLKN TAB_G_MAIL-TABKEY+14(8).
        ENDIF.
    *        AND
    *            STKOZ = S_STKOZ.
          SELECT MAST~WERKS
          INTO CORRESPONDING FIELDS OF TABLE lt_werks
          FROM MAST
          WHERE STLNR S_STLNR AND
                STLAL M_STLAL.


          LOOP AT lt_werks.
            TAB_WERKS-TABNAME TAB_G_MAIL-TABNAME.
            TAB_WERKS-TABKEY TAB_G_MAIL-TABKEY.
            TAB_WERKS-WERKS LT_WERKS-WERKS.
            TAB_WERKS-IDNRK S_IDNRK.
            SELECT SINGLE STLBE INTO TAB_WERKS-STLBE
            FROM STZU
            WHERE STLTY S_STLTY AND
              STLNR S_STLNR.

            APPEND TAB_WERKS.
            CLEAR:LT_WERKS.
          ENDLOOP.

          SELECT SINGLE MAST~MATNR MAST~WERKS
          INTO (TAB_G_MAIL-MATNR,TAB_G_MAIL-WERKS)
            FROM MAST
            WHERE STLNR S_STLNR AND
                STLAL M_STLAL.

          TAB_G_MAIL-STLAL M_STLAL.

    *    S_STLTY = TAB_G_MAIL-TABKEY+3(1).
    *    M_STLNR = TAB_G_MAIL-TABKEY+4(8).
    *    M_STLAL = TAB_G_MAIL-TABKEY+12(2).
    *    SELECT MAST~WERKS
    *    INTO CORRESPONDING FIELDS OF TABLE lt_werks
    *    FROM MAST
    *    WHERE STLNR = M_STLNR AND
    *          STLAL = M_STLAL.
    *    LOOP AT lt_werks.
    *      TAB_WERKS-TABKEY = TAB_G_MAIL-TABKEY.
    *      TAB_WERKS-WERKS = LT_WERKS-WERKS.
    *      APPEND TAB_WERKS.
    *      CLEAR:LT_WERKS.
    *    ENDLOOP.
        MODIFY TAB_G_MAIL.
      ENDLOOP.

      sort TAB_WERKS by TABNAME TABKEY WERKS IDNRK.
      DELETE ADJACENT DUPLICATES FROM TAB_WERKS COMPARING ALL FIELDS.
    ENDFORM.                    " GET_DATA


    *&---------------------------------------------------------------------*
    *&      Form  itabtostr
    *&---------------------------------------------------------------------*
    FORM itabtostr TABLES intab
                    USING outstr TYPE string.
      DATA: tab TYPE VALUE cl_abap_char_utilities=>horizontal_tab,
            enter(2TYPE VALUE cl_abap_char_utilities=>cr_lf,
            n TYPE i.
      DATA: BEGIN OF headtab OCCURS 0 ,
              length    TYPE i ,
              decimals  TYPE i,
              type_kind TYPE c,
              name(30)  TYPE c,
            END OF headtab.
      DATA descr_ref TYPE REF TO cl_abap_structdescr.
      FIELD-SYMBOLS: <comp_wa> TYPE abap_compdescr ,
                     <f_field> ,
                     <f_intab> TYPE ANY .
      DATA:str TYPE string,
           str2 TYPE string ,
           text1 TYPE c.
      descr_ref ?= cl_abap_typedescr=>describe_by_dataintab ).
      LOOP AT descr_ref->components ASSIGNING <comp_wa>.
        MOVE-CORRESPONDING <comp_wa> TO headtab.
        APPEND headtab.
      ENDLOOP.
      DESCRIBE TABLE headtab LINES n.
      LOOP AT intab ASSIGNING <f_intab>.
        DO TIMES.
          ASSIGN COMPONENT sy-index OF STRUCTURE <f_intab> TO <f_field>.
          str <f_field>.
          READ TABLE headtab INDEX sy-index.
          IF headtab-type_kind 'I' OR headtab-type_kind 'P'
                                     OR headtab-type_kind 'F'.
            SEARCH str FOR '-'.
            IF sy-subrc AND sy-fdpos <> 0.
              SPLIT str AT '-' INTO str text1.
              CONDENSE str.
              CONCATENATE '-' str INTO str.
            ELSE.
              CONDENSE str.
            ENDIF.
          ELSE.
    *        SHIFT str LEFT DELETING LEADING '0' .
          ENDIF.
          CONCATENATE str2 tab str INTO str2.
        ENDDO.
        SHIFT str2.
        CONCATENATE outstr str2 enter INTO outstr.
        CLEAR str2.
      ENDLOOP.
    ENDFORM.                    "itabtostr

    *&---------------------------------------------------------------------*
    *&      Form  strtorecord
    *&---------------------------------------------------------------------*
    FORM strtorecord TABLES record USING str len.
      DATA:tmpbuffer TYPE xstring.
      CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
        EXPORTING
          text     str
          mimetype '"text/html; charset=gb2312"'
    *      encoding = '8400'
        IMPORTING
          buffer   tmpbuffer
        EXCEPTIONS
          failed   1
          OTHERS   2.
      CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
        EXPORTING
          buffer          tmpbuffer
          append_to_table ''
        IMPORTING
          output_length   len
        TABLES
          binary_tab      record.
    ENDFORM.                    "strtorecord

    FORM GET_DATA .

    通过后台作业配置4小时定期取配方变更信息

    通过ZMM_SEND_EMAIL自建表控制哪些表修改才发送邮件

    perform send_mail tables tab_g_mail.

    对符合的数据进行定向发送EMAIL,通过自建表zpp_0810配置工厂对应的收件地址,取得接受人地址;

    内容分两种方式发送:1、邮件内容i_objtxt;2、附近已EXCEL发送 itab_text

  • 相关阅读:
    异常处理
    面向对象 -- 内置方法
    面向对象 -- 反射(详细)
    面向对象 -- 反射
    面向对象 -- 三大特性之封装
    pickle模块 collections模块在面向对象中的应用
    面向对象 -- 三大特性之多态
    Third Week(补充完整)
    Second Week(补充完整)
    First Week (补充完整)
  • 原文地址:https://www.cnblogs.com/rockyzjut/p/3169522.html
Copyright © 2020-2023  润新知