ソースを参照

凯和设备单

lazhaoqian 3 年 前
コミット
56efead872

+ 18 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/shipping/controller/KHTWarehousebillsController.java

@@ -28,6 +28,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.*;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.bind.annotation.*;
@@ -268,7 +269,10 @@ public class KHTWarehousebillsController extends BaseController
     }
 
     @PostMapping("/pickUpEDI")
-    public AjaxResult pickUpEDI (TWarehouseBills tWarehouseBills) {
+    public AjaxResult pickUpEDI (@RequestBody TWarehouseBills tWarehouseBills) {
+        if (tWarehouseBills.getfId() == null){
+            throw new SecurityException("请选择替换的订单");
+        }
         return tWarehousebillsService.ruoYiVersionOrderListNew(tWarehouseBills);
     }
 
@@ -464,4 +468,17 @@ public class KHTWarehousebillsController extends BaseController
                 tWarehousebillsfeesCr,tWarehousebillsfeesDr,loginUser,billsType);
 
     }
+    /**
+     * 凯和设备交接单新增、修改(押箱)接口
+     * @param tWarehouseBills
+     * @return
+     */
+    @PostMapping("/receipt")
+    public AjaxResult receipt (@RequestBody TWarehouseBills tWarehouseBills) {
+        if (CollectionUtils.isEmpty(tWarehouseBills.getOrderList())){
+            throw new RuntimeException("请选择要提交设备交接单的订单");
+        }
+        LoginUser loginUser = SpringUtils.getBean(TokenService.class).getLoginUser(ServletUtils.getRequest());
+        return tWarehousebillsService.receipt(tWarehouseBills,loginUser);
+    }
 }

+ 244 - 0
ruoyi-shipping/src/main/java/com/ruoyi/shipping/domain/JoabBoxVo.java

@@ -0,0 +1,244 @@
+package com.ruoyi.shipping.domain;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 船代设备交接单新增、修改(押箱)参数实体
+ * Y:必填、N:非必填
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class JoabBoxVo {
+
+
+    /**
+     *箱号
+     */
+    private String containerNo;
+    /**
+     *提单号
+     */
+    private String billOfLadingNo;
+    /**
+     *设备交接单编号,各自船代系统中设备交
+     * 接单的编号
+     */
+    private String eirId;
+    /**
+     *内外贸,N-内贸,W-外贸
+     */
+    private String tradeFlag;
+    /**
+     *中文船名
+     */
+    private String vesselNameCn;
+    /**
+     *英文船名
+     */
+    private String vesselNameEn;
+    /**
+     *船名代码,码头统一分配的3位代码(一般情
+     * 况),
+     */
+    private String vesselNameCode;
+    /**
+     *IMO号,外贸须填写,内贸可以不填
+     */
+    private String imo;
+    /**
+     *进口航次
+     */
+    private String voyageNumber;
+    /**
+     *箱型(例如GP)
+     */
+    private String containerType;
+    /**
+     *尺寸,加规则校验,限制2位数字
+     */
+    private String containerSize;
+    /**
+     *箱属公司代码(船代上传的原始箱属公司
+     * 码),请各船代以附件《箱属代码》为准进行
+     * 转换。
+     */
+    private String containerUser;
+    /**
+     *进场目的,简单描述,比如返空、退租
+     */
+    private String arriveAim;
+    /**
+     *进场状态,E-空箱,F-重箱,
+     * 默认为E
+     */
+    private String arriveState;
+    /**
+     *到港时间,精确到秒,用于计算免费箱使
+     * 期的起始时间
+     */
+    private String arriveTime;
+    /**
+     *押箱状态,0-未押箱,1-已押箱,默认已
+     * 押箱
+     */
+    private String contState;
+    /**
+     *EMF,0-无,1-有
+     */
+    private String emf;
+    /**
+     *船公司备注
+     */
+    private String shippingNote;
+    /**
+     * 船公司特殊要求
+     */
+    private String remark;
+    /**
+     *押箱企业全称(船公司、船代、场站押箱点
+     * 在云港通注册时填写的准确全称)
+     */
+    private String contEnterprise;
+    /**
+     *押箱企业社会统一编码(船公司、船代、场
+     * 站押箱点在云港通注册时填写的社会统一
+     * 编码)
+     */
+    private String contEnterpriseNo;
+    /**
+     *押箱时间,精确到秒
+     */
+    private String contTime;
+    /**
+     *押箱操作人姓名
+     */
+    private String contPerson;
+    /**
+     *用箱企业全称(货代企业在云港通注册时
+     * 填写的准确全称)
+     */
+    private String useEnterprise;
+    /**
+     *用箱企业社会统一编码(货代企业在云港
+     * 通注册时填写的社会统一编码)
+     */
+    private String useEnterpriseNo;
+    /**
+     *经办人姓名(货代企业经办人)
+     */
+    private String usePerson;
+    /**
+     *免费箱使期(天数),描述性文字,比如5天
+     */
+    private String freeTimePeriod;
+    /**
+     *免费箱使期到期日期,精确到日,比如
+     * 2018-03-06
+     */
+    private String freeTime;
+    /**
+     *提箱地点,提箱码头名称
+     */
+    private String placeOfDelivery;
+    /**
+     *提箱码头代码(QQCT、QQCTU、QQCTN)
+     */
+    private String placeOfDeliveryCode;
+    /**
+     *装货港,港口名称
+     */
+    private String loadingPort;
+    /**
+     *卸货港,港口名称
+     */
+    private String dischargePort;
+    /**
+     *卸货厂家
+     */
+    private String dischargeFactory;
+    /**
+     *铅封号
+     */
+    private String sealNo;
+    /**
+     *返空场站名称(填写云港通平台统一发放的
+     * 场站代码表中返空分站名称)
+     */
+    private String placeOfReturn;
+    /**
+     *返空场站代码(填写云港通平台统一发放的
+     * 场站代码表中五位返空分站代码,如果是
+     * 退租业务,请务必选择退租场站代码,平
+     * 台为每个场站都分配了一个退租场站代码)
+     */
+    private String placeOfReturnCode;
+    /**
+     *是否异地还箱场站,0-否,1-是,默认为
+     * 否
+     */
+    private String foreignReturnContFlag;
+    /**
+     *异地还箱场站名称
+     */
+    private String foreignReturnStation;
+    /**
+     *验证码(4位数字),有需要的船公司、船
+     * 代或者场站押箱点,可以在上传信息时同
+     * 时生成验证码,货主货代去结算中心办理
+     * 提单手续时,需要提供此验证码
+     */
+    private String shippingValidateCode;
+    /**
+     *出港状态出场的状态,E-空箱,F-满箱,默
+     * 认为F,司机提箱出闸的状态
+     */
+
+    private String contExitState;
+    /**
+     *出港目的出场目的,简单描述,默认为拆
+     * 箱,比如拆箱、装箱、重箱装船、空箱装
+     * 船、检查、修理、堆存、清洗等,司机提
+     * 箱出闸的状态
+     */
+
+    private String contExitAim;
+    /**
+     *出港检查记录出场检查记录,简单描述集
+     * 装箱出港时的检查情况,比如正常、异常、
+     * 是否有割伤、是否有破洞等等
+     */
+    private String contExitRecord;
+    /**
+     *打印企业全称(船公司、船代、场站押箱点
+     * 在云港通注册时填写的准确全称)
+     * 注:生成电子设备交接单的企业
+     */
+    private String printEnterprise;
+    /**
+     *打印企业社会统一编码(船公司、船代、场
+     * 站押箱点在云港通注册时填写的社会统一
+     * 编码)
+     */
+    private String printEnterpriseNo;
+    /**
+     *打印操作员姓名
+     * 注:生成电子设备交接单企业的操作员姓
+     * 名
+     */
+    private String printPerson;
+    /**
+     *船代应急标记,0-否,1-是
+     * 取消船代应急,该字段可传,也可不传,
+     * 如果不传,会将该字段置为0
+     */
+    private String shippingEmergFlag;
+    /**
+     *上传时间,打印操作员点击上传调用接口
+     * 的系统时间,精确到秒
+     */
+    private String uploadTime;
+}

+ 8 - 0
ruoyi-shipping/src/main/java/com/ruoyi/shipping/mapper/TWarehousebillsCntritemsMapper.java

@@ -3,6 +3,7 @@ package com.ruoyi.shipping.mapper;
 import java.util.List;
 import java.util.Map;
 
+import com.ruoyi.shipping.domain.JoabBoxVo;
 import com.ruoyi.shipping.domain.TWarehousebillsCntritems;
 import org.apache.ibatis.annotations.Param;
 
@@ -98,4 +99,11 @@ public interface TWarehousebillsCntritemsMapper
      */
     public int deleteTWarehousebillsCntritemOlder(@Param("fPid") Long fPid,
                                                   @Param("fCntrno") String fCntrno);
+
+    /**
+     * 凯和设备交接单新增、修改(押箱)接口
+     * @param fPids
+     * @return
+     */
+    List<JoabBoxVo> receipt(@Param("fPids") List<Long> fPids);
 }

+ 39 - 0
ruoyi-shipping/src/main/resources/mapper/shipping/TWarehousebillsCntritemsMapper.xml

@@ -245,5 +245,44 @@ FROM
     <delete id="deleteTWarehousebillsCntritemOlder" parameterType="object">
         delete from t_warehousebills_cntritems where f_pid = #{fPid} and f_cntrno = #{fCntrno}
     </delete>
+    <select id="receipt" resultType="com.ruoyi.shipping.domain.JoabBoxVo">
+        SELECT
+	cn.f_cntrno AS containerNo,
+	tw.f_mblno AS billOfLadingNo,
+	'N' AS tradeFlag,
+	tv.f_name AS vesselNameCn,
+	tv.f_ename AS vesselNameEn,
+	ty.f_no AS voyageNumber,
+	LEFT ( tc.f_no, 2 ) AS containerSize,
+	RIGHT ( tc.f_no, 2 ) AS containerType,
+	'kh' AS containerUser,
+    CASE WHEN ty.f_ATA IS NOT NULL THEN ty.f_ATA ELSE NOW()
+    END AS arriveTime,
+	'1' AS contState,
+	'青岛凯和志诚物流有限公司' AS contEnterprise,
+	'91370202MA3UG1T04A' AS contEnterpriseNo,
+    CASE WHEN ty.f_ATD IS NOT NULL THEN ty.f_ATD ELSE NOW()
+    END AS contTime,
+	'青岛凯和志诚物流有限公司' AS useEnterprise,
+	'91370202MA3UG1T04A' AS useEnterpriseNo,
+	'QQCT' AS placeOfDeliveryCode,
+	'大港' AS placeOfReturn,
+	'DGX' AS placeOfReturnCode,
+	'青岛凯和志诚物流有限公司' AS printEnterprise,
+	'91370202MA3UG1T04A' AS printEnterpriseNo,
+	NOW() AS uploadTime
+FROM
+	t_warehousebills_cntritems cn
+	LEFT JOIN t_warehousebills_cntr cr ON cn.f_pid = cr.f_pid
+	LEFT JOIN t_warehousebills tw ON cn.f_pid = tw.f_id
+	LEFT JOIN t_vessel tv ON tw.f_vslid = tv.f_id
+	LEFT JOIN t_voyage ty ON tw.f_voyid = ty.f_id
+	LEFT JOIN t_cntr tc ON cr.f_cntrid = tc.f_id
+	LEFT JOIN t_cntrno tn ON cn.f_cntrno = tn.f_no
+        where cn.f_pid in
+        <foreach item="fPid" collection="fPids" open="(" separator="," close=")">
+            #{fPid}
+        </foreach>
+    </select>
     
 </mapper>

+ 7 - 0
ruoyi-warehouse/src/main/java/com/ruoyi/warehouseBusiness/service/ITWarehouseBillsService.java

@@ -879,4 +879,11 @@ public interface ITWarehouseBillsService {
      */
     AjaxResult turnVoyage(TWarehouseBills tWarehouseBills,LoginUser loginUser);
 
+    /**
+     * 凯和设备交接单新增、修改(押箱)接口
+     * @param tWarehouseBills
+     * @return
+     */
+    AjaxResult receipt(TWarehouseBills tWarehouseBills,LoginUser loginUser);
+
 }

+ 199 - 0
ruoyi-warehouse/src/main/java/com/ruoyi/warehouseBusiness/service/impl/TWarehouseBillsServiceImpl.java

@@ -75,6 +75,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.http.*;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -88,6 +89,10 @@ import java.io.*;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.math.RoundingMode;
+import java.net.URLEncoder;
+import java.security.KeyFactory;
+import java.security.PrivateKey;
+import java.security.spec.PKCS8EncodedKeySpec;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -231,6 +236,10 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
 
     private static final Logger log = LoggerFactory.getLogger(AddressUtils.class);
 
+    /**
+     * 签名算法
+     */
+    public static final String SIGN_ALGORITHMS = "SHA1WithRSA";
 
     /**
      * 查询详情主表
@@ -9220,5 +9229,195 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
         return AjaxResult.success("转航次成功");
     }
 
+    /**
+     * 凯和设备交接单新增、修改(押箱)接口
+     *
+     * @param tWarehouseBills
+     * @return
+     */
+    @Override
+    public AjaxResult receipt(TWarehouseBills tWarehouseBills,LoginUser loginUser) {
+        List<JoabBoxVo> receipt = tWarehousebillsCntritemsMapper.receipt(tWarehouseBills.getOrderList());
+        if (CollectionUtils.isEmpty(receipt)) {
+            throw new SecurityException("未找到设备交接单信息");
+        }else {
+            receipt.stream().forEach(item ->{
+                item.setContPerson(loginUser.getUsername());//押箱操作人姓名
+                item.setPrintPerson(loginUser.getUsername());//打印操作员姓名
+            });
+        }
+        String json = JSONObject.toJSONString(receipt);
+        // 请求路径 (测试)
+        String postUrl = "https://api.qingdao-port.net/container/web/eir/eir/Shipping/insertEir.do";
+        // 请求路径 (正式)
+        //String postUrl = "https://api.qingdao-port.net/container/web/wlds_eir/edo/shipagent/insertEir.do";
+        Map<String, String> map = new HashMap<>();
+        map.put("customerCode", "A00001");
+        map.put("data", json);
+        //获取数字签名所需的数据
+        String formatUrlMap = TWarehouseBillsServiceImpl.formatUrlMap(map, false, false);
+        //获取数字签名
+        String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKkgGJtjBAHHXylZ7SjHiTRf4uU/R8uzEnx4YJgAdMMEcBMAgsdXpkMjuVPeMzksHpWTfpdhnf307l2lE4NgZ2txUJZivAQDP9MquH4jQDym0zPLjXGPYykxO0FqQdIYcjXM9doygz5GcXtTGQDz+6Btz4XWBQC18mOsygaxa6qpAgMBAAECgYA58z17QNpGocIBsUaKCpUA1ToxwxUevyU+cSDn9IANsp+UY0BsfaQCrWL7Uc/Lb0qrhfaCeHhiZGKow7+D7KyCm/DynU7WcW0Z0JLlG2nwQBT/Opwg2WDF7wHnlf0Y5QmArZ8ioabagKWBTyJr358xCC3NNZ8AYQB5ToDdYXOO4QJBAPKieA0v0pUii/3lnPDs83IxMEDy9rAW5OsPzt/De5Rk8k3TwN9kJcrv6toVcU3OsZWqkLy9CvBmn7X05otlp0sCQQCycQfT2Ad5kLN06OKs0Y6WEQNFtW+XgSu+ X7is6feklUUOmAS0UwhYfClFoB5Ddija5MgwZeWJtWr2zsnYrLlbAkBDsSglJa5uhRDhaOn8HV9eAHMh66b/QaPkIKjqrLMRl4gyRl2M9XfFwmGXLlxKBNxukQOIZIVkxHzSWtznDxk5AkARfE3+Dk89NFbBgAimUqqcPfKKJCtZN0koEI0yNIMV16K6uV7MpM5OjWwl7HjKt4ttV7neND337pUatkzFNLe9AkEA7EzVn6WL45D4gaDwp6sRGTOMuyC9GyE1U4Vi 4eRLBpTGdPJTJYz3Pgg4Pr0Sp+1x7bxOaQ/V1XyiL3AMxKfWnw==";
+        String sign = TWarehouseBillsServiceImpl.sign(formatUrlMap, privateKey, "UTF-8");
+        // 请求参数
+        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+        params.add("customerCode", "A00001");
+        params.add("data", json);
+        params.add("sign", sign);
+        TResponseVo responseVo = sendPostRequest(postUrl, params);
+        if (!responseVo.isSuccess()) {
+            throw new WarehouseException(responseVo.getMessage().get("msg"));
+        }else {
+            return AjaxResult.success(responseVo.getMessage().get("msg"));
+        }
+    }
+
+    /**
+     * RSA 签名
+     *
+     * @param content    待签名数据
+     * @param privateKey 商户私钥
+     * @param encode     字符集编码
+     * @return 签名值
+     */
+    public static String sign(String content, String privateKey, String encode) {
+        try {
+            byte[] decode = Base64.getMimeDecoder().decode(privateKey);
+            PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.getMimeDecoder().decode(privateKey));
+            KeyFactory keyf = KeyFactory.getInstance("RSA");
+            PrivateKey priKey = keyf.generatePrivate(priPKCS8);
+            java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
+            signature.initSign(priKey);
+            signature.update(content.getBytes(encode));
+            byte[] signed = signature.sign();
+            return Base64.getEncoder().encodeToString(signed);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
 
+    /**
+     * 方法用途: 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序),并且生成 url 参数串
+     *
+     * @param paraMap    要排序的 Map 对象
+     * @param urlEncode  是否需要 URLENCODE
+     * @param keyToLower 是否需要将 Key 转换为全小写 true:key 转化成小写,false:不转化
+     * @return
+     */
+    public static String formatUrlMap(Map<String, String> paraMap, boolean urlEncode, boolean keyToLower) {
+        String buff = "";
+        Map<String, String> tmpMap = paraMap;
+        try {
+            List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>(tmpMap.entrySet());
+            // 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)
+            Collections.sort(infoIds, new Comparator<Map.Entry<String, String>>() {
+                @Override
+                public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
+                    return (o1.getKey()).toString().compareTo(o2.getKey());
+                }
+            });
+            // 构造 URL 键值对的格式
+            StringBuilder buf = new StringBuilder();
+            for (Map.Entry<String, String> item : infoIds) {
+                if (StringUtils.isNotBlank(item.getKey())) {
+                    String key = item.getKey();
+                    String val = item.getValue();
+                    if (urlEncode) {
+                        val = URLEncoder.encode(val, "utf-8");
+                    }
+                    if (keyToLower) {
+                        buf.append(key.toLowerCase() + "=" + val);
+                    } else {
+                        buf.append(key + "=" + val);
+                    }
+                    buf.append("&");
+                }
+            }
+            buff = buf.toString();
+            if (buff.isEmpty() == false) {
+                buff = buff.substring(0, buff.length() - 1);
+            }
+        } catch (Exception e) {
+            return null;
+        }
+        return buff;
+    }
+    //测试设备单新增 接口
+    public static void main(String[] args) {
+        List<JoabBoxVo> list = new ArrayList<>();
+
+        JoabBoxVo joabBoxVo = new JoabBoxVo();
+        joabBoxVo.setContainerNo("TEMU2945451");//箱号 必填
+        joabBoxVo.setBillOfLadingNo("AEL0725208K");//提单号 必填
+        joabBoxVo.setEirId("123456");//设备交接单编号 不必填
+        joabBoxVo.setTradeFlag("W"); // 内外贸,N-内贸,W-外贸 必填
+        joabBoxVo.setVesselNameCn("长江号 6");//中文船名 必填
+        joabBoxVo.setVesselNameEn("MAERSK ABERDEEN");//英文船名 必填
+        joabBoxVo.setVesselNameCode("WTYHKL");// 船名代码,码头统一分配的3位代码(一般情况) 不必填
+        //joabBoxVo.setImo("");//IMO号,外贸须填写,内贸可以不填
+        joabBoxVo.setVoyageNumber("802B");//进口航次 必填
+        joabBoxVo.setContainerType("GP");//箱型(例如GP) 必填
+        joabBoxVo.setContainerSize("20");//尺寸,加规则校验,限制2位数字 必填
+        joabBoxVo.setContainerUser("TSL"); //箱属公司代码(船代上传的原始箱属公司码),请各船代以附件《箱属代码》为准进行转换 必填
+        joabBoxVo.setArriveAim("进场"); //进场目的,简单描述,比如返空、退租 不必填
+        joabBoxVo.setArriveState("E");//进场状态,E-空箱,F-重箱,默认为E 不必填
+        joabBoxVo.setArriveTime("2018-03-06 14:08:08");//到港时间,精确到秒,用于计算免费箱使期的起始时间 必填
+        joabBoxVo.setContState("0");// 押箱状态,0-未押箱,1-已押箱,默认已押箱 必填
+        joabBoxVo.setEmf("0");// EMF,0-无,1-有 不必填
+        joabBoxVo.setShippingNote("无"); // 船公司备注 不必填
+        joabBoxVo.setRemark("无要求"); // 船公司特殊要求 不必填
+        joabBoxVo.setContEnterprise("青岛押箱有限公司测");//押箱企业全称(船公司、船代、场站押箱点在云港通注册时填写的准确全称) 必填
+        joabBoxVo.setContEnterpriseNo("56565"); //押箱企业社会统一编码(船公司、船代、场站押箱点在云港通注册时填写的社会统一编码) 必填
+        joabBoxVo.setContTime("2018-03-09 06:08:08");//押箱时间,精确到秒 必填
+        joabBoxVo.setContPerson("张三测");//押箱操作人姓名 必填
+        joabBoxVo.setUseEnterprise("青岛用箱企业公司测");//用箱企业全称(货代企业在云港通注册时填写的准确全称)必填
+        joabBoxVo.setUseEnterpriseNo("91370213MA3RE74912");//用箱企业社会统一编码(货代企业在云港通注册时填写的社会统一编码) 必填
+        joabBoxVo.setUsePerson("武安国测");//经办人姓名(货代企业经办人) 不必填
+        joabBoxVo.setFreeTimePeriod("26 天");//免费箱使期(天数),描述性文字,比如5天 不必填
+        joabBoxVo.setFreeTime("2018-03-31 14:08:08");//免费箱使期到期日期,精确到日,比如2018-03-06 不必填
+        joabBoxVo.setPlaceOfDelivery("青岛港码头");//提箱地点,提箱码头名称 不必填
+        joabBoxVo.setPlaceOfDeliveryCode("2333");//提箱码头代码(QQCT、QQCTU、QQCTN) 必填
+        joabBoxVo.setLoadingPort("连云港");// 装货港,港口名称 不必填
+        joabBoxVo.setDischargePort("天津港");// 卸货港,港口名称 不必填
+        joabBoxVo.setDischargeFactory("青岛港");// 卸货厂家 不必填
+        joabBoxVo.setSealNo("QF9981");//铅封号  不必填
+        joabBoxVo.setPlaceOfReturn("东港总站");//必填 返空场站名称(填写云港通平台统一发放的场站代码表中返空分站名称)
+        joabBoxVo.setPlaceOfReturnCode("DGGZZ"); // 必填 返空场站代码(填写云港通平台统一发放的场站代码表中五位返空分站代码,如果是退租业务,请务必选择退租场站代码,平台为每个场站都分配了一个退租场站代码)
+        joabBoxVo.setForeignReturnContFlag("0");//不必填 是否异地还箱场站,0-否,1-是,默认为否
+        joabBoxVo.setForeignReturnStation("异地场站");//不必填 异地还箱场站名称
+        joabBoxVo.setShippingValidateCode("WERr");// 不必填 验证码(4位数字),有需要的船公司、船代或者场站押箱点,可以在上传信息时同时生成验证码,货主货代去结算中心办理提单手续时,需要提供此验证码
+        joabBoxVo.setContExitState("E");// 不必填 出港状态出场的状态,E-空箱,F-满箱,默认为F,司机提箱出闸的状态
+        joabBoxVo.setContExitRecord("12");// 不必填 出港检查记录出场检查记录,简单描述集装箱出港时的检查情况,比如正常、异常、是否有割伤、是否有破洞等等
+        joabBoxVo.setPrintEnterprise("4");//)  必填  打印企业全称(船公司、船代、场站押箱点在云港通注册时填写的准确全称)注:生成电子设备交接单的企业
+        joabBoxVo.setPrintEnterpriseNo("4");// 必填 打印企业社会统一编码(船公司、船代、场站押箱点在云港通注册时填写的社会统一编码)
+        joabBoxVo.setPrintPerson("小明测");// 必填 打印操作员姓名注:生成电子设备交接单企业的操作员姓名
+        joabBoxVo.setShippingEmergFlag("0");// 不必填 船代应急标记,0-否,1-是取消船代应急,该字段可传,也可不传,如果不传,会将该字段置为0
+        joabBoxVo.setUploadTime("2018-03-12 13:08:08"); // 必填  上传时间,打印操作员点击上传调用接口的系统时间,精确到秒
+        list.add(joabBoxVo);
+        String json = JSONObject.toJSONString(list);
+        // 请求路径 (测试)
+        String postUrl = "https://api.qingdao-port.net/container/web/eir/eir/Shipping/insertEir.do";
+        // 请求路径 (正式)
+        //String postUrl = "https://api.qingdao-port.net/container/web/wlds_eir/edo/shipagent/insertEir.do";
+
+        Map<String, String> map = new HashMap<>();
+        map.put("customerCode", "A00001");
+        map.put("data", json);
+        //获取数字签名所需的数据
+        String formatUrlMap = TWarehouseBillsServiceImpl.formatUrlMap(map, false, false);
+        //获取数字签名
+        String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKkgGJtjBAHHXylZ7SjHiTRf4uU/R8uzEnx4YJgAdMMEcBMAgsdXpkMjuVPeMzksHpWTfpdhnf307l2lE4NgZ2txUJZivAQDP9MquH4jQDym0zPLjXGPYykxO0FqQdIYcjXM9doygz5GcXtTGQDz+6Btz4XWBQC18mOsygaxa6qpAgMBAAECgYA58z17QNpGocIBsUaKCpUA1ToxwxUevyU+cSDn9IANsp+UY0BsfaQCrWL7Uc/Lb0qrhfaCeHhiZGKow7+D7KyCm/DynU7WcW0Z0JLlG2nwQBT/Opwg2WDF7wHnlf0Y5QmArZ8ioabagKWBTyJr358xCC3NNZ8AYQB5ToDdYXOO4QJBAPKieA0v0pUii/3lnPDs83IxMEDy9rAW5OsPzt/De5Rk8k3TwN9kJcrv6toVcU3OsZWqkLy9CvBmn7X05otlp0sCQQCycQfT2Ad5kLN06OKs0Y6WEQNFtW+XgSu+ X7is6feklUUOmAS0UwhYfClFoB5Ddija5MgwZeWJtWr2zsnYrLlbAkBDsSglJa5uhRDhaOn8HV9eAHMh66b/QaPkIKjqrLMRl4gyRl2M9XfFwmGXLlxKBNxukQOIZIVkxHzSWtznDxk5AkARfE3+Dk89NFbBgAimUqqcPfKKJCtZN0koEI0yNIMV16K6uV7MpM5OjWwl7HjKt4ttV7neND337pUatkzFNLe9AkEA7EzVn6WL45D4gaDwp6sRGTOMuyC9GyE1U4Vi 4eRLBpTGdPJTJYz3Pgg4Pr0Sp+1x7bxOaQ/V1XyiL3AMxKfWnw==";
+        String sign = TWarehouseBillsServiceImpl.sign(formatUrlMap, privateKey, "UTF-8");
+        // 请求参数
+        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+        params.add("customerCode", "A00001");
+        params.add("data", json);
+        params.add("sign", sign);
+        TResponseVo responseVo = sendPostRequest(postUrl, params);
+        System.err.println(responseVo);
+        if (!responseVo.isSuccess()) {
+            throw new WarehouseException(responseVo.getMessage().get("msg"));
+        }
+    }
 }