HAP_hap调用soap接口

接口地址:


image.png

hap定义接口:


image.png

接口:


public interface IInstorageTrxService extends IBaseService<InstorageTrx>, ProxySelf<IInstorageTrxService> {

   /**
    * Hap调用SOAP接口
    */
   // public ResponseData getTxns(IRequest iRequest,InstorageTrx dto, String date_from, String date_to,int page,int pageSize) throws Exception;
   public List<Object> getTxns(String date_from, String date_to) throws Exception;

   /**
    * 保存远程数据
    *
    * @param dtoList
    */
   void saveInstorageTrx(List<Object> dtoList) throws Exception;

   /**
    * 自定义查询/导出
    */
   List<InstorageTrx> selectInstorageTrx(IRequest iRequest, InstorageTrx dto, int page, int pageSize);

}

构建请求报文,你也可以不用分离出来,直接写在下面的接口实现类中

package SF.xxfnd.contants;

/**
 * Created by General on 10/26/2017.
 */
public class MaterialTxnsConstant {
    private static String PARA_XML = "<pub:item>\n" +
            "                  <pub:name>p_date_from</pub:name>\n" +
            "                  <pub:dataType>STRING</pub:dataType>\n" +
            "                  <pub:values> \n" +
            "                     <pub:item>$P_DATA_FROM$</pub:item>\n" +
            "                  </pub:values>\n" +
            "                </pub:item>\n" +
            "                \n" +
            "                <pub:item>\n" +
            "                  <pub:name>p_date_to</pub:name>\n" +
            "                  <pub:dataType>STRING</pub:dataType>\n" +
            "                  <pub:values> \n" +
            "                     <pub:item>$P_DATA_TO$</pub:item>\n" +
            "                  </pub:values>\n" +
            "                </pub:item>";


    public static String getParaXml(String p_data_from, String p_data_to) {
        String para = PARA_XML;
        para = para.replace("$P_DATA_FROM$", p_data_from);
        para = para.replace("$P_DATA_TO$", p_data_to);
        return para;
    }
}

接口实现:


@Service
@Transactional(rollbackFor = Exception.class)
public class InstorageTrxServiceImpl extends BaseServiceImpl<InstorageTrx> implements IInstorageTrxService {

    @Resource(name = "soapBean")
    private IHapApiService soapService;
    @Autowired
    private IHapInterfaceHeaderService headerService;
    @Autowired
    private ISoapDepartmentLookupService iSoapDepartmentLookupService;
    @Autowired
    InstorageTrxMapper instorageTrxMapper;

    private static Logger logger = LoggerFactory.getLogger(InstorageTrxServiceImpl.class);

    /**
     * soap接口获取远程系统数据
     * @return
     * @throws Exception
     */
    @Override
    public List<Object> getTxns(String date_from,String date_to) throws Exception {

        ResponseData responseData = new ResponseData();
        JSONObject params = new JSONObject();
        params.put("pub:parameterNameValues", MaterialTxnsConstant.getParaXml(date_from, date_to));
       // params.put("pub:parameterNameValues", MaterialTxnsConstant.getParaXml("2018-04-01", "2018-05-01"));
        JSONObject Response_Json = null;
        JSONObject Envelope = null;
        JSONObject EnvBody = null;
        JSONObject runReportResponse = null;
        JSONObject runReportReturn = null;
        String reportdata = null;
        HapInterfaceHeader hapInterfaceHeader = this.headerService.getHeaderAndLine("XxInvMaterialTxnsIntg", "Sync_Item_REPORT");
        try {
            Response_Json = this.soapService.invoke(hapInterfaceHeader, params);
            Envelope = Response_Json.getJSONObject("soapenv:Envelope");
            EnvBody = Envelope.getJSONObject("soapenv:Body");
            runReportResponse = EnvBody.getJSONObject("runReportResponse");
            runReportReturn = runReportResponse.getJSONObject("runReportReturn");
            reportdata = runReportReturn.getString("reportBytes");
            reportdata = new String(Base64.decodeBase64(reportdata.getBytes()), "UTF-8");
        }catch (Exception e) {
            //e.printStackTrace();
            throw e;
        }
        //我的方法中没用到"G_1"这个参数,我是从xml的根元素开始遍历,然后去掉不用的元素
        return (XmlToList.Transform(reportdata,"G_1", InstorageTrx.class));
    }

    /**
     * 保存ERP远程数据
     * @param dtoList
     */
    @Override
    public void saveInstorageTrx(List<Object> dtoList) throws Exception{
        Iterator it = dtoList.iterator();
        while(it.hasNext()) {
            InstorageTrx obj = (InstorageTrx) it.next();
//            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//            obj.setExpireTime(sdf.parse(sdf.format(obj.getExpireTime().getTime() - 1*8*3600*1000L)));
//            obj.setInstorageTime(sdf.parse(sdf.format(obj.getInstorageTime().getTime() - 1*8*3600*1000L)));
            //判断记录是否已经存在
            if(instorageTrxMapper.select(obj).size()<1) {
                obj.setSyncFlag("N");
                obj.setObjectVersionNumber(1L);
                obj.setCreatedBy(-1L);
                obj.setLastUpdatedBy(-1L);
                obj.setCreationDate(new Date());
                obj.setLastUpdateDate(new Date());
                instorageTrxMapper.insert(obj);
            }
        }
    }

    @Override
    public List<InstorageTrx> selectInstorageTrx(IRequest iRequest,InstorageTrx dto,int page,int pageSize) {
        PageHelper.startPage(page, pageSize);
        return instorageTrxMapper.selectInstorageTrx(dto);
    }
}

这样我们就可以拿到返回xml数据,下面我们要解析xml,把xml转为一个给bean。思路是:xml--list<map<>>--list<bean>

package SF.xxfnd.contants;

import SF.xxinv.dto.InstorageTrx;
import org.dom4j.*;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class XmlToList {
   private static Logger logger = LoggerFactory.getLogger(XmlToList.class);

   public static List<Object> Transform(String reportdata, String roots, Object object) throws Exception {
       List<Map<String, Object>> list = new ArrayList();
       Document doc = DocumentHelper.parseText(reportdata);
       Element root = doc.getRootElement();
       list = parse(root, list);
       return getBeans(list, InstorageTrx.class);
   }

   public static List<Map<String, Object>> parse(Element ele, List<Map<String, Object>> list) {
       List el = ele.elements();
       //遍历每个子元素
       Map<String, Object> map = new HashMap();
       boolean isAdd = true;
       for (Object e : el) {
           Element element = (Element) e;
           //如果该元素的内容不是只包含字符串
           if (!element.isTextOnly()) {
               parse(element, list);
           }//递归
           else {
               if ((!element.getQName().getName().equals("P_DATE_FROM")) && ((!element.getQName().getName().equals("P_DATE_TO")))) {
                  // map.put(toHump(element.getQName().getName()), element.getText());
                   map.put(element.getQName().getName(), element.getText());
                   isAdd = true;
               } else {
                   isAdd = false;
               }
           }
       }
       if (isAdd) {
           list.add(map);
       }
       return list;
   }

   //转换为实体类存放到List里面
   public static List<Object> getBeans(List<Map<String, Object>> list, Class<?> clazz) throws Exception {
       Object obj1 = null;
       List<Object> list1 = new ArrayList<Object>();
       for (int i = 0; i < list.size(); i++) {
           Map<String, Object> stringObjectMap = list.get(i);
           logger.info("getBeans_stringObjectMap:" + stringObjectMap);
           Object obj = null;
           try {
               obj = clazz.newInstance();
           } catch (InstantiationException e) {
               e.printStackTrace();
           } catch (IllegalAccessException e) {
               e.printStackTrace();
           }
           obj1 = mapToInstorageTrx(stringObjectMap, clazz);
           list1.add(obj1);
       }
       return list1;
   }
   //将map转为dto
   public static InstorageTrx mapToInstorageTrx(Map<String, Object> map, Class<?> beanClass) throws Exception {
       InstorageTrx instorageTrx = new InstorageTrx();
       instorageTrx.setOtherCost((map.get("OTHER_COST").equals("")) ? null : Double.parseDouble(String.valueOf(map.get("OTHER_COST"))));
       instorageTrx.setExpressNo((String) map.get("EXPRESS_NO"));
       instorageTrx.setWlCompany((String) map.get("WL_COMPANY"));
       instorageTrx.setInstorageRemark((String) map.get("INSTORAGE_REMARK"));
       instorageTrx.setFreight((map.get("FREIGHT").equals("")) ? null : Double.parseDouble(String.valueOf(map.get("FREIGHT"))));
       instorageTrx.setProcureCost((map.get("PROCURE_COST").equals("")) ? null : Double.parseDouble(String.valueOf(map.get("PROCURE_COST"))));
       instorageTrx.setInstorageReason((String) map.get("INSTORAGE_REASON"));
       instorageTrx.setInstorageNo((String) map.get("INSTORAGE_NO"));
       instorageTrx.setProductitemNo((String) map.get("PRODUCTITEM_NO"));
       instorageTrx.setFreightAvgway((String) map.get("FREIGHT_AVGWAY"));
       instorageTrx.setInstorageNum((map.get("INSTORAGE_NUM").equals("")) ? null : Long.parseLong(String.valueOf(map.get("INSTORAGE_NUM"))));
       instorageTrx.setInstorageTime((map.get("INSTORAGE_TIME").equals("")) ? null : stringToDate((String) map.get("INSTORAGE_TIME")));
       instorageTrx.setExpireTime((map.get("EXPIRATION_DATE").equals("")) ? null : stringToDate((String) map.get("EXPIRATION_DATE")));
       instorageTrx.setPactTotalamount((map.get("PACT_TOTALAMOUNT").equals("")) ? null : Double.parseDouble(String.valueOf(map.get("PACT_TOTALAMOUNT"))));
       instorageTrx.setOutPactno((String) map.get("OUT_PACTNO"));
       instorageTrx.setCost((map.get("COST").equals("")) ? null : Double.parseDouble(String.valueOf(map.get("COST"))));
       instorageTrx.setOrganizationName((String) map.get("ORGANIZATION_NAME"));
       instorageTrx.setListSource((String) map.get("LIST_SOURCE"));
       instorageTrx.setDeliveryNo((String) map.get("DELIVERY_NO"));
       instorageTrx.setBatch((String) map.get("BATCH"));
       instorageTrx.setSupplierNo((String) map.get("SUPPLIER_NO"));
       instorageTrx.setSourceNo((String) map.get("SOURCE_NO"));
       instorageTrx.setImportSign((String) map.get("IMPORT_SIGN"));
       instorageTrx.setInstorageType((String) map.get("INSTORAGE_TYPE"));
       instorageTrx.setBarCode((String) map.get("BAR_CODE"));
       instorageTrx.setItemCost((map.get("ITEM_COST").equals("")) ? null : Double.parseDouble(String.valueOf(map.get("ITEM_COST"))));
       instorageTrx.setLocationNo((String) map.get("LOCATION_NO"));
       instorageTrx.setStorageNo((String) map.get("STORAGE_NO"));
       instorageTrx.setPayerFreight((String) map.get("PAYER_FREIGHT"));
       instorageTrx.setIsconfirm((String) map.get("ISCONFIRM"));
       instorageTrx.setItemInstorageNo((String) map.get("ITEM_INSTORAGE_NO"));
       instorageTrx.setItemStorageNo((String) map.get("ITEM_STORAGE_NO"));

       return instorageTrx;
   }

   //字符串转日期
   public static Date stringToDate(String s) throws Exception {
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       Date date = sdf.parse(s);
       return date;
   }
}

备注:报文:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pub="http://xmlns.oracle.com/oxp/service/PublicReportService">
      <soapenv:Header/>
   <soapenv:Body>
      <pub:runReport>
         <pub:reportRequest>
            <pub:attributeLocale>en-US</pub:attributeLocale>
            <pub:attributeTemplate>Default</pub:attributeTemplate>
               <pub:parameterNameValues>
                  <pub:item>
                   <pub:name>p_date_from</pub:name>
                      <pub:dataType>STRING</pub:dataType>                    
                     <pub:values>
                        <pub:item>2017-12-25 00:00:00</pub:item>
                     </pub:values>
                  </pub:item>
                       <pub:item>
                     <pub:name>p_date_to</pub:name>
                      <pub:dataType>STRING</pub:dataType>                     
                     <pub:values>
                        <pub:item>2017-12-30 00:00:00</pub:item>
                     </pub:values>
                  </pub:item>
               </pub:parameterNameValues>
                    <pub:reportAbsolutePath>/Custom/External Web Service Interface/Inventory Transaction/Inventory Transaction Report.xdo</pub:reportAbsolutePath>
                    </pub:reportRequest>
         <pub:userID>xxxxx</pub:userID>
         <pub:password>xxxxx</pub:password>
      </pub:runReport>
   </soapenv:Body>
</soapenv:Envelope>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容